Using GitLab CI/CD with a Bitbucket Cloud repository

原文:https://docs.gitlab.com/ee/ci/ci_cd_for_external_repos/bitbucket_integration.html

Using GitLab CI/CD with a Bitbucket Cloud repository

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

  1. 创建一个CI / CD 项目 .
  2. 通过 URL 连接您的 Git 存储库.

要将 GitLab CI / CD 与 Bitbucket Cloud 存储库一起使用:

  1. 在 GitLab 中为外部 仓库创建一个CI / CD ,选择” 按 URL 进行仓库”并创建项目.

    Create project

    GitLab 将导入存储库并启用Pull Mirroring .

  2. 在 GitLab 中,创建具有api作用域的个人访问令牌 . 这将用于验证来自 Web 钩子的请求,该请求将在 Bitbucket 中创建,以将新提交通知 GitLab.

  3. 在 Bitbucket 中,从“设置”>” Webhooks”中创建一个新的 Web 挂钩,以将新的提交通知 GitLab.

    应该使用我们刚刚生成的用于身份验证的个人访问令牌,将 Web 挂钩 URL 设置为 GitLab API 来触发拉镜像.

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

    网络挂钩触发器应设置为” Repository Push”.

    Bitbucket Cloud webhook

    保存后,通过将更改推送到您的 Bitbucket 存储库来测试 Web 挂钩.

  4. 在 Bitbucket 中,从” Bitbucket 设置”>”应用程序密码”中创建一个应用 程序密码,以验证构建状态脚本设置来提交 Bitbucket 中的构建状态. 存储库写权限是必需的.

    Bitbucket Cloud webhook

  5. 在 GitLab 中,从设置> CI / CD>环境变量中 ,添加变量以允许通过 Bitbucket API 与 Bitbucket 通信:

    BITBUCKET_ACCESS_TOKEN :上面创建的 Bitbucket 应用密码.

    BITBUCKET_USERNAME :Bitbucket 帐户的用户名.

    BITBUCKET_NAMESPACE :如果您的 GitLab 和 Bitbucket 命名空间不同,请设置此项.

    BITBUCKET_REPOSITORY :如果您的 GitLab 和 Bitbucket 项目名称不同,请设置此项.

  6. 在 Bitbucket 中,添加脚本以将管道状态推送到 Bitbucket.

    注意:在 GitLab 中所做的更改将被 Bitbucket 在上游进行的任何更改所覆盖.

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

    1. #!/usr/bin/env bash
    2. # Push GitLab CI/CD build status to Bitbucket Cloud
    3. if [ -z "$BITBUCKET_ACCESS_TOKEN" ]; then echo "ERROR: BITBUCKET_ACCESS_TOKEN is not set"
    4. exit 1
    5. fi
    6. if [ -z "$BITBUCKET_USERNAME" ]; then echo "ERROR: BITBUCKET_USERNAME is not set"
    7. exit 1
    8. fi
    9. if [ -z "$BITBUCKET_NAMESPACE" ]; then echo "Setting BITBUCKET_NAMESPACE to $CI_PROJECT_NAMESPACE"
    10. BITBUCKET_NAMESPACE=$CI_PROJECT_NAMESPACE
    11. fi
    12. if [ -z "$BITBUCKET_REPOSITORY" ]; then echo "Setting BITBUCKET_REPOSITORY to $CI_PROJECT_NAME"
    13. BITBUCKET_REPOSITORY=$CI_PROJECT_NAME
    14. fi BITBUCKET_API_ROOT="https://api.bitbucket.org/2.0"
    15. BITBUCKET_STATUS_API="$BITBUCKET_API_ROOT/repositories/$BITBUCKET_NAMESPACE/$BITBUCKET_REPOSITORY/commit/$CI_COMMIT_SHA/statuses/build"
    16. BITBUCKET_KEY="ci/gitlab-ci/$CI_JOB_NAME"
    17. case "$BUILD_STATUS" in running)
    18. BITBUCKET_STATE="INPROGRESS"
    19. BITBUCKET_DESCRIPTION="The build is running!"
    20. ;;
    21. passed)
    22. BITBUCKET_STATE="SUCCESSFUL"
    23. BITBUCKET_DESCRIPTION="The build passed!"
    24. ;;
    25. failed)
    26. BITBUCKET_STATE="FAILED"
    27. BITBUCKET_DESCRIPTION="The build failed."
    28. ;;
    29. esac
    30. echo "Pushing status to $BITBUCKET_STATUS_API..."
    31. curl --request POST $BITBUCKET_STATUS_API \
    32. --user $BITBUCKET_USERNAME:$BITBUCKET_ACCESS_TOKEN \
    33. --header "Content-Type:application/json" \
    34. --silent \
    35. --data "{ \"state\": \"$BITBUCKET_STATE\", \"key\": \"$BITBUCKET_KEY\", \"description\": \"$BITBUCKET_DESCRIPTION\",\"url\": \"$CI_PROJECT_URL/-/jobs/$CI_JOB_ID\" }"
  7. 仍在 Bitbucket 中,创建一个.gitlab-ci.yml文件以使用该脚本将管道成功与失败推送到 Bitbucket.

    1. stages:
    2. - test
    3. - ci_status
    4. unit-tests:
    5. script:
    6. - echo "Success. Add your tests!"
    7. success:
    8. stage: ci_status
    9. before_script:
    10. - ""
    11. after_script:
    12. - ""
    13. script:
    14. - BUILD_STATUS=passed BUILD_KEY=push ./build_status
    15. when: on_success
    16. failure:
    17. stage: ci_status
    18. before_script:
    19. - ""
    20. after_script:
    21. - ""
    22. script:
    23. - BUILD_STATUS=failed BUILD_KEY=push ./build_status
    24. when: on_failure

现在已将 GitLab 配置为从 Bitbucket 镜像更改,运行在.gitlab-ci.yml配置的 CI / CD 管道,并将状态推送到 Bitbucket.