<h1>Git筆記--GitLab Runner</h1> 在 <code>.gitlab-ci.yml</code> 裡,<code>Runner</code> 是 <code>GitLab CI/CD</code> 真正執行工作的「工人」,是實體存在的機器/伺服器,它負責把你在 <code>YAML</code> 裡定義的 <code>Job</code> 變成實際操作。可以把 <code>Runner</code> 想像成「工廠裡的機器人」,你的 <code>.gitlab-ci.yml</code> 就是流程表,<code>Runner</code> 依照表上指示去完成每個任務。 --- 運作流程 --- 假設在專案中有一個 <code>.gitlab-ci.yml</code>,裡面定義了 <code>Stage</code> 與 <code>Job</code>: ```yaml= stages: - build - test # Build Job,需要 Docker 環境 build_job: stage: build tags: - docker # 指定只有有 docker 標籤的 Runner 可以執行 - linux # 指定 Runner 必須是 Linux 環境 script: - echo "Building project..." # Test Job,也在 Docker + Linux 環境執行 test_job: stage: test tags: - docker # 只派給有 docker 標籤的 Runner - linux # 只派給 Linux Runner script: - echo "Running tests..." ``` <details><summary>步驟 1:<code>Pipeline</code> 觸發</summary> <div> --- - 當 <code>push commit</code>、<code>merge request</code> 或手動觸發 <code>pipeline</code> 時,<code>GitLab</code> 會解析 <code>.gitlab-ci.yml</code>。 - <code>GitLab</code> 會生成一個 <code>pipeline</code>,裡面包含依照 <code>stages</code> 排序的 <code>Job</code>。 - 每個 <code>Job</code> 是一個待執行的任務清單。 </div> </details> <details><summary>步驟 2:<code>Job</code> 分配給 <code>Runner</code></summary> <div> --- - GitLab 將 <code>pipeline</code> 裡的 <code>Job</code> 分配給可用的 <code>Runner</code>。 - <code>Runner</code> 分為: - <code>Shared Runner</code>:所有專案都可用 - <code>Specific Runner</code>:專屬於某個專案或群組 - GitLab 根據 <code>Runner</code> 標籤(tags)選擇適合執行該 <code>Job</code> 的 <code>Runner</code>。 - <code>tags</code> 會讓 GitLab 只派 <code>Job</code> 給符合條件的 <code>Runner</code> - 如果有多個 <code>Runner</code> 都符合標籤,GitLab 會自動選擇空閒的 <code>Runner</code> - 沒有符合標籤的 <code>Runner</code>,<code>Job</code> 會一直排隊,直到有 <code>Runner</code> 可用 </div> </details> <details><summary>步驟 3:<code>Runner</code> 環境準備</summary> <div> --- - Runner 啟動時會依照 <code>Job</code> 設定準備執行環境: - 執行方式有多種: - <code>Docker</code>:每個 <code>Job</code> 在乾淨的容器中執行 - <code>Shell</code>:直接在 <code>Runner</code> 主機上執行 - <code>Kubernetes</code>:在 <code>Pod</code> 中執行 - <code>Runner</code> 會拉取專案程式碼到本地或容器內。 </div> </details> <details><summary>步驟 4:<code>Job</code> 執行</summary> <div> --- - Runner 依序執行 <code>Job</code> 中的 <code>script</code> 指令。 - 執行時可: - 產生 <code>Artifacts</code>(檔案、測試報告、build 成品) - 輸出 <code>log</code>(方便 GitLab UI 查看) </div> </details> <details><summary>步驟 5:<code>Job</code> 結果回傳</summary> <div> --- - <code>Job</code> 執行完成後,<code>Runner</code> 將結果回傳給 GitLab: - 成功(green tick) - 失敗(red cross) - GitLab 更新 <code>pipeline</code> 狀態,決定下一個 <code>stage</code> 的 <code>Job</code> 是否可以執行。 </div> </details> <details><summary>步驟 6:<code>Artifacts</code> 與 <code>Cache</code> 處理</summary> <div> --- - <code>Runner</code> 可以上傳產物(Artifacts)到 GitLab,供後續 <code>Job</code> 使用。 - 可以使用 <code>cache</code> 儲存中間結果,加快下次 <code>pipeline</code> 執行速度。 </div> </details> ```markdown= Push Commit → GitLab 解析 .gitlab-ci.yml → Pipeline 生成 → Job 分配給符合標籤的 Runner → Runner 準備環境(依 Executor/標籤配置) → 執行 Script → 上傳結果/Artifacts → GitLab 更新 Pipeline 狀態 ``` 備註: GitLab 預設會在有 <code>commit</code> <code>push</code> 上遠端時自動觸發 <code>pipeline</code>。