12/08/2018, 17:11

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

0