Github Actions là một công cụ giúp tự động hóa các công việc trong quá trình phát triển phần mềm. Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng Github Actions để tự động deploy ứng dụng Laravel.

Cách thức hoạt động

Khi 1 event xảy ra ở repository như là tạo 1 pull request hoặc push code lên 1 branch nào đó, sẽ kích hoạt workflow đã được tạo sẵn. Mỗi workflow sẽ chứa 1 hoặc nhiều job, các job có thể được chạy tuần tự hoặc song song với nhau. Mỗi job sẽ chạy bên trong máy ảo runner hoặc bên trong 1 container, và có 1 hoặc nhiều step trong mỗi job để run script hoặc action.

Tạo script để thực hiện deploy

Bước đầu tiên chúng ta sẽ phải làm là tạo script chứa các command cần thiết để thực hiện deploy và chạy ứng dụng.

Ở thư mục root của ứng dụng, chúng ta sẽ thêm thư mục .scripts

Bên trong thư mục .scripts, thêm file deploy.sh với nội dung bên dưới:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
set -e

echo "Deployment started ..."

# Chuyển về chế độ maintenance
(php artisan down) || true

# Pull code mới nhất về từ branch master
git pull origin master

# Cài đặt thư viện
composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader

# Xoá cache
php artisan clear-compiled

# Tạo lại cache
php artisan optimize

# Biên dịch npm assets
npm run prod

# Thực hiện migrate Database
php artisan migrate --force

# Thoát chế độ maintenance
php artisan up

echo "Deployment finished!"

Tạo workflow

Github action workflow là nơi chứa các hướng dẫn cũng như các bước cụ thể để chạy các jobs.

Bạn cần tạo một file deploy.yml trong thư mục .github/workflows trong repository của bạn. Trong file này, bạn cần định nghĩa các công việc cần thực hiện để deploy ứng dụng Laravel.

Ví dụ, đoạn code sau đây sẽ định nghĩa một công việc để deploy ứng dụng Laravel khi có sự thay đổi code ở nhánh master

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
name: Deploy

# Trigger workflow khi có sự kiện push hoặc tạo pull request trên branch master
on:
push:
branches:
- master
pull_request:
branches:
- master

# Xác thực với server thông qua ssh
# và run script để thực hiện deploy
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Deploy to server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
port: ${{ secrets.PORT }}
key: ${{ secrets.SSHKEY }}
script: "cd /var/www/html && ./.scripts/deploy.sh"

Cụ thể, khi code ở branch master có sự thay đổi sẽ trigger workflow hoạt động, login vào server bằng SSH, thực hiện các lệnh được mô tả trong deploy.sh mà chúng ta đã tạo ở bước trước.

Cài đặt SSH key

Giờ là lúc chúng ta tạo kết nối giữa server của bạn và Github.

Đầu tiên chúng ta cần tạo ssh key pair trên server bằng câu lệnh sau:

1
$ ssh-keygen -t rsa -b 4096 -C "youremail@example.com"

Câu lệnh trên sẽ tạo ra 2 keys, 1 public key và 1 private key, chúng được lưu ở thư mục .ssh.

Tiếp đến bạn cần thêm private key trên vào ssh-agent:

1
2
$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_rsa

Cuối cùng, thêm public key vào file authorized_keys ở trên server.

1
Cuối cùng, thêm public key vào file authorized_keys ở trên server.

Copy ssh-key lên tài khoản github

Ở trong file deploy.yml chúng ta có sử dụng các key: HOST, PORT, KEY, USERNAME.

Giờ là lúc chúng ta định nghĩa các key này trên github để có thể kết nối được đến server.

1) Login vào tài khoản Github và mở mục Settings của repository

2) Click vào mục Secrets and variables từ sidebar menu

3) Click button New repository secret

Chúng ta thêm các key dưới đây:

HOST: địa chỉ IP của server

PORT: ssh port, mặc định là 22

SSHKEY: là private key chúng ta đã tạo ở bước trên

USERNAME: tên user dùng để login vào server

4) Bước cuối cùng để server có thể fetch code từ github về, chúng ta cần thêm public key đã tạo vào tài khoản github.

a. Nếu bạn có nhiều repositories thì bạn có thể thêm public key ở account level: Settings → SSH and GPG keys

b. Còn nếu bạn muốn chỉ định để truy cập repository nhất định thì bạn có thể thêm public key ở mục Deploy keys trong Settings

Thêm permission cho deploy.sh

Chúng ta cần cấp quyền excecution như dưới:

1
sudo chmod +x ./REPOSITORY/.scripts/deploy.sh

Các bước chuẩn bị đã xong, chúng ta hãy thử commit và push code vào branch master sẽ thấy điều thần kỳ xảy ra. Chúng ta cũng có thể thêm các workflow khác cho việc testing, tạo môi trường staging…

Tham khảo:
1) https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions
2) https://dev.to/kenean50/automate-your-laravel-app-deployment-with-github-actions-2g7j