Hướng dẫn deploy bằng Rocketeer

9cae731d493bf4bffdd8bf84ffd7417a.jpg

Công việc deploy code trên server là một công việc khá nhàm chán và mệt mỏi. Bạn sẽ phải SSH vào server, update code mới, chạy migrate, composer install, gulp. Và đôi khi, quên một bước nào đó thì mọi thứ sẽ không hoạt động như ý muốn. Vì vậy việc sử dụng công cụ deploy tự động sẽ tiết kiệm rất nhiều công sức đồng thời giảm thiểu rủi ro gặp phải khi deploy.

Mình là một PHP developer và công cụ auto deployment yêu thích của mình là Rocketeer, một deployment tool xây dựng trên PHP, rất mạnh mẽ và dễ sử dụng.

Cài đặt Rocketeer

Cách cài đặt khá đơn giản, chúng ta sẽ chạy 3 lệnh sau:

$ wget http://rocketeer.autopergamene.eu/versions/rocketeer.phar
$ chmod +x rocketeer.phar
$ sudo mv rocketeer.phar /usr/local/bin/rocketeer

Bây giờ bạn chuyển đến thư mục dự án muốn deploy và chạy lệnh sau

$ rocketeer ignite

Rocketeer sẽ hỏi một số câu hỏi để cài đặt cơ bản. Mình sẽ hướng dẫn qua cho các bạn về những câu hỏi này.

Câu hỏi đầu tiên Rocketeer hỏi bạn là

No connections have been set, please create one: (production)

Đây là tên của kết nối mà bạn muốn đặt. Ví dụ: 'production' hoặc 'staging'. Rocketeer sử dụng chúng để định nghĩa cách kết nối vào server. Bạn có thể ấn Enter để dùng giá trị mặc định (trong trường hợp này là 'production')

Bây giờ bạn cần chỉ ra cách kết nối đến server này:

No host is set for [production/0], please provide one:

Bạn cần nhập tên miền hoặc địa chỉ IP đến server muốn deploy. Địa chỉ này sẽ được lưu vào trong kết nối mà bạn vừa tạo ở bước trước.

Tiếp theo chúng ta cần cung cấp thông tin đăng nhập cho server này.

No username is set for [production/0], please provide one:

Đây là username dùng để login vào remote server. Nếu bạn không muốn lưu lại trong file config của Rocketeer thì có thể ấn Enter để bỏ qua. Tuy nhiên, nếu không cung cấp username, sau này mỗi lần deploy Rocketeer sẽ hỏi lại bạn, và bạn có thể tiếp tục ấn Enter để bỏ qua.

No password or SSH key is set for [production/0], which would you use? (key) [key/password]

Đây là câu hỏi về phương thức bạn muốn login vào remote server, thông qua password hoặc SSH key. Bạn sẽ được hỏi tiếp về password bạn muốn dùng hoặc đường dẫn đến file SSH key. Tốt hơn hết, bạn không nên dùng password vì nó sẽ lưu vào trong file config, người khác có thể dễ dàng đọc được.

Cuối cùng Rocketeer sẽ hỏi về tên application bạn muốn deploy.

What is your application's name ?

Rocketeer sẽ tạo ra thư mục .rocketeer lưu trữ toàn bộ các thiết lập.

Config Rocketeer

Trước khi chúng ta deploy project, hãy xem qua những file config vừa được tạo. Thư mục .rocketeer sẽ chứa những file sau:

  • config.php
  • hooks.php
  • paths.php
  • remote.php
  • scm.php
  • stages.php
  • strategies.php

Bạn có thể thoải mái sửa những file này tuỳ theo mục đích deploy của mình. Tốt nhất, bạn nên xem qua chúng một lượt để xem chúng có những gì và cho phép mình làm những gì. Những file này đều được comment rất rõ ràng, vì vậy cũng không quá khó khăn để tìm hiểu.

config.php

Đây là file config chính. Hầu hết những thông tin bạn đã nhập ở bước trên sẽ xuất hiện tại đây. Tất cả những kết nối đến server đều được định nghĩa ở đây cùng với các lựa chọn theo ngữ cảnh (contextual options). Những lựa chọn theo ngữ cảnh dùng để thiết lập riêng cho một kết nối cụ thể hoặc stage.

hooks.php

File này định nghĩa những task sẽ được chạy trên server trướcsau khi bạn thực hiện nhiệm vụ deploy. Những task này bạn có thể định nghĩa bằng mảng những command chạy trên server.

Ví dụ, trong dự án Laravel của mình, sau mỗi lần deploy, mình cần migrate CSDL và chạy gulp để build CSS, JS. Mình có thể thiết lập như sau:

'after'  => [
    'deploy'  => ['php artisan migrate', 'gulp'],
    'update'  => ['php artisan migrate', 'gulp'],
],

paths.php

Rocketeer sẽ tự động tìm kiếm PHP và composer, tuy nhiên nếu bạn muốn tự định nghĩa đường dẫn cho những ứng dụng đó thì có thể thiết lập trong paths.php. Ví dụ đặt đường dẫn cho php:

'php' => '/usr/local/bin/php7.0',

remote.php

File này chứa những thiết lập cho remote server mà bạn muốn deploy. Ở đây có một số thiết lập quan trọng mà bạn cần phải lưu tâm trước khi thực hiện deploy. root_directory là đường dẫn trên server mà bạn muốn deploy vào đó. Bạn cần đặt đường dẫn tuyệt đối, bắt đầu bằng /, bằng không nó sẽ không thể chạy được.

'root_directory' => '/var/www/html/',

Mặc định thì app sẽ được deploy vào một thư mục có tên lấy từ application_name trong config.php. Tuy nhiên, bạn có thể thay đổi thành một tên thư mục khác bằng cách đặt app_directory

'app_directory' => 'example',

Nếu trang web của bạn có nội dung muốn giữ lại giữa mỗi lần release/deploy, bạn cần định nghĩa như sau:

'shared'         => [
    'storage/logs',
    'storage/framework/sessions',
    '.env',
],

Bên trên là ví dụ của mình với dự án Laravel. Bạn có thể đặt ở đây cả file hoặc thư mục bạn muốn giữ lại. Thường là những file do người dùng upload lên, hoặc file log.

Bạn cũng có thể đặt permission cho các file/folder có quyền ghi như sau:

'permissions' => [
    // The folders and files to set as web writable
    'files'    => [
        'database/production.sqlite',
        'storage',
        'public/uploads',
    ],
],

scm.php

Đây là nơi lưu thiết lập cho repository mà web của bạn sẽ được clone về. Rocketeer hỗ trợ cả Git và SVN. Nếu bạn muốn sử dụng nhiều kết nối và stages, bạn có thể sẽ muốn sử dụng thiết lập theo ngữ cảnh (contextual configurations). Mình sẽ nhắc đến sau về vấn đề này.

Theo mặc định, chúng ta sẽ deploy từ branch master, nếu bạn muốn thay bằng branch khác, ví dụ develop thì có thể config như sau:

// The branch to deploy
'branch' => 'master',

Thiết lập theo ngữ cảnh (Contextual options)

Những thiết lập được định nghĩa trong những file config được mặc định sử dụng khi deploy. Tuy nhiên, nếu bạn có nhiều server hoặc stages, có thể thiết lập cho mỗi server sẽ khác nhau chút ít. Vì thế mà contextual option đã được sinh ra để giải quyết vấn đề này.

Contextual options có thể được tìm thấy ở cuối file config.php. Những option này sẽ đè lên những thiết lập mặc định trong những file khác. Ví dụ, coi như dự án của chúng ta có 2 kết nối 'production' và 'staging'

'on' => [
    // Connections configuration
    'connections' => [
        'production' => [
            'scm' => [
                'branch' => 'master'
            ]
        ],
        'staging' => [
            'scm' => [
                'branch' => 'develop'
            ]
        ],
    ],
],

Những gì đang diễn ra ở đây là các thiết lập về branch trong file scm.php sẽ bị đè tuỳ theo kết nối đến 'production' hoặc 'staging'. Nếu nhánh master đã được định nghĩa trong scm.php như là nhánh mặc định, thì chúng ta không cần ghi đè nó cho kết nối 'production' nữa. Vì thế nó có thể được tinh giản như sau:

    'stages' => [
    ],
    // Connections configuration
    'connections' => [
        'staging' => [
            'scm' => [
                'branch' => 'dev'
            ]
        ],
    ],
],

Những contextual options được nhóm lại theo những kết nối và những thiết lập được đặt tên theo chính những thiết lập chúng ta đã đặt trong các file config bên trên. Ví dụ, bạn muốn thay đổi root_directory trong remote.php cho môi trường staging, bạn có thể viết như sau:

    'stages' => [
    ],
    // Connections configuration
    'connections' => [
        'staging' => [
            'remote' => [
                'root_directory' => '/var/www/html/staging'
            ],
            'scm' => [
                'branch' => 'dev'
            ]
        ],
    ],
],

Deploy

Khi mọi thứ đã được thiết lập, việc đầu tiên bạn cần làm là kiểm tra xem các thiết lập có đúng và có kết nối được web server không. Bạn chạy lệnh sau:

$ rocketeer check

Nếu mọi thứ đều ổn, bạn bắt đầu deploy ứng dụng của mình

$ rocketeer deploy

Khi Rocketeer deploy, nó sẽ tạo ra thự mục theo thiết lập app_directory trong root_directory. Sau đó clone repository vào trong thư mục release và tạo một symbolic link đến đây và đặt tên là current. Nếu project của bạn có file composer.lock, nó sẽ tự động chạy composer install để cài đặt các gói cần thiết.

Nếu có gì đó không đúng diễn ra, bạn có thể quay ngược lại release trước bằng lệnh:

$ rocketeer rollback

Nếu bạn muốn deploy vào kết nối staging, bạn có thể dùng flag --on:

$ rocketeer deploy --on="staging"

Nó đồng thời cũng được dùng để deploy đến nhiều connection khác nhau:

$ rocketeer deploy --on="production,staging"

Sau khi bạn deploy xong, bạn sẽ thấy cấu trúc thư mục trong app_directory sẽ như sau:

  • current -> /var/www/vhosts/app_name/releases/20151117201500/
  • releases/
  • shared/
  • state.json

Trong đó, current là symbolic link đến release hiện tại, release chứa tất cả những bản release của bạn mỗi lần deploy. Còn shared chứa những file được giữ lại sau mỗi lần release.

Kết luận

Rocketeer là một công cụ tuyệt vời giúp đơn giản hoá công việc deploy của bạn xuống chỉ còn 1 dòng lệnh. Tôi đã sử dụng cả Capistrano và Rocketeer, nhưng tôi thấy Rocketeer thực sự dễ dàng hơn.

Rất khó để có thể nói hết mọi thứ trong một bài viết. Nhưng tôi hi vọng đã mang lại cho các bạn một cái nhìn tổng quan và các bước để bắt đầu với Rocketeer. Tốt nhất các bạn hãy download nó, xem một lượt những file config và tận hưởng sức mạnh của auto deployment. Chúc vui vẻ.

Tham khảo

http://andy-carter.com/blog/getting-started-with-rocketeer-to-simplify-deployments