Với việc hỗ trợ của các tool tự động thì việc thự hiện “Zero Downtime Deployment” không còn là vấn đề khó cho hầu hết các project web. Vấn đề hiện tại là chọn tool nào cho dự án của mình. Với Laravel, chúng ta có khá là nhiều lựa chọn được viết bằng PHP như:
- Rocketeer – http://rocketeer.autopergamene.eu/
- Envoy – https://laravel.com/docs/6.x/envoy
- Deployer – https://deployer.org/
Tuy nhiên trong bài này, mình sẽ nói về việc triển khai auto deploy project Laravel với capistrano – 1 gem của ruby.
1. Giới thiệu
Có khá là nhiều bài viết về Capistrano trên viblo nên mình chỉ giới thiệu sơ lược về Capistrano.
Capistrano là 1 tool được viết bằng ngôn ngữ Ruby cho phép việc tự động thực hiện một tập hợp các câu lệnh trên 1 hay 1 vài remote server bằng cách sử dụng SSH. Capistrano có thể chạy song song trên nhiều server cùng lúc, việc này giúp chúng ta giảm thiểu đáng kể thời gian deploy khi cần deploy lên nhiều server.
2. Triển khai
Mình đã triển khai và đẩy code lên laravel-capistrano, và trong bài viết này mình sẽ dựa vào code trên github trên.
Sau khi triển khai, cấu trúc thư mục của project sẽ tương tự như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token operator">=</span><span class="token keyword">begin</span> <span class="token constant">Deploy</span> directory structure<span class="token punctuation">:</span> <span class="token operator">/</span>var<span class="token operator">/</span>www<span class="token operator">/</span>test<span class="token operator">-</span>deploy ├── current <span class="token operator">-</span><span class="token operator">></span> <span class="token operator">/</span>var<span class="token operator">/</span>www<span class="token operator">/</span>test<span class="token operator">-</span>deploy<span class="token operator">/</span>releases<span class="token operator">/</span><span class="token number">20191216080141</span> ├── releases │ ├── <span class="token number">20191216075447</span> │ ├── <span class="token number">20191216075558</span> │ ├── <span class="token number">20191216075711</span> │ ├── <span class="token number">20191216075932</span> │ └── <span class="token number">20191216080141</span> ├── repo │ ├── <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> │ └── <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> ├── revisions<span class="token punctuation">.</span>log └── shared ├── <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> └── storage <span class="token operator">=</span><span class="token keyword">end</span> |
2.1. Cài đặt các thành phần cần thiết
- Bạn cần cài đặt ruby và gem capistrano trên máy đặt config của Capistrano
- Bạn cần chắc chắn máy này có thể ssh vào server mà bạn muốn deploy
- Bạn cần chắc chắn server phải có quyền truy cập vào git/svn/… chứa code cần deploy
- Cài đặt gem capistrano
1 2 | gem <span class="token function">install</span> capistrano |
- optional: nếu các bạn muốn thông báo lên slack thì các bạn cần cài đặt thêm gem
slackistrano
1 2 | gem <span class="token function">install</span> slackistrano |
2.2. Configure
Sau khi clone code trên github, chúng ta chỉ cần chỉnh sửa file config là có thể thực hiện deploy luôn.
1 2 3 4 | <span class="token function">cp</span> config/deploy.rb.example config/deploy.rb <span class="token function">cp</span> config/deploy/staging.rb.example config/deploy/staging.rb <span class="token function">cp</span> config/deploy/production.rb.example config/deploy/production.rb |
config/deploy.rb
Trong file này bạn cần cập nhật lại thông tin của các thành phần như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <span class="token comment"># Config application</span> set <span class="token symbol">:application</span><span class="token punctuation">,</span> <span class="token string">"test-deploy"</span> set <span class="token symbol">:repo_url</span><span class="token punctuation">,</span> <span class="token string">"<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d9beb0ad99beb0adb1acbbf7bab6b4">[email protected]</a>:YOUR_USER_NAME/REPOSITORY.git"</span> <span class="token comment"># Config for deploy path</span> set <span class="token symbol">:deploy_to</span><span class="token punctuation">,</span> <span class="token string">'/var/www/test-deploy'</span> set <span class="token symbol">:releases_dir</span><span class="token punctuation">,</span> <span class="token string">'/var/www/test-deploy/releases'</span> <span class="token comment"># Default env</span> set <span class="token symbol">:dotenv_file</span><span class="token punctuation">,</span> <span class="token string">'/PATH/TO/.env'</span> <span class="token comment"># Default value for keep_releases is 5</span> set <span class="token symbol">:keep_releases</span><span class="token punctuation">,</span> <span class="token number">5</span> <span class="token comment"># List of worker servers</span> set <span class="token symbol">:workers_servers</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token comment"># Slack configure</span> set <span class="token symbol">:slackistrano</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> klass<span class="token punctuation">:</span> <span class="token constant">Slackistrano</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">CustomMessaging</span><span class="token punctuation">,</span> channel<span class="token punctuation">:</span> <span class="token string">'#your-channel'</span><span class="token punctuation">,</span> webhook<span class="token punctuation">:</span> <span class="token string">'your-incoming-webhook-url'</span> <span class="token punctuation">}</span> |
Nếu dự án của bạn không dùng slack, bạn có thể comment đoạn code config của slack ở trên lại.
config/deploy/production.rb
1 2 3 4 5 6 7 8 9 10 11 | <span class="token comment"># server web detail</span> <span class="token comment"># You need to change ip and user for your server</span> server <span class="token string">'10.0.0.10'</span><span class="token punctuation">,</span> user<span class="token punctuation">:</span> <span class="token string">'deploy'</span><span class="token punctuation">,</span> roles<span class="token punctuation">:</span> <span class="token string">%w{web app laravel}</span> <span class="token comment"># Config ssh option</span> set <span class="token symbol">:ssh_options</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> keys<span class="token punctuation">:</span> <span class="token string">%w(LINK/TO/YOUR/private_key)</span><span class="token punctuation">,</span> forward_agent<span class="token punctuation">:</span> <span class="token keyword">false</span><span class="token punctuation">,</span> auth_methods<span class="token punctuation">:</span> <span class="token string">%w(publickey)</span> <span class="token punctuation">}</span> |
2.3. Deploy
Để deploy, các bạn có thể tham khảo cách sử dụng bên dưới
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token comment"># Deploy with default branch in config deploy.rb</span> cap staging deploy <span class="token comment"># Deploy with tag 1.0.1</span> cap staging deploy branch<span class="token operator">=</span>1.0.1 <span class="token comment"># Deploy with tag 1.0.2 and run Seeder_0_0_1 and Seeder_0_0_2</span> cap staging deploy branch<span class="token operator">=</span>1.0.2 seeders<span class="token operator">=</span>Seeder_0_0_1,Seeder_0_0_2 <span class="token comment"># Rollback deploy</span> cap staging rollback <span class="token comment"># Rollback deploy to specific release</span> cap staging rollback ROLLBACK_RELEASE<span class="token operator">=</span>20191001101213 |
2.4. Run single task
Ngoài việc thực hiện 1 tập hợp các task/câu lệnh như trên thì chúng ta có thể thực hiện từng câu lệnh riêng rẽ:
1 2 3 4 5 6 | <span class="token comment"># Rollback migrate</span> cap staging laravel:migrate_rollback <span class="token comment"># List all release (for rollback release above)</span> cap staging web:release_list |
2.5. Mở rộng
Code của mình ở trên chỉ đáp ứng được việc deploy một project laravel cơ bản. Nếu các bạn cần thêm các tác vụ đặc biệt khác, các bạn có thể viết thêm và đặt vào thư mục lib/capistrano/tasks
, nó sẽ tự động được include
trong quá trình chạy.
Kết
Như các bạn thấy, việc thực hiện deploy project laravel với capistrano khá là đơn giản. Chỉ cần vài config cơ bản là bạn có thể deploy ngay