Chuyển đến nội dung chính

Triển khai dự án Laravel với Github Actions CI/CD hiệu quả và đơn giản nhất

Nếu bạn đã từng triển khai laravel hoặc các framework tương tự lên trên server (hosting) thì có khác nhiều cách làm. Các thủ công nhất là zip toàn bộ source sau đó upload lên và unzip ra hoặc sử dụng ftp để upload nếu server, ... Quá trình rất mất nhiều công sức và rất thủ công làm lãng phí khá nhiều thời gian chỉ để chờ ngồi xem file được up lên sau đó nếu có file nào được edit hoặc tìm đúng file đó up lên,... Đấy là chưa kể update thêm package thì khá rắc rối.

Các chuyên gia công nghệ  lại nghĩ ra một giải pháp CI/CD ( CI (Continuous Integration) và CD (Continuous Delivery) - tích hợp thường xuyên ) giúp cho quá trình deploy test, dev, production một cách nhanh chóng và tự động hoàn toàn. Bạn dev chỉ cần code xong thấy ok push lên git. Các công cụ CI/CD tự động kiểm tra thấy có push mới là tự động chạy build code sau đó copy vào đúng thư mục cần run một cách hoàn chỉnh nhanh chóng. Trên thị trường có khá nhiều bên phát triển các giải pháp như này trong đó có Gitlab, Circle, Github Action,.. 

Trong bài này mình sẽ đề cập triển khai với Github Actions một nền tảng rất hay của Github được tích hợp sẵn và sử dụng free với thời gian khá ổn với những team, project nhỏ thông tin chi tiết ở đây https://github.com/features/actions bạn có thể tìm hiểu rõ hơn. 



Giới thiệu qua Github là một nền tảng lưu trữ quản lý phiên bản nổi tiếng nhất nhì trong giới công nghệ mà bất cứ lập trình viên nào cũng không còn lạ lẫm. Nó được Microsoft mua lại và tích hợp thêm  nhiều món rất thứ hay ho trong đó có Github Actions,...

Với bản tài khoản free bạn được "2,000 minutes/month" run server actions một tháng thì bạn có khoảng trung bình là 66.66 phút triển khai trong một ngày và nếu mỗi lần chạy tốn khoảng 2 phút thì tổng bạn có khoảng 33 lần. Với dự án không thay đổi quá nhiều hoặc cần live test fix liên tục thì khá là dư giả để triển khai.

Điều kiện cần 1 tài khoản Github và 1 server deploy ( cloud/vps/... ) miễn là là có quyền ssh để truy cập vào upload file source code. Trong đó server đã được cài đầy đủ web service đủ để chạy được source web của bạn. Hoặc bạn có thể sử dụng những share hosting controller để deploy server một cách nhanh gọn nhất.

Chú ý quá trình cài đặt này chỉ giúp copy source từ github deploy tự động lên server của bạn chứ không hỗ trợ bạn cài nginx,php, mysql cho bạn. Do vậy bạn phải cài đầy đủ mấy phần trên đảm bảo chạy được source của bạn trước khi bắt đầu.

Hướng dẫn sử dụng Git Actions từng bước như sau:

Vào trong github của dự án của bạn.

B1. Khởi tạo actions


Github sẽ gợi ý sẵn cho bạn một template để sử dụng bạn chỉ cần commit vào dự án của các bạn sau đó pull về để custom lại nữa là xong


sau khi pull về nó sẽ nằm ở: ".github/workflows/". Trong đó file yml kịch bản bạn muốn chạy.

B2: sửa script deploy.

Template sau khi được mình custom về và edit lại như sau bạn có thể tham khảo.

name: Laravel Deploy Github Action
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
Deploy-Project:
runs-on: ubuntu-latest
steps:
- name: Get the latest code
uses: actions/checkout@master
- uses: actions/setup-node@master
- name: Installing project dependencies
run: npm install
- name: Building the project
run: npm run production
- name: Install Dependencies
run: composer install --optimize-autoloader --no-dev
- name: Generate key
run: php artisan key:generate
- name: Directory Permissions
run: chmod -R 777 storage bootstrap/cache
// upload file to server
- name: copy files
uses: appleboy/scp-action@master
with:
username: ${{ secrets.SSH_USERNAME }}
host: ${{ secrets.SSH_HOST }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
overwrite: true
source: "./*"
target: /var/www/html/


Diễn giản như sau.

on:
push:
branches: [ main ]
pull_request:
branches: [ main ]

Nó sẽ lắng nghe sự kiện khi có một push hoặc pull từ branches "main" thì Actions sẽ được chạy.

runs-on: ubuntu-latest
steps:
- name: Get the latest code
uses: actions/checkout@master
- uses: actions/setup-node@master
- name: Installing project dependencies
run: npm install
- name: Building the project
run: npm run production
- name: Install Dependencies
run: composer install --optimize-autoloader --no-dev
- name: Generate key
run: php artisan key:generate
- name: Directory Permissions
run: chmod -R 777 storage bootstrap/cache

Cloud của Github sẽ pull project sau đó install nodejs để build ui (nếu cần) và composer install các package cần phải có trong dự án. 

Tiếp theo tạp ra application key, chmod lại quyền ghi các thư mục. 

// upload file to server
- name: copy files
uses: appleboy/scp-action@master
with:
username: ${{ secrets.SSH_USERNAME }}
host: ${{ secrets.SSH_HOST }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
overwrite: true
source: "./*"
target: /var/www/html/

Bước tiếp theo sử dụng "appleboy/scp-action" ( đây là 1 package có tính năng hỗ trợ upload file từ github action -> server của bạn thông qua giao thức scp một cách tự động ) để copy toàn bộ source được pull vừa xong. 

=> target: /var/www/html/ : đây là folder sẽ up source của dự án.

Mô tả cấu hình chi tiết của "appleboy/scp-action" bạn có thể đọc thêm tại https://github.com/appleboy/scp-action

Ở đây để login vào ssh bạn có thể sử dụng user + password hoặc user + private key để login ssh trên server

Đây là hướng dẫn để cấu hình login ssh 

Chu y: Private key cua server deplop duoc tao nhu sau:
  1. SSH_PRIVATE_KEY. If you don’t have this you can run "ssh-keygen -t rsa" in your server terminal to generate a new key, then run the command "cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys" to allow connection to the private key. then you "cat ~/.ssh/id_rsa.pub" =>copy private key and add to serects key of github.

  2. SSH_HOST. This is the IP address of the server.

  3. SSH_USERNAME. This is the server username, in my case it’s root . If you don’t know your username you can use the whoami command on your server to check.

Các serect key này bạn có thể lưu trữ nó ở trong serect key của Github và được gọi ra bằng lệnh 



"${{ secrets.SSH_USERNAME }}" trong đó "SSH_USERNAME" chính là tên của serect key mình đã đặt trước đó

Sau khi hoàn tất tất cả các phần trên việc còn lại của bạn chỉ là git push nên đúng brancher "main" là hệ thống sẽ tự động chạy quá trình tự động build source laravel của bạn sau đó upload ghi đè lên source cũ.

Github actions còn rất nhiều script temple cho các framework, ngôn ngữ khác và có khả năng custom được rất mạnh. Bạn lên thử sử dụng nó sẽ thay đổi hoàn toàn thói quen của bạn.

Chúc bạn thành công với hướng dẫn ngắn trên.

Nhận xét

Bài đăng phổ biến từ blog này

16 điểm khác nhau khi khởi tạo dự án bằng công cụ Expo và React Native CLI

Dưới đây là 16 điểm khác nhau giữa việc khởi tạo dự án bằng Expo và React Native CLI: Cấu trúc dự án: Expo sử dụng cấu trúc dự án khác với React Native CLI. Expo sử dụng một số thư mục đặc biệt để quản lý các file cấu hình của dự án. Môi trường phát triển: Expo có thể cho phép bạn phát triển ứng dụng của mình trực tiếp trên điện thoại thông qua ứng dụng Expo Client. Trong khi đó, khi sử dụng React Native CLI, bạn cần sử dụng máy ảo để kiểm tra ứng dụng của mình trên các thiết bị di động khác nhau. Quản lý dependencies: Expo sử dụng một số package và thư viện để quản lý dependencies của ứng dụng của bạn. Với React Native CLI, bạn cần tự cài đặt các package và thư viện cần thiết để phát triển ứng dụng. Tích hợp các tính năng của Expo: Expo cung cấp một số tính năng mà bạn có thể sử dụng trong ứng dụng của mình, bao gồm Push Notifications, Permissions, và Analytics. Với React Native CLI, bạn cần tự tìm và tích hợp các tính năng này vào ứng dụng của mình. Quản lý mã nguồn: Expo cung cấp mộ

Fix lỗi Vmmem ăn ram nhiều - vmmem high memory wsl2

 Dùng docker và sử dụng core linux của win thường rất hay bị lỗi vmmem ăn ram nhiều. Cách khắc phục cấu hình lại limit ram được sử dụng của core WSL đỡ bị ăn nhiều như sau Tạo file  %UserProfile%\.wslconfig [wsl2] kernel=<path> # An absolute Windows path to a custom Linux kernel. memory=<size> # How much memory to assign to the WSL2 VM. processors=<number> # How many processors to assign to the WSL2 VM. swap=<size> # How much swap space to add to the WSL2 VM. 0 for no swap file. swapFile=<path> # An absolute Windows path to the swap vhd. localhostForwarding=<bool> # Boolean specifying if ports bound to wildcard or localhost in the WSL2 VM should be connectable from the host via localhost:port (default true). # <path> entries must be absolute Windows paths with escaped backslashes, for example C:\\Users\\Ben\\kernel # <size> entries must be size followed by unit, for example 8GB o