Bài viết này không đề cập đến khái niệm CI/CD. Chỉ đơn giản các step setup để deploy dự án Laravel lên VPS với Github Actions.
Bước 1: Setup file .env cho production
Copy file .env.example để chuẩn bị cho môi trường production. Ex: file .env.prod
Các giá trị secret như password database không để trong file. Sẽ config add giá trị secret vào file .env khi chạy job trên workflows
Cài đặt các giá trị secret trên github secrets trong repository. Cài đặt ở phần ** Settings > secrets and variables > actions > Mục secrets**
Các giá trị cần cài đặt secret có thể như: APP_KEY, DB_USERNAME, DB_PASSWORD,...
Bước 2: Tạo file config jobs github actions
Trong source, tạo file config đuôi yml cho github actions với đường dẫn ./githubs/workflows/deploy.yml
Ở đây chỉ tạo file build.yml để config đơn giản cho việc deploy, không đề cập đến các setup workflows khác. Các khái niệm khác sẽ ở bài viết khác.
Nội dung file config:
name: Deploy on: push: branches: [main] pull_request: branches: [main]
jobs: build: runs-on: ubuntu-latest steps: - uses: shivammathur/setup-php@v2 with: php-version: '8.3' - uses: actions/checkout@v3 - name: Copy .env run: | cp .env.prod .env sed -i "s|{APP_KEY}|$APP_KEY|g" .env sed -i "s|{DB_USERNAME}|$DB_USERNAME|g" .env sed -i "s|{DB_PASSWORD}|$DB_PASSWORD|g" .env env: APP_KEY: ${{ secrets.APP_KEY }} DB_USERNAME: ${{ secrets.DB_USERNAME }} DB_PASSWORD: ${{ secrets.DB_PASSWORD }} - name: Install composer Dependencies run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist - uses: actions/upload-artifact@v4 with: name: build-artifact include-hidden-files: true path: | ${{ github.workspace }} !${{ github.workspace }}/.env deploy: runs-on: ubuntu-latest needs: build steps: - uses: actions/download-artifact@v4 with: name: build-artifact path: ${{ github.workspace }} - name: Copy .env run: | cp .env.prod .env sed -i "s|{APP_KEY}|$APP_KEY|g" .env sed -i "s|{DB_USERNAME}|$DB_USERNAME|g" .env sed -i "s|{DB_PASSWORD}|$DB_PASSWORD|g" .env env: APP_KEY: ${{ secrets.APP_KEY }} DB_USERNAME: ${{ secrets.DB_USERNAME }} DB_PASSWORD: ${{ secrets.DB_PASSWORD }} - name: Set up SSH private key env: SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} run: | mkdir -p ~/.ssh touch ~/.ssh/id_rsa echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa - name: Configure SSH run: | touch ~/.ssh/config echo -e "Host *\n\tStrictHostKeyChecking no\n" > ~/.ssh/config touch ~/.ssh/known_hosts echo "$SSH_HOST $SSH_KEY" > ~/.ssh/known_hosts env: SSH_HOST: ${{ secrets.SSH_HOST }} SSH_KEY: ${{ secrets.SSH_KEY }} - name: Copy build to VPS if: ${{ success() }} run: | rsync -avz --progress --delete -e "ssh -i ~/.ssh/id_rsa" ${{ github.workspace }} ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_HOST }}:/var/www/html/it-backend/ - name: Deploy to Server if: ${{ success() }} uses: appleboy/ssh-action@master with: host: ${{ secrets.SSH_HOST }} port: 22 username: ${{ secrets.SSH_USERNAME }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | rm -rf /var/www/html/it-backend/src mv /var/www/html/it-backend/it-backend /var/www/html/it-backend/src cd /var/www/html/it-backend/src php8.3 artisan migrate --force php8.3 artisan optimize:clear php8.3 artisan optimize chown -R www-data:www-data /var/www/html/it-backend/src
Nội dung trên nhìn thì chắc đa số ai cũng hiểu. Xin phép không giải thích thêm..
Push lên nhánh main và check thành quả ở mục Tab Actions trên repository, nếu có lỗi thì fix..