如何在Jenkins pipeline中执行git合并?

4
当Jenkins构建非主分支git时,我希望在特定的位置自动合并到主分支。我不想使用git插件的自动合并功能。然而,我已经添加了一个阶段:
stage('Merge master') {
  sh 'git merge master'
}

但是我遇到了一个错误:
merge: master - not something we can merge

Jenkins似乎以一种奇怪的方式检出我的分支,这使得我无法将主分支合并到我的分支中。我需要做什么才能将主分支合并到我的分支中?

3个回答

2
当Jenkins克隆您的repo时,它没有检出本地master分支。
以下脚本应该可以让您测试主分支的合并。
git fetch --all
git checkout master
git checkout branch-name
git merge master

这值得一试,但由于显然 Jenkins 没有看到master的远程引用(请参见我答案中的评论),我怀疑这不足以解决问题。可能是使用了不包括master的 refspec 进行克隆,或者根本没有克隆(而是进行了选择性获取)。 - Mark Adelsberger
1
是的,这个也不行。我收到了一个错误:fatal: could not read Username for 'https://github.com': No such device or address. error: Could not fetch origin - jbrown
@jbrown,你的凭据可能没有设置好,因为这是git想要询问你“https://github.com”的用户名的阶段,但由于它正在Jenkins节点上运行,没有控制台可以执行此操作。你需要使用令牌或在Jenkins节点上设置私钥并将其添加到GitHub。 - MaratC

1
我相信你只需要使用Git插件就能完成此操作。在“附加行为”下,有一个选项叫做“构建前合并”。此外,你可能可以在流水线脚本中借用此功能。

3
我不想使用git插件的自动合并功能。 - jbrown

1
Jenkins 可能只是将其头设置为远程分支引用,而不是创建本地分支。
在我介绍如何解决这个问题之前,您是否考虑过如果合并遇到冲突会发生什么?因为很可能会使您的构建服务器处于意外状态,需要手动清理。这就是为什么除了本地交互式合并外,不典型进行其他合并的原因。

更新:以下内容保留自我的原始答案,仅供完整性参考,但并不起作用:

If you want to try in spite of that, you might need to say something like

git merge origin/master

看起来 Jenkins 可能正在执行以下三种操作之一:

它可能使用的远程名称不是 origin。如果只是这样,那么 Edmund Dipple 的答案应该有所帮助。

它可能使用了像 --single-branch 这样的选项进行克隆,或者以其他方式配置了远程的 refspec,以使 master 不被获取。在这种情况下,您必须自己重新配置存储库,或包含一个明确的 refspec 来获取。

它可能根本没有进行克隆。就如第二种情况一样,你需要解决这个问题;我想我要补充的主要是,这可能是因为远程没有配置。

因此,在我看来,下一步应该让您的构建脚本显示本地仓库的配置 (git config -l),查找 remotefetch 设置,并从那里确定下一步操作。


是的,我希望在合并冲突出现时它能够失败并向开发人员发出警报,以便他们可以尽早修复。这仅在非稳定、非主分支上运行。 - jbrown
我得到了几乎相同的错误:merge: origin/master - not something we can merge - jbrown
好的,这很快就变成了一个Jenkins问题... Jenkins 要么(a)使用除 origin 以外的远程名称,要么(b)以某种方式克隆存储库,只看到它正在构建的分支的Ref。将会更新更多的建议。 - Mark Adelsberger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接