【问题标题】:Bitbucket pipeline - possibility to merge one branch to anotherBitbucket 管道 - 将一个分支合并到另一个分支的可能性
【发布时间】:2017-05-13 14:32:11
【问题描述】:

我有一个包含两个分支的存储库:ma​​sterDev,我想以这样一种方式配置该管道,以便当我将代码推送到 Dev 分支和代码构建成功,Dev 合并到 ma​​ster。不幸的是,我在 bitbucket piplines docs 中找不到任何有关合并的信息。

这是我的 yml 文件:

pipelines:
  branches:
    Dev:
      - step:
          script:
            - ant deployCodeCheckOnly -Dsf.username=$SF_USERNAME -Dsf.password=$SF_PASSWORD

有人可以帮我处理这个案子吗?可以吗?

--编辑

我尝试按照建议更改脚本:

pipelines:
  branches:
    Dev:
      - step:
          script:
            - ant deployCodeCheckOnly -Dsf.username=$SF_USERNAME -Dsf.password=$SF_PASSWORD
            - git remote -v
            - git fetch
            - git checkout master
            - git merge Dev
            - git push -v --tags origin master:master

结果:

git remote -v
+ git remote -v
origin  git@bitbucket.org:repository/project.git (fetch)
origin  git@bitbucket.org:repository/project.git (push)

git fetch origin
+ git fetch origin
Warning: Permanently added the RSA host key for IP address ..... to the list of known hosts.

还有错误:

+ git checkout master
error: pathspec 'master' did not match any file(s) known to git.

--解决方案

  Dev:
       - step:
           script:
            - ant deployCodeCheckOnly -Dsf.username=$SF_USERNAME Dsf.password=$SF_PASSWORD
             - git fetch
             - git checkout -b master
             - git merge Dev
             - git push -v --tags origin master:master

【问题讨论】:

  • git checkout master 失败并出现pathspec 错误但git checkout -b master 成功的原因是因为 Bitbucket Pipelines 仅将正在构建的分支拉到运行管道的构建代理。它的 repo 克隆中没有 master 分支,所以你必须创建它。然后表明你的推送应该去上游origin master

标签: bitbucket bitbucket-pipelines


【解决方案1】:

我遇到了同样的问题,但想使用拉取请求而不是简单的 git 合并。所以我最终使用了 bitbucket API 来完成这项工作:

1。创建“应用密码”

创建“应用密码”,这样您就不必将自己的凭据推送到管道 (bitbucket 设置 -> 应用密码)

2。为管道设置环境变量

  • BB_USER = 您的用户名
  • BB_PASSWORD = 应用密码

3。创建 bash 脚本

我有一个 bash 脚本,它从 $BITBUCKET_BRANCH 创建拉取请求并立即合并它

#!/usr/bin/env bash # 如果任何命令以非零状态退出,则立即退出 # 例如由于冲突,拉取请求合并失败 设置-e # 设置目标分支 DEST_BRANCH=$1 # 创建新的拉取请求并获取其 ID echo "创建 PR:$BITBUCKET_BRANCH -> $DEST_BRANCH" PR_ID=`curl -X POST https://api.bitbucket.org/2.0/repositories/$BITBUCKET_REPO_OWNER/$BITBUCKET_REPO_SLUG/pullrequests \ --失败 --show-error --silent \ --用户 $BB_USER:$BB_PASSWORD \ -H '内容类型:应用程序/json' \ -d'{ "title": "'$BITBUCKET_BRANCH' -> '$DEST_BRANCH'", "description": "管道自动 PR", “状态”:“打开”, “目的地”: { “分支”: { "名称": "'$DEST_BRANCH'" } }, “资源”: { “分支”: { "名称": "'$BITBUCKET_BRANCH'" } } }'\ | sed -E "s/.*\"id\": ([0-9]+).*/\1/g"` # 合并 PR echo "合并 PR: $PR_ID" curl -X POST https://api.bitbucket.org/2.0/repositories/$BITBUCKET_REPO_OWNER/$BITBUCKET_REPO_SLUG/pullrequests/$PR_ID/merge \ --失败 --show-error --silent \ --用户 $BB_USER:$BB_PASSWORD \ -H '内容类型:应用程序/json' \ -d'{ “close_source_branch”:假, “merge_strategy”:“merge_commit” }'

4。终于在管道中

只需调用脚本:

开发: - 步: 脚本: - ./merge.sh 大师

好处:

  • 如果发生冲突,管道将失败(如果您希望它失败)
  • 更好地控制正在发生的事情

【讨论】:

    【解决方案2】:

    在 YAML 配置的“脚本”部分,你可以或多或少地做任何你可以在 shell 上做的事情,所以(虽然我从未尝试过)看不出为什么不应该这样做的原因可能。

    换句话说,你必须:

    • 将分支切换到master
    • 合并开发(可选,使用预定义的BITBUCKET_COMMIT 环境变量,它标识您的dev 提交)
    • 提交给master(也可能推送)

    由于gitscript 中可用,您可以使用普通的 git 命令,不需要任何特定于 Bb 管道的东西,如下所示:

     script:
        - git fetch
        - git checkout -b master
        - git merge Dev
        - git push -v --tags origin master:master
    

    为确保仅在您的 Ant 作业成功时执行此操作,您应确保在发生错误时您将获得非零退出状态(我假设这是 Ant 的默认行为)。

    【讨论】:

    • 我把事情简化了一点。您的分支master 不会自动出现,但您必须首先git fetch(远程已定义,但是:您必须插入部署密钥,否则不允许您从中获取遥控器),然后才能git checkout master
    • 我尝试了很多东西。请再次查看我的编辑,并建议我管道的外观。谢谢。
    • 还有一件事:'git branch' 检索:Dev 和 remotes/origin/Dev
    • 好的。我找到了解决方案。请查看它,并确认它是否是一个好方法。
    • 我不知道这是否是一个好的解决方案,因为我自己从未尝试过这样做。但如果它对你有用,那也不会太糟糕 ;-) [而且它看起来很简单,所以我看不出有什么可担心的。]
    猜你喜欢
    • 1970-01-01
    • 2015-10-06
    • 2013-11-09
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    相关资源
    最近更新 更多