Jenkins 串接 GitLab

2024/09/15 DevOps

前言

當進行 CI/CD 流程自動化時,許多人會選擇使用 Jenkins 來執行測試任務,而 GitLab 則作為程式碼版本控制系統及 CI/CD Pipeline 平台。本文將詳細介紹如何設置一個流程,使得 GitLab 的 Push 事件觸發 Jenkins 執行單元測試,並在測試成功後,由 Jenkins 進一步觸發 GitLab 的 Pipeline。

目標

  1. 當 Push code 到 GitLab 時,自動觸發 Jenkins 進行單元測試。
  2. 測試通過後,(當有Release Tag Push時)由 Jenkins 觸發 GitLab 的 CI/CD Pipeline,執行 .gitlab-ci.yml。

事前準備

  • GitLab 專案:擁有一個已經設定好的 GitLab 專案,並在專案根目錄擁有 .gitlab-ci.yml。
  • Jenkins 伺服器:安裝並配置好的 Jenkins 伺服器,且已安裝 GitLab 插件。

操作說明

步驟 1:設定 GitLab 的 Webhook 觸發 Jenkins 任務

1. 在 Jenkins 新增一個 Freestyle Job

首先,我們需要在 Jenkins 上建立一個 Freestyle Job,當 GitLab 有代碼推送時,這個任務會自動執行。

具體步驟:

  1. 登入 Jenkins,點擊「新建任務(New Item)」。
  2. 輸入專案名稱,選擇「Freestyle 專案」。
  3. 點擊「確定(OK)」來建立這個 Jenkins Job。

2. 設定 GitLab Repository URL 與憑證

設定專案的來源代碼管理,讓 Jenkins 知道它應該從哪裡拉取代碼來進行測試。

具體步驟:

  1. 在新建立的 Jenkins 任務設定頁面中點選「組態」,找到「來源代碼管理(Source Code Management)」區域,選擇 Git。
  2. 在 Repository URL 欄位中,填寫你 GitLab 專案的 clone URL(HTTPS 或 SSH 都可以)。
  3. 在「Credentials」欄位中,選擇你的憑證。如果還未設定憑證,點擊「新增」並選擇正確的 GitLab 帳密或憑證。

3. 設定 Jenkins 任務的觸發條件

我們需要配置 Jenkins 任務,使其在 GitLab 有代碼推送時自動觸發。

具體步驟:

  1. 在任務配置頁面中,找到「建置觸發程序(Build Triggers)」區域。
  2. 勾選「Build when a change is pushed to GitLab」,這樣當 GitLab 有新的代碼推送時,Jenkins 任務就會被自動觸發。

若建置觸發程序中無GitLab選項,即代表該環境中尚未安裝插件。 請在Jenkins主頁面中選擇管理 Jenkins > System Configuration 中的Plugins 查詢「GitLab」,並下載安裝所有相關的插件。

4. 登入 GitLab,設定 Webhook

現在我們需要在 GitLab 中設定一個 Webhook,將 GitLab 推送的變更通知 Jenkins,從而觸發剛剛建立的 Jenkins Job。

具體步驟:

  1. 登入你的 GitLab 專案。
  2. 進入「設定(Settings)」 >「 Integrations」 頁面並找到 Jenkins。

gitlab Integrations jenkins

  1. 在「URL」欄位中,輸入 Jenkins 的 Webhook 地址,格式如下:
http://<jenkins-server>/project/<jenkins-job-name>
  • <jenkins-server>:替換成你的 Jenkins 伺服器 URL。
  • <jenkins-job-name>:替換成你在 Jenkins 中創建的 Job 名稱

GitLab 設定畫面

  1. 在「觸發事件(Trigger events)」區域,選擇「Push events」,這樣每當有人推送代碼到 GitLab 時,Webhook 都會通知 Jenkins。
  2. 設定完畢後可以點選「Test settings」,測試沒問題後即可點選儲存。

Trigger結果畫面

此時回到Jenkins專案中即可碼放發現剛剛手動觸發的測試已經連動到我們的Jenkins主機中。

以上設定成功後,當 Push code 到 GitLab 時,自動觸發 Jenkins 進行單元測試。 接著可以試著在GitLab推送一個新的commit,並觀察Jenkins是否會自動偵測有新的Push並觸發。

小結:

在這個步驟中,我們:

  1. 在 Jenkins 中建立了一個 Freestyle Job,並設定了它的 GitLab Repository URL 與憑證。
  2. 配置了 Jenkins 任務,使其在 GitLab 有新的代碼推送時自動觸發。
  3. 在 GitLab 中設定了 Webhook,使其能夠與 Jenkins 溝通並觸發任務。

這樣每當有人推送程式碼到 GitLab 時,Jenkins 就會自動執行你配置的單元測試或其他任務。接下來,我們要來設定測試與觸發 GitLab Pipeline 的後續流程。

步驟 2: 在 Jenkins 測試成功後觸發 GitLab Pipeline

當 Jenkins 單元測試成功後,我們希望 Jenkins 去觸發 GitLab Pipeline,這可以透過 GitLab 的 Trigger Token 來實現。首先,為了避免每次 Push code 後 GitLab 的 Pipeline 都自動執行,我們可以設定條件讓 GitLab 的 Pipeline 只在 Jenkins 測試成功後才被手動觸發。

1. 修改 .gitlab-ci.yml

在 GitLab 專案的 .gitlab-ci.yml 檔案中,使用 rules 來設定觸發條件,讓 GitLab Pipeline 不會在每次 push 時自動執行:

stages:
  - test
  - deploy
 
# 全局設定 pipeline 只接受特定來源的觸發
workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "push"'
      when: never  # 避免 push 時  GitLab 自動觸發 pipeline
    - if: '$CI_PIPELINE_SOURCE == "trigger"'
      when: always  # 允許通過 API 觸發 pipeline
 
test_job:
  stage: test
  script:
    - echo "Running tests..."
 
deploy_job:
  stage: deploy
  script:
    - echo "Running deploy..."
  • workflow:這個指令會全局控制 pipeline 的執行條件,適用於整個 pipeline(即所有的 job)。這樣可以避免在每個 job 中重複編寫 rules 條件。
  • rules:我們定義了兩條規則:
    • 當 pipeline 來源是 push 時,設定 when: never,表示不允許 push 事件觸發 pipeline。
    • 當 pipeline 來源是 trigger 時,設定 when: always,允許通過 API 或觸發器來啟動 pipeline。

在你的 .gitlab-ci.yml 檔案中確保加入 workflow 內容並設定執行條件。

2. 在 GitLab 中建立 Trigger Token

  1. 登入你的 GitLab 專案,進入「設定(Settings)」 > 「CI / CD」 > 「Pipeline trigger tokens」。
  2. 新增一個 Trigger,並記下 Token 值,這個 Token 將會在 Jenkins 中使用。

點選 View trigger token usage examples 可以取得完整 API 呼叫指令,Jenkins稍後設定會用到。

3. 在 Jenkins 中新增觸發 GitLab Pipeline 的步驟

在 Jenkins 的 job 中,當單元測試成功後,我們可以新增一個步驟來觸發 GitLab Pipeline。

  1. 進入 Jenkins 專案頁面,點擊「組態」。
  2. 在「Build Steps」中,新增一個「執行 Windows 批次指令」步驟,並填入觸發 GitLab 專案的CI執行指令。格式如下:
curl -X POST --fail -F token=YOUR_TRIGGER_TOKEN  -F ref=master https://gitlab.com/api/v4/projects/PROJECT_ID/trigger/pipeline

將 YOUR_TRIGGER_TOKEN 替換成你在 GitLab 中生成的 Trigger Token,PROJECT_ID 替換為 GitLab 專案的 ID(可以在 View trigger token usage examples 找到),ref 則是你要觸發的分支名稱,例如 main。

當 Jenkins Job 成功執行後,Jenkins 就會自動觸發 GitLab 的 Pipeline 來執行接下來的 CI/CD 流程。

在 README 文件中顯示 pipeline status / test coverage 標籤

前往 repository 的 Settings → CI / CD → General pipelines settings → 找到 Pipeline status 和 Coverage report。

將這兩段提供的 Markdown 語法複製到 README 中,這樣一進入 repository 就能看到專案的狀態。這些標籤對於不熟悉專案狀態的人來說非常有幫助,能快速了解 pipeline 和測試覆蓋率的情況。

Reference

鼓勵持續創作,支持化讚為賞!透過下方的 Like 拍手👏,讓創作者獲得額外收入~
版主10在2020年首次開設YouTube頻道,嘗試拍攝程式教學。想要了解更多的朋友歡迎關注我的頻道,您的訂閱就是最大的支持~如果想學其他什麼內容也歡迎許願XD
https://www.youtube.com/channel/UCSNPCGvMYEV-yIXAVt3FA5A

Search

    Table of Contents