Lời mở đầu
Xin chào các bạn. Lại là mình đây, như đã hứa hôm nay mình sẽ hướng dẫn các bạn cách để có thể auto deploy một project Laravel. Trong bài viết này mình sẽ sử dụng Deployer để auto deploy kết hợp với Github Actions để CI/CD. Bắt đầu thôi 👌
1. Cài đặt deployer trên máy local.
1.1 Deployer là gì?
Deployer là một công cụ triển khai mã nguồn mở miễn phí được viết bằng PHP. Bạn có thể dùng nó để deploy nhiều loại project lên Sever như : Laravel, Cakephp, Drupal, Magento... Hơn nữa Deployer cũng có rất nhiều tính năng như:
- Provisioning: Cung cấp máy chủ cho bạn.
- Zero downtime deployment: Deploy ứng dụng của bạn mà không có thời gian chết.
- Roolbacks: Khôi phục về phiên bản trước của bạn, nếu gặp sự cố.
Ngoài ra, deployer còn có một số tính năng như:
- Easy to use: Deployer rất dễ dàng sử dụng. Nó có cú pháp đơn giản và trực quan.
- Fast: Deployer rất nhanh. Nó sử dụng kết nối song song để triển khai ứng dụng của bạn.
- Secure: Nó sử dụng SSH để kết nối tới server của bạn nên rất an toàn.
- Support all major PHP frameworks: Deployer hỗ trợ tất cả các framework của PHP.
1.2 Cài đặt Deployer.
1.2.1 Cài đặt trong project
VIệc cài depoyer cũng khá đơn giản. Các bạn cài trong project của mình như sau:
composer require --dev deployer/deployer
Để khởi tạo deployer trong project
vendor/bin/dep init
1.2.2 Cài đặt ở local globaly
curl -LO https://deployer.org/deployer.phar
mv deployer.phar /usr/local/bin/dep
chmod +x /usr/local/bin/dep
Thay vì phải gõvendor/bin/dep
khá dài dòng mỗi khi muốn thao tác với deployer. Các bạn có thể tạo Alias ở .bashrc file
alias dep='vendor/bin/dep'
Mỗi khi các bạn muốn chạy deployer chỉ đơn giản như sau:
dep init
Màn hình sẽ hiển thị như sau:
Các bạn lựa chọn framework phù hợp với dự án của mình. Như dự án của mình dùng Laravel nên mình sẽ chọn số 1. Sau đó Deployer sẽ export ra một file cho chúng ta có tên làdeploy.php
. Trong file này sẽ chứa nhiều các hàm, biến, tham số, task mà chúng ta cần tìm hiểu. Để biết chi tiết hơn các bạn có thể xem ở docs của Deployer hoặc xem ở bài viết dưới đây. Mình thấy bạn này viết cũng khá đầy đủ.
2. Cho phép User ở local kết nối đến server.
Như ở bài viết trước mình có tạo 1 VPS trên Vultr. Để kết nối đến server
ssh your_user@your_ip
Có một vấn đề là khi ssh theo cách này thông thường chúng ta sẽ phải nhập password. Mình không chắc chắn mình có thể config password ở ssh hay Deployer hay không. Vì thế, để đơn giản mình sẽ hướng dẫn cách bạn cách cài đặt bỏ yêu cầu password khi ssh như sau.
- Đầu tiên chúng ta cần ssh vào user deploy
- Tiếp đến sửa public key ssh trong thư mục .ssh giống với public ssh key đã tạo lúc khởi tạo server trên local
- Truy cập
vi sshd_config
bỏ comment và sửa PasswordAuthentication thành no
vi /etc/ssh/sshd_config
Bỏ nhập password khi chạy lệnh với sudo
sudo visudo
Thêm vào cuối file
your_user ALL=(ALL) NOPASSWD:ALL
Ex deploy ALL=(ALL) NOPASSWD:ALL
2. CI/CD với githubs action
Hiện nay có rất nhiều công cụ giúp bạn có thể thực hiện CI/CD. Tuy nhiên ở trong bài viết này mình sẽ hướng dẫn các bạn thực hiện CI/CD trên github actions. Cùng tìm hiểu một cách chi tiết hơn github actions là gì?
2.1. Github actions là gì?
- Github actions là một nền tảng tích hợp liên tục và phân phối liên tục (CI/CD) cho phép bạn tự động hóa quy trình xây dựng, kiểm thử, và deploy. Bạn có thể tạo nhiều workflows để xây dựng, kiểm thử ở tất cả Pull request của Repository của bạn hoặc auto deploy khi merged.
- Github actions cung cấp các máy ảo Linux, Windows để chạy các workflows hoặc bạn có thể lưu trữ các trình tự chạy tự lưu trữ của riêng mình trong cơ sở dữ liệu hoặc hạ tầng cơ sở đám mây của riêng bạn
2.2.Config trong file github actions.
- Để thực hiện CI/CD trên github actions các bạn cần tạo một file với tên tùy chọn ở trong thư mục
.github/workflows
. Ở dự án của mình, mình để tên file là laravel.yml với nội dung như sau
name: Laravel
on: push: branches: ["dev"] pull_request: branches: [ "dev" ]
jobs: laravel-tests: runs-on: ubuntu-latest steps: - uses: shivammathur/setup-php@15c43e89cdef867065b0213be354c2841860869e with: php-version: '7.4' coverage: xdebug2 - uses: actions/checkout@v3 - name: Install Dependencies run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist - name: Excute test PHPCS run: vendor/bin/phpcs -n -p deploy-dev: name: Deploy Project to DEV Server runs-on: ubuntu-latest if: github.ref == 'refs/heads/dev' steps: - uses: actions/checkout@v1 - name: Setup PHP uses: shivammathur/setup-php@master with: php-version: 7.4 extension-csv: mbstring, bcmath - name: Composer install run: composer install -q --no-ansi --no-interaction --no-scripts --no-suggest --no-progress --prefer-dist - name: Setup Deployer uses: shimataro/ssh-key-action@v2 with: key: ${{ secrets.SSH_PRIVATE_KEY }} known_hosts: 'ust-a-placeholder-so-we-dont-get-errors' - name: Adding Known Hosts run: ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts - name: Deploy to DEV env: DOT_ENV: ${{ secrets.DOT_ENV_DEV}} run: vendor/bin/dep deploy dev -vvv
File này sẽ thực hiện CI/CD. Khi thực hiện Pull request sẽ thực hiện các công việc như cài đặt PHP, install composer, và check coding convetion bằng PHPCS. Khi Pull request được merge vào nhánh DEV thì sẽ thực hiện deploy lên Server. Một lưu ý là các bạn cần phải cài đặt một số biến trên Github để có thể kết nối đến Server của bạn. Các bạn cài đặt một số biến như sau ở phần Secrets/Actions.
.
3. Kết luận
Như vậy mình đã vừa hướng dẫn cho các bạn cách dùng CI/CD với một project Laravel. Hi vọng có thể ít nhiều giúp ích cho các bạn. Nếu có bất cứ thắc mắc hay góp ý đừng ngần ngại chi sẻ mình nha. Mình sẽ tiếp thu và phản hồi lại mọi người. Cám ơn vì đã đọc bài viết của mình.