CI/CD 十關

GITLAB CI/CD 教學

從第一條 pipeline,
一路做到 k8s 實機部署

十關由淺入深。Lv.1~Lv.9 每關一個可以直接執行的 .gitlab-ci.yml,都在 gitlab.com 共享 runner 實跑通過;Lv.10 用和正式網站相同的流水線,把這個網站建成映像、簽章,經 GitOps 部署到 k8s。

課程地圖

十關課程

按住卡片拖拉可以排序或拖進群組;手機長按約半秒再拖。鍵盤:在卡片上按空白鍵拿起,方向鍵移動,再按空白鍵放下,Esc 取消;Enter 開啟。排法存在這台裝置的瀏覽器。

未分類

10
Lv.1基礎約 10 分鐘

第一條 Pipeline

寫出第一個 .gitlab-ci.yml,看懂 pipeline、job、runner 的關係

關鍵字job、script、image

開啟
Lv.2基礎約 15 分鐘

Stages 與 Jobs

用 stages 排出建置、測試、部署的順序,學會平行 job 與允許失敗

關鍵字stages、default、allow_failure、.pre/.post

開啟
Lv.3基礎約 20 分鐘

Artifacts

把建置產物交給下一個 job,並在 GitLab 介面看到測試報告

關鍵字artifacts、dependencies、reports:junit

開啟
Lv.4基礎約 20 分鐘

Variables

分清楚內建、全域、job、專案變數的優先順序,並用 dotenv 在 job 之間傳值

關鍵字variables、預定義變數、dotenv、Masked

開啟
Lv.5進階約 20 分鐘

Cache

用 cache 保存套件下載,學會 key、policy,以及 cache 與 artifacts 的分工

關鍵字cache、key:files、policy、extends

開啟
Lv.6進階約 25 分鐘

Rules 與 workflow

用 rules 與 workflow 控制什麼時候建立 pipeline、哪些 job 要跑、要不要手動按

關鍵字rules、workflow、changes、exists、when: manual

開啟
Lv.7進階約 25 分鐘

Needs 與 DAG

用 needs 讓 job 準備好就開跑,用 matrix 一次測多個版本,用 extends 與 !reference 重用設定

關鍵字needs、DAG、parallel:matrix、extends、!reference

開啟
Lv.8進階約 25 分鐘

Services

用 services 在 job 旁邊開 Redis 與 PostgreSQL,跑真正連得到資料庫的整合測試

關鍵字services、alias、整合測試、entrypoint

開啟
Lv.9進階約 30 分鐘

Environments

用 environments 管理 review、staging、production,學會停止環境、鎖住部署與手動上線

關鍵字environment、review app、on_stop、resource_group、手動上線

開啟
Lv.10實機約 45 分鐘

實機部署到 k8s

用正式網站同一套流水線,把課程網站建成映像、簽章,經 GitOps 由 Argo CD 部署到 k8s,Envoy 對外提供 HTTPS

關鍵字Harbor、cosign、Kyverno、GitOps、Argo CD、Envoy Gateway

開啟

Lv.10 實機部署

push 之後發生什麼事

這個網站本身就是 Lv.10 的成果。詳細步驟與 YAML 在 Lv.10。

  1. 1
    push main

    受保護分支才會建映像與部署;分支與 MR 只跑掃描

  2. 2
    掃描

    gitleaks 機密、Trivy 相依套件、Semgrep 程式寫法

  3. 3
    建置映像

    BuildKit 無 root 建置,推上 Harbor sites/cicd-tutorial

  4. 4
    映像檢查

    Trivy 掃描映像並產生 SBOM

  5. 5
    cosign 簽章

    傳統 .sig 標籤格式,Kyverno 只認得這種

  6. 6
    更新 GitOps

    CI 把新標籤寫進 homelab-k8s 的 apps/cicd-tutorial/values.yaml

  7. 7
    Argo CD 同步

    約 3 分鐘內偵測到變更,滾動更新 site-cicd-tutorial

  8. 8
    Envoy 上線

    HTTPRoute 接到共用 Gateway,cert-manager 簽發 HTTPS 憑證

技術棧

用到的工具

GitLab CI/CDgitlab.com 共享 runner 跑 Lv.1~Lv.9;homelab 的 k8s-ci、k8s-release runner 跑 Lv.10
Harbor私有映像倉庫,映像放 sites/ 專案
cosign+Kyverno簽章與准入驗章,未簽章的映像進不了 site-* 命名空間
Argo CDGitOps:以 homelab-k8s repo 為準,自動同步與自我修復
Envoy Gateway對外入口與反向代理,每站獨立 HTTPRoute
cert-managerLet's Encrypt HTTP-01 簽發與自動續期
nginx-unprivileged容器內提供靜態檔,非 root、唯讀根目錄
Python 標準函式庫把各關 README 轉成網頁,不需要任何第三方套件