KB-F1BC

S129A — Đóng gap cuối Điều 30: post-deploy smoke

6 min read Revision 1
missions129adieu30deploysmokereport

S129A — Đóng gap cuối Điều 30: post-deploy smoke

Ngày thực hiện: 2026-03-23 Repo: Huyen1974/web-test PR: #573

Assembly Gate

  • Q0 PG: Không cần sửa PG
  • Q1 Directus: Không cần sửa Directus
  • Q2 Nuxt: Không cần sửa Nuxt UI
  • Q3 Code mới: Có — sửa .github/workflows/deploy-vps.yml để thêm post-deploy smoke
  • Q4 Test: Mission này tự nó là test (merge -> deploy -> smoke)
  • Q5 Rollback: git revert

Step 0 — Đã đọc trước khi làm

Đã thực hiện đúng thứ tự yêu cầu:

  1. Đọc .claude/skills/incomex-rules.md
  2. search_knowledge("operating rules SSOT")
  3. search_knowledge("regression test law")
  4. search_knowledge("dieu30-complete-report")
  5. search_knowledge("dieu30-selfprotect-report")

Ghi chú:

  • search_knowledge("dieu30-complete-report") không trả đúng report mong muốn theo query title.
  • Tôi đọc trực tiếp đúng tài liệu tại knowledge/current-state/reports/dieu30-complete-report.md để lấy context gap đã đóng.

Quote bắt buộc:

  • SSOT §0-T: Playwright E2E trong CI. Test FAIL = PR block. Máy kiểm tra máy.
  • Điều 30 v1.2: Tầng 2 = Smoke production sau deploy, No Blind PASS, Rule of Evidence.

Hiện trạng trước khi sửa

Xác nhận từ repo:

  • .github/workflows/e2e-test.yml đã có:
    • push.branches = [main]
    • pull_request.branches = [main]
  • Gap 2 đã đóng từ PR #569.

Xác nhận từ deploy-vps.yml trước khi sửa:

  • Chưa có step post-deploy smoke nào trong job deploy.

Blocker thực tế phát hiện trong lúc làm:

  • SSH vào VPS kiểm tra /opt/incomex/scripts/smoke-test.sh trả smoke-script=missing
  • Nghĩa là nếu chỉ thêm step chạy script mà không sync file, workflow sẽ fail ngay.

Thay đổi đã thực hiện

Chỉ sửa đúng file cho phép:

  • .github/workflows/deploy-vps.yml

1. Thêm post-deploy smoke cho deploy-direct

Sau step Apply config and restart Nuxt, đã thêm:

  • Copy smoke script to VPS
  • Post-deploy smoke test

Logic step smoke:

  • SSH dùng cùng credentials sẵn có:
    • host: ${{ secrets.VPS_HOST }}
    • username: root
    • key: ${{ secrets.VPS_SSH_KEY }}
  • Chạy:
    • sleep 15
    • cd /opt/incomex
    • chmod +x scripts/smoke-test.sh
    • scripts/smoke-test.sh

2. Thêm cùng logic cho deploy-artifact

Tôi thêm cùng 2 step vào job deploy-artifact để không tạo gap mới nếu DEPLOY_MODE đổi khỏi direct.

3. Tín hiệu fail của smoke

Smoke fail sẽ làm workflow fail vì:

  • step chạy dưới set -euo pipefail
  • scripts/smoke-test.sh exit non-zero sẽ làm SSH action fail
  • không có đoạn swallow lỗi hay || true

Validate trước PR

  • YAML parse: yaml ok
  • Baseline production smoke trước PR: PASS: 17 | FAIL: 0
  • Xác nhận gap 2: e2e-test.yml đã có push main

PR thực hiện

PR: #573

PR checks:

  • Critical File Guard run 23418538332success
  • E2E Tests run 23418538320success
  • Nuxt 3 CI run 23418538329success
  • Terraform Deploy run 23418538310success

Verify sau merge

Main push green

Push-main runs sau merge #573:

  • E2E Tests run 23418618430success
  • Nuxt 3 CI run 23418618435success
  • Terraform Deploy run 23418618431success
  • required-docs-guard run 23418618433success

Deploy to VPS chạy sau main

Workflow-run sau khi Nuxt 3 CI main hoàn tất:

  • Deploy to VPS run 23418664705success

Job details:

  • Job Build & Deploy Direct ID 68119055988success
  • Job Deploy via Artifactskipped

Evidence step post-deploy smoke đã chạy và pass

Từ GitHub API actions/runs/23418664705/jobs:

  • Step Copy smoke script to VPSsuccess
  • Step Post-deploy smoke testsuccess
  • Post-deploy smoke test:
    • started: 2026-03-23T02:22:40Z
    • completed: 2026-03-23T02:23:01Z

Kết luận:

  • Gap cuối đã được đóng bằng evidence thật trên production deploy workflow
  • Smoke không chỉ tồn tại trên local/manual; giờ đã là một phần của workflow deploy chính thức

Verify production hiện tại

Smoke output sau deploy

Đã chạy lại scripts/smoke-test.sh sau deploy:

PASS: 17 | FAIL: 0
ALL CHECKS PASSED

VERIFY NUXT

  • https://vps.incomexsaigoncorp.vn/HTTP/1.1 200 OK → KHỚP
  • https://vps.incomexsaigoncorp.vn/knowledge/registries → content có CAT-SPE, Phân loại loài, Thành phần → KHỚP

Ghi theo format yêu cầu:

  • Nuxt URL: https://vps.incomexsaigoncorp.vn/ — hiện HTTP/1.1 200 OK. KHỚP.
  • Nuxt URL: https://vps.incomexsaigoncorp.vn/knowledge/registries — hiện CAT-SPE, Phân loại loài, Thành phần. KHỚP.

Tự kiểm tra

# Câu hỏi Kết quả
1 Đã đọc SSOT + Điều 30 v1.2?
2 Assembly Gate 6 câu đã trả lời?
3 deploy-vps.yml có step Post-deploy smoke?
4 Step dùng SSH chạy scripts/smoke-test.sh?
5 Smoke fail → workflow fail (exit code)?
6 e2e-test.yml có trigger push main?
7 PR CI ALL GREEN?
8 Main CI GREEN sau merge?
9 Deploy + smoke step PASS trên production?
10 VERIFY NUXT: content đúng?
11 Report tại knowledge/current-state/reports/s129a-dieu30-final-report.md?

Kết luận

Điều 30 hiện đã khép kín chu trình triển khai:

  • Contract + E2E + required checks + self-protect đã có từ các PR trước
  • Gap cuối post-deploy smoke trong deploy workflow đã được đóng ở PR #573
  • Deploy to VPS run 23418664705 đã chứng minh step Post-deploy smoke test chạy thật và pass thật trên production

Ghi chú:

  • Tôi không tự báo visual PASS. Evidence trong báo cáo là CI/deploy/smoke + production content verify.
  • ad_list.json local vẫn được giữ nguyên, không tác động.