解決使用 GitLab CI 整合 Harbor 出現的奇怪問題:帳號中的 “$” 符號

引言:

在進行使用 GitLab CI 整合 Harbor 的過程中,我意外地踩到了一個奇怪的 Bug。這個問題源自於 Harbor 的 Robot Account,當中包含 “$” 符號,導致在 GitLab CI 中出現身份驗證錯誤。在這篇文章中,我將分享我的發現和解決方法,同時介紹 Harbor 和 GitLab CI 的基本概念,以及如何最有效地配置它們。

發現問題:帳號中的 “$” 符號引起的身份驗證錯誤

在使用 Harbor 的 Robot Account 時,我發現創建的帳號名稱包含 “$” 符號,例如 robot$gitlab-ci。我將這個帳號直接放到 GitLab CI 的變數中,但每次執行時都會遇到以下錯誤:

Error response from daemon: Get "https://harbor.clarence.tw/v2/": unauthorized: authentication required

解決方法:使用雙 “$” 符號和 –password-stdin

通過參考 Harbor GitHub Issue #9732,我發現解決方法是在 GitLab CI 專案的 Runner 環境設置中使用雙 “$$” 符號,並結合 --password-stdin,例如:

echo "$HARBOR_PASSWORD" | docker login -u robot$$gitlab-ci --password-stdin harbor.clarence.tw

這樣就能正常登錄而不再出現身份驗證錯誤。

Docker 登入提示輸入的情況

在解決問題之前,我試圖直接使用以下命令登入 Harbor,卻發現它提示輸入帳號和密碼,並成功登入:

sudo docker login harbor.clarence.tw
Username: robot$gitlab-ci
Password:

這是因為 Docker 在交互模式下可以處理特殊符號的輸入,但在 CI/CD 環境下可能會遇到問題,因此建議使用雙 “$$” 符號的方式在腳本中處理登入。

了解 Harbor 和 GitLab CI

在解決問題之前,讓我們先簡單介紹一下 Harbor 和 GitLab CI。

Harbor 是什麼?

Harbor 是一個企業級的容器倉庫,它提供了安全、可信賴的容器映像管理和分發。使用 Harbor,您可以方便地存儲、分享和分發 Docker 鏡像。

GitLab CI 是什麼?

GitLab CI/CD 是 GitLab 提供的持續集成和持續交付工具。它允許您定義、測試和部署您的代碼,並與 GitLab 存儲庫集成。

如何配置 GitLab CI 以整合 Harbor

在您的 GitLab CI 設置中,確保在使用 Harbor 的 Robot Account 時使用雙 “$$” 符號和 --password-stdin,以避免身份驗證問題。以下是一個簡單的例子:

stages:
  - build

build_image:
  stage: build
  script:
    - echo "$HARBOR_PASSWORD" | docker login -u robot$$gitlab-ci --password-stdin harbor.clarence.tw
    - docker build -t harbor.clarence.tw/myproject/myimage:latest .
    - docker push harbor.clarence.tw/myproject/myimage:latest

總結

這次的 Bug 雖然讓我花了一些時間來解決,但通過在 GitLab CI 的 Runner 環境設置中使用雙 “$$” 符號和 --password-stdin,我成功地解決了身份驗證問題。希望這篇文章對遇到類似問題的人有所幫助。