Tìm hiểu về Deployer - Công cụ deploy hữu ích cho các dự án PHP
Deploy là một công đoạn không thể thiếu cho mỗi dự án PHP nói riêng và dự án IT nói chung. Nó gần giống với công đoạn cài đặt phần mềm chung chung, là bước triển khai dự án lên một môi trường (testing, development, staging hoặc production). Đảm bảo cho dự án chạy một cách trơn tru không gặp lỗi về ...
Deploy là một công đoạn không thể thiếu cho mỗi dự án PHP nói riêng và dự án IT nói chung. Nó gần giống với công đoạn cài đặt phần mềm chung chung, là bước triển khai dự án lên một môi trường (testing, development, staging hoặc production). Đảm bảo cho dự án chạy một cách trơn tru không gặp lỗi về môi trường cũng như thiếu các thư viện yêu cầu
Để đơn giản hóa quá trình triển khai dự án PHP, hôm nay tôi xin giới thiệu tới các bạn 1 tool deploy có tên là Deployer (https://deployer.org/). Deployer sẽ giúp cho người lập trình triển khai 1 dự án lên bất cứ môi trường nào một cách nhanh nhất, đơn giản nhất, tiện lợi nhất chỉ bằng một vài command đơn giản
I. Các tính năng của Deployer
1. Triển khai nhanh
Deployer được đóng gói với các tính năng tiết kiệm thời gian và tối ưu, tốt nhất cho hiệu suất và việc phát triển.
2. Module
Tạo cho các bạn các script tích hợp dựa trên những khối module có sẵn được gọi là “recipes”
3. Clean code
Deployer có source code rõ ràng, ngắn gọn súc tích và được kiểm thử rất cẩn thận kỹ lưỡng. Mã nguồn được theo dõi bởi nhiều công cụ quản lý chất lượng. Mỗi pull request cũng được check bới các test tool
4. Khả năng rollback
Nếu có bất cứ lỗi nào trong quá trình deploy, thì chúng ta vẫn có thể rollback về release trước đó một cách đơn giản
5. Các task có thể chạy đồng thời
Deployer có thể chạy nhiều tasks đồng thời mà không cần bất cứ một thư viện nào khác
6. Tính nhất quán
Deployer giữ sự nhất quán giữa các máy chủ, ngay cả trong chế độ song song! Nếu một tác vụ không thành công, các tác vụ tiếp theo sẽ không được thực hiện trên tất cả các máy chủ.
II. Download và cài đặt
Có 3 cách để download và cài đặt:
- Download file .phar
- Sử dụng composer
- Sử dụng composer với bản phân phối
1. Download file .phar
Để cài đặt Deployer qua file .phar, các bạn chỉ cần run những câu lệnh đơn giản sau:
curl -LO https://deployer.org/deployer.phar mv deployer.phar /usr/local/bin/dep chmod +x /usr/local/bin/dep
2. Sử dụng composer
Để cài đặt Deployer sử dụng composer, các bạn chỉ cần run command:
composer require deployer/deployer –dev
hoặc cho global
composer global require deployer/deployer
Sau đó để sử dụng được Deployer, các bạn gõ command sau:
php vendor/bin/dep
3. Sử dụng composer với bản phân phối
Tương tự như cách cài đặt với composer chúng ta dùng command:
composer require deployer/dist –dev
hoặc cho global
composer global require deployer/dist
Sau đó để sử dụng được Deployer, các bạn gõ command sau:
php vendor/bin/dep
Ngoài ra Deployer cũng hỗ chợ việc autocomplete cho bash/zsh/fish, bởi vậy bạn không cần phải nhớ tất cả các task và tùy biến:
dep autocomplete
III. Configuration
Sau khi cài đặt xong Deployer, việc đầu tiên chúng ta phải init cho project mà mình muốn. Chúng ta mở terminal trong project hiện tại
FRAMGIApham.duy.thanh@framgia0166-pc:~/code/blog$ dep init Welcome to the Deployer config generator This utility will walk you through creating a deploy.php file. It only covers the most common items, and tries to guess sensible defaults. Press ^C at any time to quit. Please select your project type [Common]: [0 ] Common [1 ] Laravel [2 ] Symfony [3 ] Yii [4 ] Yii2 Basic App [5 ] Yii2 Advanced App [6 ] Zend Framework [7 ] CakePHP [8 ] CodeIgniter [9 ] Drupal [10] TYPO3 > 1 Repository []: > Contribute to the Deployer Development In order to help development and improve Deployer features in, Deployer has a setting for collection of usage data. This function collects anonymous usage data and sends it to Deployer. The data is used in Deployer development to get reliable statistics on which features are used (or not used). The information is not traceable to any individual or organization. Participation is voluntary, and you can change your mind at any time. Anonymous usage data contains Deployer version, php version, os type, name of the command being executed and whether it was successful or not, exception class name, count of hosts and anonymized project hash. If you would like to allow us to gather this information and help us develop a better tool, please add the code below. set('allow_anonymous_stats', true); This function will not affect the performance of Deployer as the data is insignificant and transmitted in separate process. Do you confirm? (yes/no) [yes]: > yes Successfully created: /home/pham.duy.thanh/code/blog/deploy.php FRAMGIApham.duy.thanh@framgia0166-pc:~/code/blog$
Cậu lệnh trên sẽ giúp chúng ta tạo 1 file deploy.php và chứa tất cacr các cấu hình, tasks cho việc deploy
Dưới đây là nội dung của 1 file deploy.php đơn giản
<?php namespace Deployer; require 'recipe/laravel.php'; // Project name set('application', 'my_project'); // Project repository set('repository', '); // [Optional] Allocate tty for git clone. Default value is false. set('git_tty', true); // Shared files/dirs between deploys add('shared_files', []); add('shared_dirs', []); // Writable dirs by web server add('writable_dirs', []); // Hosts host('project.com') ->set('deploy_path', '~/{{application}}'); // Tasks task('build', function () { run('cd {{release_path}} && build'); }); // [Optional] if deploy fails automatically unlock. after('deploy:failed', 'deploy:unlock'); // Migrate database before symlink new release. before('deploy:symlink', 'artisan:migrate');
Để xem tất cả các command của deployer các bạn chỉ cần run dep hoặc dep list
FRAMGIApham.duy.thanh@framgia0166-pc:~/code/blog$ dep list Deployer 6.0.5 Usage: command [options] [arguments] Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question -f, --file[=FILE] Specify Deployer file --tag=TAG Tag to deploy --revision=REVISION Revision to deploy --branch=BRANCH Branch to deploy -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Available commands: autocomplete build cleanup Cleaning up old releases deploy Deploy your project help Displays help for a command init Initialize deployer in your project list Lists commands rollback Rollback to previous release run Run any arbitrary command on hosts self-update Updates deployer.phar to the latest version ssh Connect to host through ssh artisan artisan:cache:clear Execute artisan cache:clear artisan:config:cache Execute artisan config:cache artisan:db:seed Execute artisan db:seed artisan:down Enable maintenance mode artisan:migrate Execute artisan migrate artisan:migrate:fresh Execute artisan migrate:fresh artisan:migrate:rollback Execute artisan migrate:rollback artisan:migrate:status Execute artisan migrate:status artisan:optimize Execute artisan optimize artisan:queue:restart Execute artisan queue:restart artisan:route:cache Execute artisan route:cache artisan:storage:link Execute artisan storage:link artisan:up Disable maintenance mode artisan:view:clear Execute artisan view:clear config config:current Show current paths config:dump Print host configuration config:hosts Print all hosts deploy deploy:clear_paths Cleaning up files and/or directories deploy:copy_dirs Copy directories deploy:lock Lock deploy deploy:prepare Preparing host for deploy deploy:public_disk Make symlink for public disk deploy:release Prepare release. Clean up unfinished releases and prepare next release. deploy:shared Creating symlinks for shared files and dirs deploy:symlink Creating symlink to release deploy:unlock Unlock deploy deploy:update_code Update code deploy:vendors Installing vendors deploy:writable Make writable dirs
Định nghĩa 1 task rất đơn giản
task('test', function () { writeln('Hello world'); });
sau đó thử run task
dep test
Output sẽ là:
➤ Executing task test Hello world ✔ Ok
Bây giờ chúng ta sẽ đi đến cấu hình và tạo 1 số task cho deployer có thể chạy trên remote host.
host('domain.com') ->stage('production') ->set('deploy_path', '/var/www/domain.com');
Define một task mà sẽ output ra một pwd command từ remote host:
task('pwd', function () { $result = run('pwd'); writeln("Current dir: $result"); });
Run dep pwd và kết quả là:
➤ Executing task pwd Current dir: /var/www/domain.com ✔ Ok
Bây giờ đi đên chuẩn bị cho lần deploy đầu tiên. Các bạn cần phải config repository, shared_files …
set('repository', 'git@domain.com:username/repository.git'); set('shared_files', [...]);
Để chi tiết cho việc cấu hình các bạn có thể refer tới https://deployer.org/docs/configuration
Cuối cùng ta chỉ việc chạy lệnh dep deploy để deploy dự án của bạn lên remote host
Để có thể hiển thị nhiều output trong quá trình deploy các bạn chỉ cần thêm:
- -v cho output bình thường,
- -vv cho nhiều output hơn nữa
- -vvv cho chế độ debug.
Sau khi deploy thành công, Deployer sẽ tạo ra những thư mục trên host:
- releases chứa các bản release.
- shared chưa các files shared.
- current bản release hiện tại.
Deployer mặc định sẽ giữ lại 5 bản releases mới nhất, các bạn có thể tăng số bản releases nếu cần thiết:
set('keep_releases', 10);
Trong quá trình deploy mà có bất cứ một lỗi nào, bạn chỉ đơn giản sử dụng lệnh:
dep rollback
để có thể quay trở lại bản releases trước
Các bạn cũng có thể cấu hình để chạy một số task trước/sau những task khác rất đơn giản
task('reload:php-fpm', function () { run('sudo /usr/sbin/service php7-fpm reload'); }); after('deploy', 'reload:php-fpm');
Nếu bạn cần kết nối tớ remote host, Deployer cung cấp cho bạn một shortcut có thể access nhanh: dep ssh
IV. Kết luận
Như vậy tôi đã giới thiệu xong cho các bạn công cụ Deployer cho các dự án PHP. Tôi hy vọng Deployer sẽ giúp ích cho các bạn trong quá trình triển khai dự án một cách nhanh nhất, tiện lợi nhất