极狐GitLab CI/CD 与 Bitbucket Cloud 仓库一起使用

极狐GitLab CI/CD 可以通过以下方式与 Bitbucket Cloud 一起使用:

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

要将极狐GitLab CI/CD 与 Bitbucket Cloud 仓库一起使用:

  1. 在极狐GitLab 中,创建项目:
    1. 在极狐GitLab 中,在左侧边栏中,选择 搜索或转到 > 查看我的所有项目
    2. 在页面右侧,选择 新建项目
    3. 选择 为外部仓库运行 CI/CD
    4. 选择 仓库(URL)
    5. 使用 Bitbucket 仓库中的信息填写字段:
      • 对于 Git 仓库 URL,请使用 Bitbucket 中的克隆此仓库面板中的 URL。
      • 将用户名留空。
      • 您可以为密码字段生成,并使用 Bitbucket 应用密码

    极狐GitLab 导入存储库并启用拉取镜像。您可以通过转到 设置 > 仓库 > 镜像仓库 来检查项目的镜像是否正常工作。

  2. 在极狐GitLab 中,创建一个具有 api 范围的个人访问令牌。用于验证来自在 Bitbucket 中创建的 Webhook 的请求,通知极狐GitLab 有新提交。

  3. 在 Bitbucket 中,在 设置 > Webhook 中,创建一个新的 Webhook,通知极狐GitLab 有新提交。

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

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

    Webhook 触发器应设置为 仓库推送

    Bitbucket Cloud webhook

    保存后,通过将更改推送到您的 Bitbucket 仓库来测试 Webhook。

  4. 在 Bitbucket 中,从 Bitbucket Settings > App Passwords 创建一个 App Password,验证构建状态脚本在 Bitbucket 中设置提交构建状态。需要仓库写入权限。

    Bitbucket Cloud webhook

  5. 在极狐GitLab 中,转到 设置 > CI/CD > 变量,添加变量以允许通过 Bitbucket API 与 Bitbucket 通信:

    • BITBUCKET_ACCESS_TOKEN:上面创建的 Bitbucket app password。这个变量应该是隐藏的

    • BITBUCKET_USERNAME:Bitbucket 账户的用户名。

    • BITBUCKET_NAMESPACE:如果您的极狐GitLab 和 Bitbucket 命名空间不同,请设置此变量。

    • BITBUCKET_REPOSITORY:如果您的极狐GitLab 和 Bitbucket 项目名称不同,请设置此变量。

  6. 在 Bitbucket 中,添加脚本,将流水线状态推送到 Bitbucket。

    note 必须在 Bitbucket 中进行更改,因为当极狐GitLab 下次镜像仓库时,Bitbucket 会覆盖极狐GitLab 仓库中的任何更改。

    创建一个文件 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 中,创建一个 .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。