GitLab: CI/CD

如何使用 GitLab CI/CD

👋 歡迎瀏覽 Stackhero 文件!

Stackhero 為需要快速、安全及可擴展環境的團隊,提供即用型 GitLab cloud 解決方案:

  • 無限用戶、儲存庫、數據傳輸及 CI/CD 處理時間,讓您享有完全彈性。
  • 一鍵更新,輕鬆無縫升級,確保您的環境隨時保持最新,無需停機。
  • HTTPS 保護的自訂網域名稱(例如 https://git.your-company.com),提升專業形象及安全性。
  • 您專屬的私人獨立基礎設施,確保穩定效能高度安全,完全隔離,無需擔心其他用戶影響。
  • 可選擇託管地點:🇪🇺 歐洲🇺🇸 美國,靈活配合您的合規或延遲需求。

快速開始,專注於您的程式碼。Stackhero 的 GitLab cloud hosting 解決方案約 5 分鐘即可啟用。

GitLab CI/CD 是 GitLab 的一項強大且整合的功能,GitLab 是一個廣受歡迎的開源版本控制及協作平台。這個工具讓您能夠自動化並優化軟件建構、測試及部署等關鍵階段,確保高質素應用程式能更快、更可靠地交付。

例如,透過 GitLab CI/CD,您可以設定自動化單元測試,當有新 commit 推送到 GitLab repository 時自動觸發。這些測試通過後,您的程式碼會被建構並部署到 staging 環境作進一步驗證。當所有 staging 測試都通過後,系統可以將程式碼推送到 production 環境,讓最終用戶可以使用。

GitLab CI/CD 其中一個最突出的特點是它與 GitLab 本身的緊密整合。您可以直接在專案 repository 內定義及管理 CI/CD pipeline,簡化整個工作流程的協調及追蹤。

GitLab CI/CD 支援多種程式語言、framework 及工具,靈活度高,適合不同類型的專案。其可自訂的 pipeline 系統讓您可以根據需要調整 CI/CD 流程的每個階段,無論是建構、測試還是部署到多個環境。

總結來說,GitLab CI/CD 是一個全面的解決方案,專為自動化及提升軟件交付流程而設。它讓開發人員可以專注於撰寫及改進程式碼,而平台則高效地處理運維相關的工作。

如果您的專案 repository 包含 Dockerfile 檔案,您可以自動化建構、執行,甚至(如有需要)將 Docker 映像檔發佈到 registry 的流程。

首先,請在 Stackhero dashboard 啟用「Docker in Docker」(DinD)支援。

啟用 DinD 支援會帶來安全風險,特別是當您希望隔離用戶並避免他們互相存取對方專案時。

接著,請更新您的 gitlab-ci.yml 檔案,加入使用 DinD 建構 Dockerfile 的 pipeline 設定。以下是一個範例設定:

image: docker:29

build:
  stage: build
  services:
    - name: docker:29-dind
      alias: docker
  variables:
    # 指定 docker CLI 連接 Docker-in-Docker 服務,使用其非加密(non-TLS)port。
    # 請參閱下方有關 DOCKER_HOST 重要性的說明。
    DOCKER_HOST: "tcp://docker:2375"
    DOCKER_TLS_CERTDIR: ""
  before_script:
    - docker info
  script:
    # 請將 "my-docker-image" 替換為您想要的映像檔名稱:
    - docker build -t my-docker-image .
    # 如有需要,可測試 Docker 映像檔:
    # - docker run my-docker-image /script/to/run/tests

docker:29-dind 服務會在您的 job 旁邊啟動一個 Docker daemon,而 DOCKER_HOST 會指示 docker CLI 使用這個 daemon。每當您宣告 docker:dind 服務時,請務必設定 DOCKER_HOST 如果省略這個設定,CLI 會默默連接到其他 daemon,即使服務設定錯誤,build 仍可能成功,從而隱藏真正的問題。DOCKER_TLS_CERTDIR: "" 會讓內部 job 網絡上的 2375 非加密 port 可用。

如果想要更簡單的做法,您可以完全移除 services 區塊及這兩個變數:Stackhero 的 runner 已經透過掛載的 socket 提供可即時使用的 Docker daemon,因此直接執行 docker build 就可以。

如需更多有關在 GitLab CI 中建構 Docker 映像檔的指引,請參閱 GitLab 官方文件

如果您的測試套件使用 Testcontainers,這是一個在測試期間以臨時 Docker container 啟動真實服務(如資料庫、message broker 等)的 library,上述設定已經涵蓋所需。請保留 docker:29-dind 服務及兩個變數:Testcontainers 會利用 DOCKER_HOST 連接 Docker daemon 及其啟動的 container,無需額外設定。

在 CI 忘記設定 DOCKER_HOST 是 Testcontainers 失敗的最常見原因。此時 library 會退回使用 runner 掛載的 Docker socket,導致無法連接到自己的測試 container,通常會出現 Ryuk helper container 超時的情況。