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

giới thiệu về appwrite một nền tảng tuyệt vời cho BAAS

Appwrite là một nền tảng Backend-as-a-Service (BaaS) mã nguồn mở, cung cấp các giải pháp cho việc phát triển ứng dụng di động và web. Appwrite cung cấp các tính năng như quản lý người dùng, lưu trữ dữ liệu, xác thực và bảo mật, phân tích thống kê và nhiều hơn nữa. Appwrite hỗ trợ nhiều ngôn ngữ lập trình, cho phép người phát triển sử dụng các ngôn ngữ phổ biến như JavaScript, Node.js, Flutter và nhiều ngôn ngữ khác. Ngoài ra, Appwrite còn có tính năng Webhooks, cho phép kết nối ứng dụng với các dịch vụ khác như Slack, Discord và nhiều dịch vụ khác. Appwrite cung cấp các giao diện lập trình ứng dụng (API) cho phép các nhà phát triển xây dựng ứng dụng di động và web linh hoạt và dễ dàng hơn. Appwrite cũng cung cấp các SDK cho nhiều ngôn ngữ lập trình để giúp các nhà phát triển tích hợp Appwrite vào các ứng dụng của mình một cách nhanh chóng và dễ dàng. Với sự phát triển của Appwrite, người dùng có thể dễ dàng tạo, quản lý và triển khai các ứng dụng di động và web một cách dễ dàng và hiệ

Giới thiệu về strapi

Strapi là một CMS mã nguồn mở và đa nền tảng được phát triển bằng Node.js, giúp cho việc xây dựng các ứng dụng web hoặc mobile trở nên dễ dàng hơn. Strapi được thiết kế để cung cấp cho các nhà phát triển một hệ thống quản lý dữ liệu linh hoạt và dễ dàng cấu hình, đồng thời hỗ trợ nhiều loại cơ sở dữ liệu khác nhau như MongoDB, MySQL, PostgreSQL, SQLite và SQL Server. Với Strapi, người dùng có thể tạo các API linh hoạt cho các ứng dụng của mình, bao gồm các chức năng như đăng ký, đăng nhập, quản lý nội dung và quản lý người dùng. Strapi cũng cung cấp cho người dùng các tính năng như xác thực dựa trên JWT, quản lý phiên làm việc, quản lý phân quyền và phân quyền tùy chỉnh. Một trong những ưu điểm của Strapi là tính linh hoạt và dễ dàng mở rộng. Với Strapi, người dùng có thể tùy chỉnh các API của mình bằng cách sử dụng các plugin, middleware hoặc cách thức xây dựng theo yêu cầu của mình. Ngoài ra, Strapi cũng có một cộng đồng đông đảo và hỗ trợ tốt, giúp cho việc sử dụng và phát triển Str