242.md 5.3 KB
Newer Older
Lab机器人's avatar
readme  
Lab机器人 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
# Using GitLab CI/CD with a Bitbucket Cloud repository

> 原文:[https://docs.gitlab.com/ee/ci/ci_cd_for_external_repos/bitbucket_integration.html](https://docs.gitlab.com/ee/ci/ci_cd_for_external_repos/bitbucket_integration.html)

# Using GitLab CI/CD with a Bitbucket Cloud repository[](#using-gitlab-cicd-with-a-bitbucket-cloud-repository-premium "Permalink")

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

1.  创建一个[CI / CD 项目](../../user/project/ci_cd_for_external_repo.html) .
2.  通过 URL 连接您的 Git 存储库.

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

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

    [![Create project](img/d4fcdfd2497a9936b17469dbafbd320e.png)](img/external_repository.png)

    GitLab 将导入存储库并启用[Pull Mirroring](../../user/project/repository/repository_mirroring.html#pulling-from-a-remote-repository-starter) .

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

3.  在 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 Cloud webhook](img/3a328cbf9c83e567fa5921d3580a84cb.png)](img/bitbucket_webhook.png)

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

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

    [![Bitbucket Cloud webhook](img/0d3f7491de96f0f5d1d30a594ec42739.png)](img/bitbucket_app_password.png)

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`以使脚本可执行.

    ```
    #!/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.

    ```
    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.