使用 GitLab CI/CD 与 Bitbucket Cloud 仓库
- 层级:Premium, Ultimate
- 提供:GitLab.com, GitLab Self-Managed, GitLab Dedicated
GitLab CI/CD 可以通过以下方式与 Bitbucket Cloud 结合使用:
- 创建一个 CI/CD 项目。
- 通过 URL 连接你的 Git 仓库。
要使用 GitLab CI/CD 与 Bitbucket Cloud 仓库:
-
在 Bitbucket 中,创建一个 应用密码 来验证设置提交构建状态的脚本。需要仓库写入权限。
-
在 Bitbucket 中,从你的仓库选择 Clone,然后复制
git clone后面的 URL。 -
在 GitLab 中创建一个项目:
- 在左侧栏顶部,选择 Create new ( ) 和 New project/repository。
- 选择 为外部仓库运行 CI/CD。
- 选择 通过 URL 的仓库。
- 完成以下字段:
- 对于 Git repository URL,输入你的 Bitbucket 仓库 URL。确保删除你的
@username。 - 对于 Username,输入与应用密码关联的用户名。
- 对于 Password,输入来自 Bitbucket 的应用密码。
- 对于 Git repository URL,输入你的 Bitbucket 仓库 URL。确保删除你的
GitLab 导入仓库并启用 Pull Mirroring。 你可以在项目的 Settings > Repository > Mirroring repositories 中检查镜像是否正常工作。
-
在 GitLab 中,创建一个具有
api范围的 personal access token。 该令牌用于验证从 Bitbucket 创建的 Webhook 请求,以通知 GitLab 新的提交。 -
在 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 仓库推送更改来测试 Webhook。
-
在 GitLab 中,从 Settings > CI/CD > Variables,添加变量以允许通过 Bitbucket API 与 Bitbucket 通信:
BITBUCKET_ACCESS_TOKEN: 之前创建的 Bitbucket 应用密码。此变量应被 masked。BITBUCKET_USERNAME: Bitbucket 账户的用户名。BITBUCKET_NAMESPACE: 如果你的 GitLab 和 Bitbucket 命名空间不同,请设置此变量。BITBUCKET_REPOSITORY: 如果你的 GitLab 和 Bitbucket 项目名称不同,请设置此变量。
-
在 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\" }" -
在 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。