Trong bài trước, mình đã tìm hiểu về Rocketeer, cũng là một deployment tool. Và trong bài này, mình sẽ tìm hiểu một deployment tool khác, là Deployer. Deployer có gì hay ho và khác gì so với Rocketeer? Chúng ta cùng tìm hiểu nhé
1. Deployer là gì?
Tương tự như Rocketeer, Deployer cũng là một deployment tool được viết bởi PHP
Một số tính năng nổi bật của Deployer là:
- Dễ học và dễ setup
- Sử dụng recipes cho các frameworks
- Thực thi đồng bộ không cần extenssion
- Rollback lại bản release trước nếu gặp sự cố khi deploy
- Xác thực với SSH
- Nói KHÔNG với downtime deployments
recipe là một file PHP định nghĩa các task cần thực hiện trong quá trình deploy. recipe có thể require và extend hoặc override các recipe khác.
Deployer có rất nhiều recipes có sẵn được contribute bởi cộng đồng. Bạn có thể dễ dàng cài đặt bằng cách sử dụng composer hay phar archive
Có vẻ như Deployer chỉ hỗ trợ các project PHP????
2. Cài đặt Deployer
$ curl -LO https://deployer.org/deployer.phar
$ mv deployer.phar /usr/local/bin/dep
$ chmod +x /usr/local/bin/dep
Sau khi cài đặt, tương tự như Rocketeer, chúng ta sẽ di chuyển đến thư mục dự án và thực thi lệnh:
$ dep init
Lệnh này sẽ tạo ra một file deploy.php
trong thư mục hiện tại. File này chính là 1 recipe chứa cấu hình và các task để triển khai trong quá trình deploy. Mặc định, tất cả các recipe đều extends từ các common recipe.
Đồng thời, giống như Rocketeer, bạn cũng có thể cài đặt Deployer bằng composer
$ composer require deployer/dist --dev
và chạy lệnh
$ php vendor/bin/dep
để init
Một dố lệnh căn bản với Deployer
$ dep // liệt kê danh sách các tasks
$ dep config:dump // lấy danh sách params có sẵn
$ dep config:current // Xem config hiện tại
$ dep <task_name> // Thực thi một task được gọi
$ dep deploy <stage> // Lệnh deploy hệ thống
3. set, get và run
Với Deployer, chúng ta sẽ sử dụng các hàm set
và get
để thao tác với params. Trong đó, params có thể là giá trị hoặc 1 function.
set('param', 'value');
set('current_path', function () {
return run('pwd');
});
task('deploy', function () {
$param = get('param');
});
Tiếp theo chúng ta có function run
để chạy các lệnh:
run('pwd');
Bạn có thể sử dụng hai cặp ngoặc nhọn {{ }}
hoặc sử dụng nối chuỗi và hàm get
đê bind các params vào command
run('cd {{release_path}} && command');
run('cd ' . get('release_path') . ' && command');
3. Params
Một số params mà chúng ta cần quan tâm khi cấu hình hệ thống gồm.
Params | Ý nghĩa |
---|---|
deploy_path | Định nghĩa đường dẫn tới thư mục được tạo ra trên server khi deploy dự án |
hostname | Tên máy chủ |
user | Username, mặc định là username account git của bạn. Hoặc bạn có thể setup như vậy |
release_path | Đường dẫn đầy đủ đến thư mục chứa bản release hiện tại |
previous_release | Đường dẫn tới bản release trước (nếu có) |
ssh_multiplexing | Nên set giá trị là true: set('ssh_multiplexing', true); |
default_stage | Nếu host của bạn có chứa nhiều stages, bạn cần định nghĩa stage mặc định được deploy khi không chỉ định stage |
keep_releases | Số lượng bản release cần lưu lại, mặc định là 5. Giá trị -1 , tương ứng với việc giữ lại toàn bộ các bản released |
repository | Git repository |
git_tty | Cho phép việc thực hiện lệnh git clone , mặc định là false . Bạn có thể set true bằng hàm: set('git_tty', true); |
branch | Nhánh được deploy |
shared_dirs | Thư mục chứa các dữ liệu bạn muốn cache lại sau khi deploy để theo dõi quá trình vận hành hệ thống. |
copy_dirs | Danh sách files cần copy giữa các bản release |
writable_dirs | Các thư mục cho phép ghi trên server |
writable_use_sudo | Lệnh ghi chỉ được thực hiện với sudo . Mặc định là false |
clear_paths | Danh sách đường dẫn cần xóa sau khi update |
clear_use_sudo | Yêu cầu sudo với clear_paths . mặc định là false |
cleanup_use_sudo | Yêu cầu sudo với task cleanup . mặc định là false |
use_relative_symlink | Có cho phép sử dụng relative symlinkhay không. Mặc định, deployer sẽ dò xem hệ thống có hỗ trợ các relative symlink hay không để cho phép sử dụng chúng. |
use_atomic_symlink | Tương tự use_relative_symlink . nhưng ở đây là atomic symlink |
composer_action | Mặc định là install |
composer_options | Danh sách options cho composer |
env | Danh sách biến môi trường |
4. Tasks
Như đã nói ở phần đầu, các repice sẽ định nghĩa các task (tác vụ), sau đó chúng ta có thể sử dụng dep để thực thi các tác vụ này.
Ví dụ, mình định nghĩa 1 task tên là test
:
desc('Test');
task('test', function () {
run(...);
});
Nội dung task có thể là một function, cũng có thể là một lệnh hoặc chuỗi các lệnh nối tiếp
task('build', 'npm build');
task('build', '
npm build;
npm run dev;
');
Ngoài ra bạn cũng thể định nghĩa một nhóm các lệnh con bằng cú pháp
task('deploy', [
'deploy:prepare',
'deploy:update_code',
'deploy:vendors',
'deploy:symlink',
'cleanup'
]);
sau đó, định nghĩa từng lệnh nhỏ này.
- before() và after(): chỉ định trước hoặc sau khi thực thi 1 tác vụ
// [Optional] if deploy fails automatically unlock.
after('deploy:failed', 'deploy:unlock');
// Migrate database before symlink new release.
before('deploy:symlink', 'artisan:migrate');
- once(): chỉ thực hiện task duy nhất 1 lần
task('do', ...)->once();
- OnStage(): chỉ thực thi trên stage được chỉ định
task('test', function () {
...
})->onStage('staging');
- onRoles(): thực thi lệnh với những luật đã được định nghĩa Đầu tiên, chúng ta cần tạo một role
$ dep deploy --roles db
Sau đó, định nghĩa role này và sử dụng nó
task('migrate', function () {
...
})->onRoles('db');
- onHost(): chỉ định host cụ thể
task('migrate', function () {
...
})->onHosts('db.domain.com');
- local(): Chỉ thực thi tác vụ chỉ một lần với máy cục bộ, độc lập với các host khác.
task('build', function () {
...
})->local();
5. Host
Việc định nghĩa host rất đơn giản, chúng ta sẽ chỉ cần viết một hàm host
là oke
host('domain.com')
->stage('production')
->roles('app')
->set('deploy_path', '~/app');
6. Demo deploy 1 Laravel project
Đầu tiên chúng ta cần init một Laravel Project
$ composer create-project --prefer-dist laravel/laravel deployer-test
Oke giờ thì init Deployer thôi nào
$ cd deployer-pj
$ dep init -t Laravel
Vậy là chúng ta đã có 1 project Laravel deployer-test
cùng 1 file deploy.php
.
Đầu tiên mình sẽ cấu hình Host:
// Hosts
host(<my_host>)
->user('deploy')
->stage('staging')
->set('deploy_path', '~/{{application}}')
->set('http_user', 'www-data')
->set('writable_mode', 'chmod')
->forwardAgent(false);
Tiếp theo là set các params:
// Project name
set('application', 'deploy-test');
// Project repository
set('repository', 'git@domain.com:HaiHaChan/deployer-test.git');
// [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', []);
Cuối cùng là định nghĩa một số tác vụ cần thiết:
// Tasks
task('build', function () {
run('cd {{release_path}} && composer install --dev');
run('cd {{release_path}} && php artisan migrate --force');
run('cd {{release_path}} && php artisan view:clear');
});
// [Optional] if deploy fails automatically unlock.
after('deploy:failed', 'deploy:unlock');
// Migrate database before symlink new release.
before('deploy:symlink', 'artisan:migrate');
Vậy là xong. Giờ thì cực kì đơn giản, chúng ta chỉ cần chạy lệnh deploy thôi
$ dep deploy staging
8. Kết luận
Về cơ bản thì mình thấy việc tìm hiểu và sử dụng Deployer cũng như Rocketeer tương đối đơn giản. Hai deployment tool này đều yêu cầu cấu hình các thông tin của project kha khá giống nhau. Bên rocketeer thì có vẻ rõ ràng hơn, vì rocketeer phân tách khá rõ các phần, comment hướng dẫn cũng rất đầy đủ. Tất nhiên, chúng ta hoàn toàn có thể tách file và include chúng trong deploy.php với Deployer. Thêm một điều hơi buồn nữa là Rocketeer đã 2 năm không được cộng đồng contribute. Nhưng mà điều này cũng không thể giúp mình đánh giá là deployment tool nào trong 2 bạn này là tốt hơn. Hiện tại thì mình thấy là tương đối giống nhau.
Hi vọng bài viết này có ích với mọi người. Cảm ơn và hẹn gặp lại các bạn ở các bài viết tiếp theo.
Tài liệu tham khảo: