CI/CD Pipeline
7464

1 Mục Tiêu

  • Tự động hóa quá trình build, test, deploy thông qua CI/CD Pipeline.
  • Tích hợp GitHub Actions hoặc AWS CodePipeline để đảm bảo các bước triển khai được thực hiện tuần tự.
  • Hỗ trợ triển khai staging trước khi lên production.

2 Kiến Trúc CI/CD Pipeline

Luồng triển khai CI/CD

  1. Source Control (GitHub hoặc CodeCommit)
    • Kích hoạt pipeline khi push code hoặc tạo pull request.
  2. Build Stage
    • Kiểm tra code, chạy test, build ứng dụng.
  3. Deploy Stage
    • Staging → kiểm tra ứng dụng.
    • Production → triển khai chính thức.
  4. Notification
    • Gửi thông báo pipeline success/failure đến Slack hoặc Discord.

3 Cách Cài Đặt CI/CD Pipeline

Bước 1: Cấu hình SSH Proxy qua Bastion Host

Vì server production thường không mở port SSH ra ngoài, ta dùng Bastion Host làm trung gian.

Tạo file SSH config (~/.ssh/config) trên CI/CD Runner

Host bastion
    HostName <Bastion Public IP>
    User <Bastion User>
    IdentityFile ~/.ssh/bastion_key.pem

Host private-server
    HostName <Private Server IP>
    User <Private User>
    IdentityFile ~/.ssh/private_key.pem
    ProxyJump bastion
  • ProxyJump bastion: CI/CD chỉ cần SSH vào Bastion, rồi Bastion kết nối đến Private Server.
  • Security Group AWS:
    • Bastion Host → mở SSH (port 22) từ GitHub Actions hoặc CodePipeline.
    • Private Server → chỉ cho phép SSH từ Bastion Host.

Bước 2: Thiết lập GitHub Actions Workflow

Tạo file .github/workflows/ci-cd-bastion.yml:

name: CI/CD with Bastion Host

on:
  push:
    branches:
      - main
      - develop

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up SSH config
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.BASTION_PRIVATE_KEY }}" > ~/.ssh/bastion_key.pem
          echo "${{ secrets.PRIVATE_SERVER_KEY }}" > ~/.ssh/private_key.pem
          chmod 600 ~/.ssh/*.pem
          echo "
          Host bastion
              HostName ${{ secrets.BASTION_HOST }}
              User ${{ secrets.BASTION_USER }}
              IdentityFile ~/.ssh/bastion_key.pem

          Host private-server
              HostName ${{ secrets.PRIVATE_SERVER }}
              User ${{ secrets.PRIVATE_USER }}
              IdentityFile ~/.ssh/private_key.pem
              ProxyJump bastion
          " > ~/.ssh/config
          chmod 600 ~/.ssh/config

      - name: Deploy to Private Server
        run: |
          ssh private-server "cd /var/www/myapp && git pull origin main && npm install && npm run build && pm2 restart all"
  • Giải thích:
    • Checkout code từ GitHub.
    • Thiết lập SSH Proxy để kết nối qua Bastion đến Private Server.
    • Deploy code, cài đặt package, build, và restart app bằng PM2.

Bước 3: AWS CodePipeline với Bastion Host (Tùy chọn)

Nếu muốn triển khai với AWS CodePipeline, ta cần:

Tạo script kết nối Bastion để triển khai (deploy-via-bastion.sh)

#!/bin/bash

# SSH proxy command qua Bastion Host
ssh -o ProxyCommand="ssh -i /path/to/bastion_key.pem -W %h:%p bastion-user@<Bastion Public IP>" \
    -i /path/to/private_key.pem private-user@<Private Server IP> << EOF
cd /var/www/myapp
git pull origin main
npm install
npm run build
pm2 restart all
EOF

Tạo file buildspec.yml để sử dụng với AWS CodeBuild

version: 0.2

phases:
  install:
    runtime-versions:
      nodejs: 16
    commands:
      - echo "Installing dependencies"
      - npm install
  build:
    commands:
      - echo "Building application"
      - npm run build
  post_build:
    commands:
      - echo "Deploying application"
      - chmod +x deploy-via-bastion.sh
      - ./deploy-via-bastion.sh
  • Giải thích:
    • Install dependencies.
    • Build ứng dụng.
    • Deploy thông qua Bastion Host bằng script deploy-via-bastion.sh.

Bước 4: Kiểm Tra CI/CD

  1. Push code lên GitHub (branch main hoặc develop).
  2. Kiểm tra GitHub Actions hoặc AWS CodePipeline.
  3. Nếu thành công, ứng dụng sẽ được deploy & restart.

4 Tích Hợp CI/CD

  • GitHub Actions Workflow:
    • Trigger khi có push hoặc pull request.
    • Build → Deploy Staging → Deploy Production.
  • AWS CodePipeline (Tùy chọn):
    • Source lấy từ GitHub hoặc AWS CodeCommit.
    • Build bằng AWS CodeBuild.
    • Deploy thông qua Bastion Host.

5 Tổng Kết

CI/CD tự động hóa quá trình build, test, deploy.
Hỗ trợ triển khai an toàn qua Bastion Host.
GitHub Actions hoặc AWS CodePipeline đều có thể sử dụng.
Dễ dàng mở rộng và tối ưu hóa.

Danh mục


  1. Khác
  2. ThreeJS
  3. Ubuntu/Linux
  4. HTML/CSS
  5. Git
  6. Amazon Web Services
  7. Javascript
  8. Docker
  9. Laravel

Bài viết liên quan


AWS S3

AWS S3

27.09.2024
Author: ADMIN
AWS S3 là một dịch vụ lưu trữ đối tượng mạnh mẽ và linh hoạt. Bài viết này sẽ giúp bạn hiểu rõ về S3, từ các khái niệm cơ bản đến cách cấu hình chi tiết. Cùng với đó là hướng dẫn từng bước để tạo bucket, upload object, phân quyền và tạo bucket policy. Giú
AWS Region

AWS Region

27.09.2024
Author: ADMIN
Bài viết này giải thích chi tiết về AWS Region, bao gồm đặc điểm, lợi ích và cách chọn Region phù hợp. Tìm hiểu về Availability Zones, tuân thủ quy định, tối ưu hóa chi phí và giảm độ trễ. Nắm vững kiến thức để triển khai ứng dụng đám mây hiệu quả.
Auto Trigger Notification to Discord/Teams/Slack

Auto Trigger Notification to Discord/Teams/Slack

05.02.2025
Author: ADMIN
Hướng dẫn chi tiết giám sát lỗi backend với AWS CloudWatch Logs, AWS Lambda, Discord. Phân loại lỗi, chống spam, thông báo lỗi nghiêm trọng. Cấu hình CloudWatch Logs, Lambda, S3.
Maintenance Mode

Maintenance Mode

05.02.2025
Author: ADMIN
Tự động hóa Maintenance Mode Nginx với file flag, IP whitelist, script và tích hợp CI/CD (GitHub Actions). Hướng dẫn từng bước cấu hình Nginx, script và workflow để bảo trì hệ thống hiệu quả.

Bài viết khác

Routing

Routing

01.08.2024
Author: ADMIN
Hướng dẫn chi tiết về Basic Routing trong Laravel, từ cách định nghĩa route, sử dụng middleware, route caching đến route naming giúp tối ưu hóa ứng dụng.
Blade Basics

Blade Basics

01.08.2024
Author: ADMIN
Khám phá Blade trong Laravel: từ if-else, loops, kế thừa layout đến include sub-views. Giúp code gọn gàng, dễ quản lý và bảo trì hơn!
9 Mẹo Hữu Ích Khi Sử Dụng Blade Trong Laravel

9 Mẹo Hữu Ích Khi Sử Dụng Blade Trong Laravel

01.08.2024
Author: ADMIN
Khám phá 9 mẹo Blade giúp bạn viết code Laravel sạch, tối ưu và chuyên nghiệp hơn. Từ @forelse, @auth, @guest, đến format ngày, tối ưu SEO – tất cả trong một bài viết súc tích, dễ áp dụng!
Hiển thị giá trị trong Blade

Hiển thị giá trị trong Blade

01.08.2024
Author: ADMIN
Hướng dẫn hiển thị biến trong Laravel Blade: escape HTML tự động, hiển thị dữ liệu thô, giá trị mặc định và cách truy xuất mảng, đối tượng. Giúp bạn tối ưu hiển thị dữ liệu một cách an toàn!