GitLab 14.9で導入されました

Harbor を GitLab プロジェクトのコンテナレジストリとして使用できます。

Harborはオープンソースのレジストリで、KubernetesやDockerのようなクラウドネイティブなコンピュートプラットフォーム全体でアーティファクトを管理するのに役立ちます。

Harborインテグレーションは、GitLab CI/CDとコンテナイメージリポジトリが必要な場合に役立ちます。

前提条件

Harborインスタンスで、以下を確認してください:

  • インテグレーションするプロジェクトが作成されていること。
  • 認証されたユーザーは、Harborプロジェクトの画像をプル、プッシュ、編集する権限を持っています。

GitLab の設定

GitLabはグループやプロジェクトレベルでのHarborプロジェクトのインテグレーションをサポートしています。GitLabで以下のステップを完了してください:

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. 設定]>[インテグレーション]を選択します。
  3. Harborを選択します。
  4. インテグレーションを有効にする]で、[アクティブ]チェックボックスを選択します。
  5. Harbor の設定情報を入力します:
    • Harbor URL:このGitLabプロジェクトにリンクされているHarborインスタンスのベースURL。例えば、https://harbor.example.net.
    • Harbor プロジェクト名: Harbor インスタンスのプロジェクト名。例えば、testproject
    • ユーザー名: Harbor インスタンスでのユーザー名。
    • パスワード:ユーザー名のパスワード。
  6. 変更を保存を選択します。

Harborインテグレーションがアクティブになりました:

  • CI/CD 用のグローバル変数$HARBOR_USERNAME,$HARBOR_HOST,$HARBOR_OCI,$HARBOR_PASSWORD,$HARBOR_URL,$HARBOR_PROJECT が作成されます。
  • プロジェクトレベルのインテグレーション設定は、グループレベルのインテグレーション設定を上書きします。

セキュリティに関する考慮事項

Harbor APIへのリクエストのセキュリティ

Harborインテグレーションを介した各APIリクエストについて、Harbor APIへの接続のための認証情報は、username:password の組み合わせを使用します。以下は安全に使用するための提案です:

  • 接続するHarbor APIではTLSを使用してください。
  • 認証情報は最小特権の原則に従ってください。
  • 資格情報のローテーションポリシーを設定してください。

CI/CD 変数のセキュリティ

.gitlab-ci.yml ファイルにプッシュされた悪意のあるコードによって、$HARBOR_PASSWORDを含む変数が危険にさらされ、サードパーティのサーバーに送信される可能性があります。詳細はCI/CD変数セキュリティを参照してください。

CI/CD における Harbor 変数の例

kanikoを使ったDockerイメージのプッシュ

詳細については、Dockerイメージのビルドにkanikoを使用するを参照してください。

docker:
  stage: docker
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: ['']
  script:
    - mkdir -p /kaniko/.docker
    - echo "{\"auths\":{\"${HARBOR_HOST}\":{\"auth\":\"$(echo -n ${HARBOR_USERNAME}:${HARBOR_PASSWORD} | base64)\"}}}" > /kaniko/.docker/config.json
    - >-
      /kaniko/executor
      --context "${CI_PROJECT_DIR}"
      --dockerfile "${CI_PROJECT_DIR}/Dockerfile"
      --destination "${HARBOR_HOST}/${HARBOR_PROJECT}/${CI_PROJECT_NAME}:${CI_COMMIT_TAG}"
  rules:
  - if: $CI_COMMIT_TAG

OCIレジストリでHelmチャートをプッシュします。

HelmはデフォルトでOCIレジストリをサポートしています。OCIはHarbor 2.0以降でサポートされています。OCIについて詳しくはHelmのブログやドキュメントをご覧ください。

helm:
  stage: helm
  image:
    name: dtzar/helm-kubectl:latest
    entrypoint: ['']
  variables:
    # Enable OCI support (not required since Helm v3.8.0)
    HELM_EXPERIMENTAL_OCI: 1
  script:
    # Log in to the Helm registry
    - helm registry login "${HARBOR_URL}" -u "${HARBOR_USERNAME}" -p "${HARBOR_PASSWORD}"
    # Package your Helm chart, which is in the `test` directory
    - helm package test
    # Your helm chart is created with <chart name>-<chart release>.tgz
    # You can push all building charts to your Harbor repository
    - helm push test-*.tgz ${HARBOR_OCI}/${HARBOR_PROJECT}