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 一起使用:
- 创建一个CI / CD 项目 .
- 通过 URL 连接您的 Git 存储库.
要将 GitLab CI / CD 与 Bitbucket Cloud 存储库一起使用:
在 GitLab 中为外部 仓库创建一个CI / CD ,选择" 按 URL 进行仓库"并创建项目.
GitLab 将导入存储库并启用Pull Mirroring .
在 GitLab 中,创建具有
api
作用域的个人访问令牌 . 这将用于验证来自 Web 钩子的请求,该请求将在 Bitbucket 中创建,以将新提交通知 GitLab.在 Bitbucket 中,从"设置">" Webhooks"中创建一个新的 Web 挂钩,以将新的提交通知 GitLab.
应该使用我们刚刚生成的用于身份验证的个人访问令牌,将 Web 挂钩 URL 设置为 GitLab API 来触发拉镜像.
https://gitlab.com/api/v4/projects/<PROJECT_ID>/mirror/pull?private_token=<PERSONAL_ACCESS_TOKEN>
网络挂钩触发器应设置为" Repository Push".
保存后,通过将更改推送到您的 Bitbucket 存储库来测试 Web 挂钩.
在 Bitbucket 中,从" Bitbucket 设置">"应用程序密码"中创建一个应用 程序密码,以验证构建状态脚本设置来提交 Bitbucket 中的构建状态. 存储库写权限是必需的.
在 GitLab 中,从设置> CI / CD>环境变量中 ,添加变量以允许通过 Bitbucket API 与 Bitbucket 通信:
BITBUCKET_ACCESS_TOKEN
:上面创建的 Bitbucket 应用密码.BITBUCKET_USERNAME
:Bitbucket 帐户的用户名.BITBUCKET_NAMESPACE
:如果您的 GitLab 和 Bitbucket 命名空间不同,请设置此项.BITBUCKET_REPOSITORY
:如果您的 GitLab 和 Bitbucket 项目名称不同,请设置此项.在 Bitbucket 中,添加脚本以将管道状态推送到 Bitbucket.
注意:在 GitLab 中所做的更改将被 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\" }"
- 仍在 Bitbucket 中,创建一个
.gitlab-ci.yml
文件以使用该脚本将管道成功与失败推送到 Bitbucket.
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
- 仍在 Bitbucket 中,创建一个
现在已将 GitLab 配置为从 Bitbucket 镜像更改,运行在.gitlab-ci.yml
配置的 CI / CD 管道,并将状态推送到 Bitbucket.