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ề 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\[email protected]:~/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\[email protected]:~/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\[email protected]:~/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', '[email protected]: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
    Nguồn: Viblo



Có vẻ như bạn đã mất kết nối tới LaptrinhX, vui lòng đợi một lúc để chúng tôi thử kết nối lại.