Help us learn about your current experience with the documentation. Take the survey.

使用 GitLab CI/CD 与 Bitbucket Cloud 仓库

  • 层级:Premium, Ultimate
  • 提供:GitLab.com, GitLab Self-Managed, GitLab Dedicated

GitLab CI/CD 可以通过以下方式与 Bitbucket Cloud 结合使用:

  1. 创建一个 CI/CD 项目
  2. 通过 URL 连接你的 Git 仓库。

要使用 GitLab CI/CD 与 Bitbucket Cloud 仓库:

  1. 在 Bitbucket 中,创建一个 应用密码 来验证设置提交构建状态的脚本。需要仓库写入权限。

    Bitbucket Cloud webhook

  2. 在 Bitbucket 中,从你的仓库选择 Clone,然后复制 git clone 后面的 URL。

  3. 在 GitLab 中创建一个项目:

    1. 在左侧栏顶部,选择 Create new ( plus ) 和 New project/repository
    2. 选择 为外部仓库运行 CI/CD
    3. 选择 通过 URL 的仓库
    4. 完成以下字段:
      • 对于 Git repository URL,输入你的 Bitbucket 仓库 URL。确保删除你的 @username
      • 对于 Username,输入与应用密码关联的用户名。
      • 对于 Password,输入来自 Bitbucket 的应用密码。

    GitLab 导入仓库并启用 Pull Mirroring。 你可以在项目的 Settings > Repository > Mirroring repositories 中检查镜像是否正常工作。

  4. 在 GitLab 中,创建一个具有 api 范围的 personal access token。 该令牌用于验证从 Bitbucket 创建的 Webhook 请求,以通知 GitLab 新的提交。

  5. 在 Bitbucket 中,从 Settings > Webhooks,创建一个新的 Webhook 来通知 GitLab 新的提交。

    Webhook URL 应设置为 GitLab API 以触发拉取镜像,使用我们刚刚生成的个人访问令牌进行身份验证。

    https://gitlab.example.com/api/v4/projects/:project_id/mirror/pull?private_token=<your_personal_access_token>

    Webhook 触发器应设置为 Repository Push

    Bitbucket Cloud webhook

    保存后,通过向你的 Bitbucket 仓库推送更改来测试 Webhook。

  6. 在 GitLab 中,从 Settings > CI/CD > Variables,添加变量以允许通过 Bitbucket API 与 Bitbucket 通信:

    • BITBUCKET_ACCESS_TOKEN: 之前创建的 Bitbucket 应用密码。此变量应被 masked
    • BITBUCKET_USERNAME: Bitbucket 账户的用户名。
    • BITBUCKET_NAMESPACE: 如果你的 GitLab 和 Bitbucket 命名空间不同,请设置此变量。
    • BITBUCKET_REPOSITORY: 如果你的 GitLab 和 Bitbucket 项目名称不同,请设置此变量。
  7. 在 Bitbucket 中,添加一个将管道状态推送到 Bitbucket 的脚本。该脚本在 Bitbucket 中创建,但镜像过程会将其复制到 GitLab 镜像。GitLab CI/CD 管道运行该脚本,并将状态推回 Bitbucket。

    创建一个 build_status 文件,插入以下脚本,并在终端中运行 chmod +x build_status 使脚本可执行。

    #!/usr/bin/env bash
    
    # 将 GitLab CI/CD 构建状态推送到 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\" }"
  8. 在 Bitbucket 中,创建一个 .gitlab-ci.yml 文件,使用该脚本将管道成功和失败状态推送到 Bitbucket。与之前添加的脚本类似,此文件作为镜像过程的一部分被复制到 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。