@@ -200,6 +200,108 @@ <h2>進階挑戰題</h2>
200200< li > < strong > GitLab CE vs EE 功能差距分析:</ strong > 調查三個 GitLab EE 獨有的功能(如 Audit Events、Merge Train、Code Owners),說明它們在 50 人以上的團隊中如何提升合規性與效率。</ li >
201201</ ol >
202202
203+ <!-- ═══════ Round 2 Deepen ═══════ -->
204+ < h2 > 專案級端到端 Worked Example</ h2 >
205+ < h3 > 情境:企業 DevOps 平台建置專案(devops-platform)</ h3 >
206+ < p > 一家 30 人新創決定全面導入 GitLab 自架,把「群組與權限、MR 流程、CI/CD、Pages、稽核」一次到位。這是跨單元的整站整合案例——把單元 1–7 的知識收束成一個可交付的專案。</ p >
207+ < div class ="demo-block ">
208+ < div class ="demo-label "> 專案檔案樹 · TREE</ div >
209+ < pre > devops-platform/
210+ ├── README.md < span class ="hl-c "> # 專案總覽、決策紀錄、驗收清單</ span >
211+ ├── docker-compose.yml < span class ="hl-c "> # GitLab CE + Runner 一鍵部署(單元 1)</ span >
212+ ├── .env.example < span class ="hl-c "> # 環境變數範本(不含任何密碼)</ span >
213+ ├── config/
214+ │ └── gitlab.rb < span class ="hl-c "> # 備份、HTTPS、稽核設定</ span >
215+ ├── scripts/
216+ │ ├── bootstrap.sh < span class ="hl-c "> # 初始化:建群組/專案/權限(單元 2)</ span >
217+ │ ├── backup.sh < span class ="hl-c "> # 每日 02:00 備份(cron)</ span >
218+ │ └── verify.sh < span class ="hl-c "> # 驗收腳本(單元 1 知識)</ span >
219+ ├── docs/
220+ │ ├── architecture.md < span class ="hl-c "> # 架構圖(Nginx→GitLab→Gitaly→Runner)</ span >
221+ │ └── runbook.md < span class ="hl-c "> # 日常維運手冊</ span >
222+ └── .gitlab-ci.yml < span class ="hl-c "> # 平台自身的 CI:每日驗證備份(單元 6)</ span > </ pre >
223+ </ div >
224+ < div class ="demo-block ">
225+ < div class ="demo-label "> 關鍵檔案 · KEY FILES</ div >
226+ < pre > < span class ="hl-c "> # docker-compose.yml(一鍵起 GitLab + Runner)</ span >
227+ services:
228+ gitlab:
229+ image: gitlab/gitlab-ce:latest
230+ hostname: gitlab.example.com
231+ ports: ["80:80", "443:443", "2222:22"]
232+ volumes:
233+ - ./config:/etc/gitlab
234+ - ./data:/var/opt/gitlab
235+ - ./logs:/var/log/gitlab
236+ runner:
237+ image: gitlab/gitlab-runner:latest
238+ volumes: ["/var/run/docker.sock:/var/run/docker.sock"]
239+
240+ < span class ="hl-c "> # scripts/verify.sh(驗證健康、版本、備份、稽核)</ span >
241+ #!/usr/bin/env bash
242+ curl -sI https://gitlab.example.com | head -1
243+ sudo gitlab-ctl status
244+ sudo gitlab-rake gitlab:backup:status | tail -2
245+ ls /srv/backup/ | tail -1 < span class ="hl-c "> # 最新備份檔</ span > </ pre >
246+ </ div >
247+ < div class ="demo-block ">
248+ < div class ="demo-label "> 驗證命令與輸出 · VERIFY</ div >
249+ < pre > $ docker compose ps
250+ NAME STATUS PORTS
251+ gitlab healthy 0.0.0.0:80-> 80, 0.0.0.0:2222-> 22
252+ runner running 0.0.0.0:8093-> 8093
253+
254+ $ ./scripts/verify.sh
255+ HTTP/1.1 302 Found < span class ="hl-c "> # 302 = 登入頁正常</ span >
256+ run: alertmanager: (pid 1520) 2s; run: gitaly: (pid 1501) 3s
257+ Backup: 2026-08-17 02:00 · tar (18 MB) · done
258+ OK</ pre >
259+ </ div >
260+ < div class ="callout "> < strong > 專案級收斂:</ strong > 單元 1 講「GitLab 是什麼」,這個專案把定義變成可交付物——你能列出架構、寫出部署、跑出驗收。這是「讀懂」與「做得出來」的分界線。</ div >
261+
262+ < h2 > 效能 / 品質 / 安全深度</ h2 >
263+ < h3 > 效能:自架 GitLab 的關鍵調校</ h3 >
264+ < table >
265+ < tr > < th > 面向</ th > < th > 調整</ th > < th > 影響</ th > </ tr >
266+ < tr > < td > < strong > Puma</ strong > </ td > < td > 依 CPU 數調 workers(< code > puma['worker_processes']</ code > )</ td > < td > Web 併發吞吐量</ td > </ tr >
267+ < tr > < td > < strong > Sidekiq</ strong > </ td > < td > 依佇列分流(mailers、pipelines、archive 各開 process)</ td > < td > CI 排程與背景任務延遲</ td > </ tr >
268+ < tr > < td > < strong > Gitaly</ strong > </ td > < td > 獨立節點+檔案快取;大型 repo 開 < code > git pack-objects</ code > 快取</ td > < td > clone / push 速度</ td > </ tr >
269+ < tr > < td > < strong > Runner</ strong > </ td > < td > 用 tag 分群、Docker executor + 共掛快取 volume</ td > < td > CI 排隊等待與快取命中率</ td > </ tr >
270+ </ table >
271+ < h3 > 品質:備份、升級與災難復原</ h3 >
272+ < ul >
273+ < li > Omnibus 內建 < code > gitlab-backup create</ code > ,備份檔含 DB、repo、uploads;< strong > 設定 RPO/RTO</ strong > (例如 RPO=24h、RTO=4h)後寫進 runbook。</ li >
274+ < li > 升級節奏:先讀 < a href ="https://docs.gitlab.com/update/upgrade_paths/ " rel ="noopener "> upgrade path</ a > ,跳太多版會強制中間版;備份後才升級。</ li >
275+ < li > 品質的證據是「還原演練」,不是「有備份」——每季實際還原到空機器一次。</ li >
276+ </ ul >
277+ < h3 > 安全:讓平台自己可信</ h3 >
278+ < ul >
279+ < li > 強制 < strong > 2FA</ strong > (instance 層級)、LDAP/SSO 對接公司帳號、停用自助註冊。</ li >
280+ < li > 開啟 < strong > Audit Events</ strong > (EE):誰在何時改了權限、刪了專案、下了批准——合規稽核的必要證據。</ li >
281+ < li > 安全頭部(HSTS/CSP)、僅 HTTPS、PAT 一律設到期與最小 scope。</ li >
282+ </ ul >
283+
284+ < h2 > 站際比較對照表</ h2 >
285+ < table >
286+ < tr > < th > 面向</ th > < th > gitlab</ th > < th > github</ th > < th > markdown</ th > < th > yaml</ th > < th > json</ th > </ tr >
287+ < tr > < td > 核心定位</ td > < td > 一體化 DevOps 平台</ td > < td > 社群生態代管平台</ td > < td > 人類可讀的文件格式</ td > < td > 人類可讀的設定格式</ td > < td > 機器可讀的資料格式</ td > </ tr >
288+ < tr > < td > 開源程度</ td > < td > CE 完整開源</ td > < td > 平台閉源</ td > < td > 開放標準</ td > < td > 開放標準</ td > < td > 開放標準</ td > </ tr >
289+ < tr > < td > 託管模式</ td > < td > 雲端+可自架</ td > < td > 雲端為主</ td > < td > 純文字檔</ td > < td > 純文字檔</ td > < td > 純文字/程式產生</ td > </ tr >
290+ < tr > < td > 與本單元關係</ td > < td > 主角</ td > < td > 直接對照</ td > < td > README/Wiki 用 MD 寫</ td > < td > .gitlab-ci.yml 用 YAML 寫</ td > < td > GitLab API 回傳 JSON</ td > </ tr >
291+ < tr > < td > 自動化程度</ td > < td > 高(平台內建)</ td > < td > 高(平台內建)</ td > < td > 低(人工撰寫)</ td > < td > 中(設定驅動)</ td > < td > 高(程式驅動)</ td > </ tr >
292+ </ table >
293+
294+ < h2 > 互動式檢核清單</ h2 >
295+ < div class ="demo-block ">
296+ < div class ="demo-label "> 進階驗收清單 · CHECKLIST</ div >
297+ < pre > - [ ] docker-compose 一鍵起 GitLab + Runner,資料持久化
298+ - [ ] 已設定每日備份,且還原演練成功過一次
299+ - [ ] 全員強制 2FA、停用自助註冊、PAT 皆設到期
300+ - [ ] 至少一個 pipeline 在 Runner 上跑綠
301+ - [ ] 已寫出 architecture.md 與 runbook.md 並交接
302+ - [ ] 掃描確認無任何 token / 密碼 commit 進 repo</ pre >
303+ </ div >
304+
203305</ div >
204306< footer > 這是 GitLab 繁體中文教學站 · 由 OpenCode 建置< br >
205307 < span class ="footer-license "> 本站教學內容(繁體中文解說)為本站原創,採 CC-BY-4.0;技術名詞與操作引用自 < a href ="https://docs.gitlab.com/ " rel ="noopener "> GitLab Docs</ a > 與 < a href ="https://git-scm.com/doc " rel ="noopener "> Git 官方文件</ a > 。</ span > </ footer >
0 commit comments