Phần 7 — Pipeline thực tế: Next.js + Docker + VPS deploy
Ý kiến
0
Chưa có ý kiến nào. Hãy là người đầu tiên chia sẻ!
Chưa có ý kiến nào. Hãy là người đầu tiên chia sẻ!
Pipeline production Next.js → Docker → K8s với cache image, manual approval. Tổng kết best practices và kỹ thuật debug (CI Lint, visualizer, CI_DEBUG_TRACE).
Khai báo environment để GitLab theo dõi deployments, có lịch sử và nút rollback. Review Apps — tính năng signature: mỗi MR tự deploy lên môi trường tạm.
Tái sử dụng pipeline giữa nhiều dự án với include (local, project, template, remote), kế thừa job với extends (hidden job), và YAML anchors.
Series GitHub Actions Toàn Tập — 8 phần:
Phần 1 — Tổng quan: CI/CD, GitHub Actions và các khái niệm cốt lõi
Phần 5 — Self-hosted Runner: cài đặt, security, auto-scaling
Phần 7 — Pipeline thực tế: Next.js + Docker + VPS deploy ← bạn đang đọc
Đến phần thực hành. Ta dựng một pipeline đầy đủ cho Next.js app — gộp mọi kỹ thuật từ các phần trước: test trên GitHub-hosted, build Docker image với GHA cache cho Docker layer, push lên GitHub Container Registry (GHCR), rồi deploy lên VPS qua self-hosted runner trong cùng mạng nội bộ. Bonus: environment protection ép phải có approval trước khi deploy production.
Ví dụ đầy đủ: build Next.js app, đóng thành Docker image, đẩy lên GitHub Container Registry (GHCR), rồi SSH vào VPS để deploy.
name: Deploy Next.js
on:
push:
branches: [main]
env:
IMAGE: ghcr.io/${{ github.repository }}
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'pnpm'
- uses: pnpm/action-setup@v4
with: { version: 9 }
- run: pnpm install --frozen-lockfile
- run: pnpm lint
- run: pnpm test
- run: pnpm build
build-image:
needs: test
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: docker/build-push-action@v6
with:
push: true
tags: |
${{ env.IMAGE }}:${{ github.sha }}
${{ env.IMAGE }}:latest
cache-from: type=gha
cache-to: type=gha,mode=max
deploy:
needs: build-image
runs-on: [self-hosted, production]
environment: production
steps:
- name: Pull & restart container
run: |
docker pull ${{ env.IMAGE }}:${{ github.sha }}
docker stop myapp || true
docker rm myapp || true
docker run -d --name myapp \
--restart unless-stopped \
-p 3000:3000 \
--env-file /opt/myapp/.env \
${{ env.IMAGE }}:${{ github.sha }}
Phân tích kiến trúc:
Job test chạy trên runner GitHub-hosted (rẻ, sạch).
Job build-image cũng dùng GitHub-hosted — push image lên GHCR.
Job deploy chạy trên self-hosted runner đặt trong cùng mạng với VPS production. Tránh expose SSH key và dùng được private network.
environment: production ép phải có approval (configure ở repo settings).
cache-from/cache-to: type=gha dùng GitHub Actions cache cho Docker layer — giảm thời gian build từ 5 phút xuống 30 giây sau lần đầu.
Trong phần này bạn đã nắm:
Pipeline 3 job: test (GitHub-hosted) → build-image (GitHub-hosted, push GHCR) → deploy (self-hosted, pull & restart container).
GHA cache cho Docker layer: cache-from/cache-to: type=gha giảm thời gian build từ 5 phút xuống ~30s sau lần đầu.
Self-hosted deploy job tránh expose SSH key, dùng được private network giữa runner và VPS.
environment: production + setting Required reviewers = approval gate trước mỗi deploy production.
Trong Phần 8 (phần cuối series), ta tổng kết: best practices vận hành pipeline, kỹ thuật debug khi workflow lỗi, và OIDC hardening để bỏ long-lived cloud credentials khỏi pipeline.