Phần 8 — Best practices, Debug và OIDC hardening
Ý 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 8 — Best practices, Debug và OIDC hardening ← bạn đang đọc
Phần cuối series — gộp ba chủ đề bắt buộc cho mọi pipeline chạy production: best practices tổng hợp từ kinh nghiệm vận hành (pin version, concurrency, timeouts, permissions), kỹ thuật debug khi workflow lỗi (debug log, tmate, act), và OIDC hardening — kỹ thuật quan trọng nhất để bỏ long-lived cloud credentials (AWS access key, GCP service account JSON) khỏi GitHub secrets.
Tổng hợp từ kinh nghiệm vận hành nhiều dự án:
Pin version action: dùng @v4 hoặc commit SHA, không dùng @main — tránh bị supply chain attack.
Tách CI và CD: workflow CI (test/lint) chạy mọi PR; workflow CD (deploy) chỉ chạy khi merge vào main hoặc tag release.
Fail fast: đặt step rẻ nhất (lint) trước step đắt nhất (build). Job fail sớm → tiết kiệm phút build.
Concurrency control: tránh deploy đè lên nhau khi 2 PR merge cùng lúc:
concurrency:
group: deploy-${{ github.ref }}
cancel-in-progress: false
Timeouts: luôn đặt timeout-minutes cho job để tránh job treo ăn quota:
jobs:
build:
timeout-minutes: 15
Dùng GITHUB_TOKEN trước khi tạo PAT: token này tự sinh mỗi run, scope hẹp, an toàn hơn personal access token.
Bật permissions: rõ ràng: theo principle of least privilege:
permissions:
contents: read
packages: write # chỉ khi push GHCR
Log có cấu trúc: dùng ::group:: để collapse log dài, ::error:: để highlight lỗi trên UI.
Quản lý phút build: vào Settings → Billing → Actions để xem dashboard. Job dùng nhiều phút nhất thường là build Docker — chuyển sang self-hosted nếu vượt free tier.
Vài kỹ thuật cần biết:
Bật debug log: tạo 2 repository secrets ACTIONS_STEP_DEBUG = true và ACTIONS_RUNNER_DEBUG = true rồi re-run workflow — log sẽ verbose hơn nhiều.
SSH vào runner đang chạy với action mxschmitt/action-tmate: thêm step - uses: mxschmitt/action-tmate@v3, workflow sẽ in URL SSH để bạn login vào trực tiếp runner. Cực kỳ hữu ích để debug lỗi “máy mình chạy được, CI thì không”.
Re-run failed jobs: bấm Re-run failed jobs trong UI để chạy lại đúng job lỗi, không phải chạy lại từ đầu.
Act — chạy workflow ở local: cài nektos/act, chạy act push để giả lập event ngay trên máy. Cài đặt 1 lần, debug nhanh hơn nhiều lần.
Cách cũ để deploy lên AWS/GCP/Azure từ GitHub Actions: lưu access key (hoặc service account JSON) vào repo secret. Vấn đề: key tồn tại vĩnh viễn — lỡ rò rỉ thì kẻ tấn công có quyền cho tới khi bạn rotate. OIDC (OpenID Connect) giải quyết bằng cách cấp token tạm thời cho mỗi workflow run.
Bạn tạo IAM role trên cloud, cho phép trust GitHub OIDC provider (token.actions.githubusercontent.com), giới hạn theo repo/branch/environment.
Trong workflow, request OIDC token từ GitHub qua permission id-token: write.
Token đó được gửi đến cloud, cloud verify chữ ký GitHub, cấp short-lived credentials (mặc định 1 giờ).
Workflow dùng credentials để gọi API cloud — hết hạn tự động, không cần rotate.
permissions:
id-token: write
contents: read
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789012:role/github-actions-deploy
aws-region: ap-southeast-1
- run: aws s3 sync ./dist s3://my-bucket
Trust policy phía AWS giới hạn theo repo và branch:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": { "Federated": "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com" },
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
"token.actions.githubusercontent.com:sub": "repo:org/repo:ref:refs/heads/main"
}
}
}]
}
Điều kiện sub giới hạn role chỉ được assume bởi workflow chạy trên branch main của repo cụ thể — kẻ fork repo không thể lợi dụng được.
GCP: google-github-actions/auth với Workload Identity Federation.
Azure: azure/login@v2 với Azure AD federated credential.
HashiCorp Vault: hashicorp/vault-action với JWT auth.
Khi có thể, ưu tiên OIDC over long-lived credentials. Đây là baseline security cho mọi pipeline production năm 2025+.
Trong phần này bạn đã nắm:
Best practices: pin @v4 action, tách CI/CD, fail fast, concurrency.cancel-in-progress, timeout-minutes, permissions: rõ ràng, dùng GITHUB_TOKEN thay PAT.
Debug: bật ACTIONS_STEP_DEBUG/ACTIONS_RUNNER_DEBUG, SSH vào runner đang chạy qua mxschmitt/action-tmate, chạy workflow local qua nektos/act.
OIDC: workflow request short-lived token từ GitHub, gửi đến cloud (AWS/GCP/Azure) để assume IAM role — credentials chỉ tồn tại 15 phút - 1 giờ, hết hạn tự động, không cần rotate.
Bỏ AWS_ACCESS_KEY_ID khỏi secrets: thay bằng aws-actions/configure-aws-credentials@v4 + IAM role trust GitHub OIDC provider, điều kiện sub giới hạn theo repo/branch.
Cảm ơn bạn đã theo dõi 8 phần của series. Bạn đã có đủ công cụ để vận hành pipeline GitHub Actions production-grade. Khi áp dụng vào dự án thật, hãy nhớ: bảo mật trước, tối ưu sau — pin version action, scope permissions hẹp, ưu tiên OIDC over long-lived credentials.
Đây là phần cuối series. Cảm ơn bạn đã theo dõi! Quay lại Phần 1 nếu cần đọc lại từ đầu.