Tìm hiểu về Deployer - Công cụ deploy hữu ích cho các dự án PHP
Bài đăng này đã không được cập nhật trong 6 năm
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
FRAMGIA\pham.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
FRAMGIA\pham.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
FRAMGIA\pham.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
All rights reserved