GitLab CI/CDをBitbucket Cloudリポジトリで使用する場合

GitLab CI/CDをBitbucket Cloudで利用するには以下の方法があります:

  1. CI/CD プロジェクトを作成します。
  2. Git リポジトリを URL で接続します。

Bitbucket CloudリポジトリでGitLab CI/CDを使うには:

  1. GitLab でプロジェクトを作成します:
    1. 左のサイドバーで、Search を選択するか、次のページに進んでください。
    2. View all my projects を選択します。
    3. ページの右側で、新規プロジェクトを選択します。
    4. Run CI/CD for external repositoryを選択します。
    5. URLでリポジトリを選択します。
    6. Bitbucketのリポジトリの情報をフィールドに入力します:
      • Git リポジトリの URL には、Bitbucket のClone this repositoryパネルにある URL を使用します。
      • ユーザー名は空白のままにしてください。
      • パスワードフィールドには、Bitbucketアプリパスワードを生成して使用できます。

    GitLab はリポジトリをインポートし、Pull Mirroring を有効にします。プロジェクトでミラーリングが機能しているかどうかは、設定 > リポジトリ > リポジトリのミラーリングで確認できます。

  2. GitLab で、api スコープでパーソナルアクセストークンを作成します。このトークンは、新しいコミットを GitLab に通知するために Bitbucket に作成した Web フックからのリクエストを認証するために使用します。

  3. BitbucketのSettings > Webhooksから、新しいコミットをGitLabに通知するための新しいWebフックを作成します。

    Web フックの URL には GitLab API を設定し、先ほど生成した Personal Access Token を認証に使ってプルミラーリングをトリガーします。

    https://gitlab.com/api/v4/projects/<PROJECT_ID>/mirror/pull?private_token=<PERSONAL_ACCESS_TOKEN>
    

    ウェブフックの Trigger は ‘Repository Push’ に設定します。

    Bitbucket Cloud webhook

    保存後、Bitbucketリポジトリに変更をプッシュしてWebフックをテストします。

  4. Bitbucket で、コミットビルドステータスを設定するビルドステータススクリプトを認証するために、Bitbucket の設定 > アプリパスワードから アプリパスワードを作成します。リポジトリへの書き込み権限が必要です。

    Bitbucket Cloud webhook

  5. GitLab では、[Settings] > [CI/CD] > [Variables] から、Bitbucket API 経由で Bitbucket と通信するための変数を追加します:

    • BITBUCKET_ACCESS_TOKEN:上記で作成した Bitbucket アプリのパスワード。この変数はマスクしてください。
    • BITBUCKET_USERNAME:Bitbucket アカウントのユーザー名。
    • BITBUCKET_NAMESPACE:GitLabとBitbucketの名前空間が異なる場合は、この変数を設定してください。
    • BITBUCKET_REPOSITORY:GitLabとBitbucketのプロジェクト名が異なる場合、この変数を設定してください。
  6. Bitbucketで、パイプラインのステータスをBitbucketにプッシュするスクリプトを追加します。スクリプトはBitbucketで作成されますが、ミラーリング処理によってGitLabミラーにコピーされます。GitLab CI/CDパイプラインはスクリプトを実行し、ステータスをBitbucketにプッシュバックします。

    ファイルbuild_status を作成し、以下のスクリプトを挿入し、ターミナルでchmod +x build_status を実行してスクリプトを実行可能にしてください。

    #!/usr/bin/env bash
       
    # Push GitLab CI/CD build status to Bitbucket Cloud
       
    if [ -z "$BITBUCKET_ACCESS_TOKEN" ]; then
       echo "ERROR: BITBUCKET_ACCESS_TOKEN is not set"
    exit 1
    fi
    if [ -z "$BITBUCKET_USERNAME" ]; then
        echo "ERROR: BITBUCKET_USERNAME is not set"
    exit 1
    fi
    if [ -z "$BITBUCKET_NAMESPACE" ]; then
        echo "Setting BITBUCKET_NAMESPACE to $CI_PROJECT_NAMESPACE"
        BITBUCKET_NAMESPACE=$CI_PROJECT_NAMESPACE
    fi
    if [ -z "$BITBUCKET_REPOSITORY" ]; then
        echo "Setting BITBUCKET_REPOSITORY to $CI_PROJECT_NAME"
        BITBUCKET_REPOSITORY=$CI_PROJECT_NAME
    fi
       
    BITBUCKET_API_ROOT="https://api.bitbucket.org/2.0"
    BITBUCKET_STATUS_API="$BITBUCKET_API_ROOT/repositories/$BITBUCKET_NAMESPACE/$BITBUCKET_REPOSITORY/commit/$CI_COMMIT_SHA/statuses/build"
    BITBUCKET_KEY="ci/gitlab-ci/$CI_JOB_NAME"
       
    case "$BUILD_STATUS" in
    running)
       BITBUCKET_STATE="INPROGRESS"
       BITBUCKET_DESCRIPTION="The build is running!"
       ;;
    passed)
       BITBUCKET_STATE="SUCCESSFUL"
       BITBUCKET_DESCRIPTION="The build passed!"
       ;;
    failed)
       BITBUCKET_STATE="FAILED"
       BITBUCKET_DESCRIPTION="The build failed."
       ;;
    esac
       
    echo "Pushing status to $BITBUCKET_STATUS_API..."
    curl --request POST "$BITBUCKET_STATUS_API" \
    --user $BITBUCKET_USERNAME:$BITBUCKET_ACCESS_TOKEN \
    --header "Content-Type:application/json" \
    --silent \
    --data "{ \"state\": \"$BITBUCKET_STATE\", \"key\": \"$BITBUCKET_KEY\", \"description\":
    \"$BITBUCKET_DESCRIPTION\",\"url\": \"$CI_PROJECT_URL/-/jobs/$CI_JOB_ID\" }"
    
  7. Bitbucket で、パイプラインの成功と失敗を Bitbucket にプッシュするスクリプトを使用するために、.gitlab-ci.yml ファイルを作成します。上で追加したスクリプトと同様に、このファイルはミラーリング処理の一部として GitLab リポジトリにコピーされます。

    stages:
      - test
      - ci_status
       
    unit-tests:
      script:
        - echo "Success. Add your tests!"
       
    success:
      stage: ci_status
      before_script:
        - ""
      after_script:
        - ""
      script:
        - BUILD_STATUS=passed BUILD_KEY=push ./build_status
      when: on_success
       
    failure:
      stage: ci_status
      before_script:
        - ""
      after_script:
        - ""
      script:
        - BUILD_STATUS=failed BUILD_KEY=push ./build_status
      when: on_failure
    

これで GitLab は Bitbucket からの変更をミラーリングし、.gitlab-ci.yml で設定した CI/CD パイプラインを実行し、ステータスを Bitbucket にプッシュするように設定されました。