Jenkins Job DSL Git插件 - 构建之前如何合并



首先,这不是"构建之前合并"功能的重复问题。我谷歌搜索并查看了有关此功能的任何发现。但是没有人谈论我的问题。

我们有Bitbuck Server Jenkins,我在Bitbucket上为PRS写了一份工作:

job('pull-request-job') {
    scm {
        git {
            remote {
                name 'origin'
                credentials 'jenkins-ssh'
                url 'ssh://git@stash.example.com/my/repository.git'
                refspec '+refs/pull-requests/*/from:refs/remotes/*'
            }
            branch '**/pull-requests/**'
            extensions {
                mergeOptions {
                    remote 'origin'
                    branch 'master'
                }
            }
        }
    }
    triggers {
        scm ''
    }
    steps {
        shell './mvnw -e clean verify'
    }
}

快速注意:我们不练习gitflow或类似的东西。通常(尽管并非总是如此(只是一个master,开发人员正在工作。

目标:我想为每种拉式重新设备触发的作业。在工作中,我想检查my分支(我工作的一个分支,并将合并到master分支(并运行测试。默认配置可以很好地完成工作。现在,在运行测试之前,我想将master分支(或将合并到my分支的任何其他分支(的最新更改到my分支。我怎样才能做到这一点?拥有以上职位描述行不通。构建的一个例子是:

commit notification 1606dd8
[EnvInject] - Loading node environment variables.
Building in workspace /var/lib/jenkins/workspace/pull-request-job
using credential jenkins-ssh
> git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
> git config remote.origin.url ssh://git@stash.example.com/my/repository.git # timeout=10
Fetching upstream changes from ssh://git@stash.example.com/my/repository.git
> git --version # timeout=10
using GIT_SSH to set credentials Jenkins User SSH Private Key
> git fetch --tags --progress ssh://git@stash.example.com/my/repository.git +refs/pull-requests/*/from:refs/remotes/*
> git rev-parse 1606dd8^{commit} # timeout=10
> git branch -a -v --no-abbrev --contains 1606dd8 # timeout=10
Merging Revision 1606dd8 (3, 2, 1) to origin/master, UserMergeOptions{mergeRemote='origin', mergeTarget='master', mergeStrategy='default', fastForwardMode='--ff'}
> git rev-parse origin/master^{commit} # timeout=10
> git config core.sparsecheckout # timeout=10
> git checkout -f origin/master
> git merge --ff 1606dd8 # timeout=10
> git rev-parse HEAD^{commit} # timeout=10
Seen branch in repository 1
Seen branch in repository 2
Seen branch in repository 3
Seen branch in repository origin/master
Seen 4 remote branches
> git show-ref --tags -d # timeout=10
Checking out Revision 1606dd8 (1, 2, 3, origin/master)
> git config core.sparsecheckout # timeout=10
> git checkout -f 1606dd8
Commit message: "Upgrade maven"
> git rev-list --no-walk 1606dd8 # timeout=10
> git rev-list --no-walk 1606dd8 # timeout=10
> git rev-list --no-walk 1606dd8 # timeout=10
[pull-request-job] $ /bin/sh -xe /tmp/jenkins3480907669634770028.sh
+ ./mvnw -e clean verify

登录后,詹金斯(Jenkins(将我的分支合并到master后,将再次检查origianl commit(git checkout -f 1606dd8(并继续构建。日志表明它确实是代码没有构建master分支的更改。

问题:
1.为什么在合并后检查原始提交?为什么不继续在合并代码上构建?
2.如何在mergeOptions中进行branch参数,以使其始终是Pull-Request中的其他分支?

谢谢。

我不知道为什么,但是它以某种方式解决了问题。将localBranch添加到scm.git.extensions条目:

    extensions {
      cleanBeforeCheckout()
      localBranch() // or localBranch('${PR_DESTINATION}')
      mergeOptions {
        remote('origin')
        branch('${PR_DESTINATION}')
      }
    }

,日志为:

commit notification 1606dd8
[EnvInject] - Loading node environment variables.
Building in workspace /var/lib/jenkins/workspace/rad-test-1-pr
[WS-CLEANUP] Deleting project workspace...
[WS-CLEANUP] Deferred wipeout is used...
using credential jenkins-ssh
Cloning the remote Git repository
Cloning repository ssh://git@stash.example.com/my/repository.git
> git init /var/lib/jenkins/workspace/rad-test-1-pr # timeout=10
Fetching upstream changes from ssh://git@stash.example.com/my/repository.git
> git --version # timeout=10
using GIT_SSH to set credentials Jenkins User SSH Private Key
> git fetch --tags --progress ssh://git@stash.example.com/my/repository.git +refs/heads/*:refs/remotes/origin/*
> git config remote.origin.url ssh://git@stash.example.com/my/repository.git # timeout=10
> git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
> git config remote.origin.url ssh://git@stash.example.com/my/repository.git # timeout=10
Cleaning workspace
> git rev-parse --verify HEAD # timeout=10
No valid HEAD. Skipping the resetting
> git clean -fdx # timeout=10
Fetching upstream changes from ssh://git@stash.example.com/my/repository.git
using GIT_SSH to set credentials Jenkins User SSH Private Key
> git fetch --tags --progress ssh://git@stash.example.com/my/repository.git +refs/pull-requests/*/from:refs/remotes/*
> git rev-parse 1606dd8^{commit} # timeout=10
> git branch -a -v --no-abbrev --contains 1606dd8 # timeout=10
Merging Revision 1606dd8 (4, 3, 2, 1, origin/first-branch) to origin/master, UserMergeOptions{mergeRemote='origin', mergeTarget='master', mergeStrategy='default', fastForwardMode='--ff'}
> git rev-parse origin/master^{commit} # timeout=10
> git config core.sparsecheckout # timeout=10
> git checkout -f origin/master
> git merge --ff 1606dd8 # timeout=10
> git rev-parse HEAD^{commit} # timeout=10
Seen branch in repository 1
Seen branch in repository 2
Seen branch in repository 3
Seen branch in repository 4
Seen branch in repository origin/first-branch
Seen branch in repository origin/master
Seen 6 remote branches
> git show-ref --tags -d # timeout=10
Checking out Revision 663303d (origin/master)
> git config core.sparsecheckout # timeout=10
> git checkout -f 663303d
> git branch -a -v --no-abbrev # timeout=10
> git checkout -b master 663303d
Commit message: "Merge commit '1606dd8' into HEAD"
> git config core.sparsecheckout 
// Checked out but no local branch yet
> git checkout -f 663303d
// Only when local branch is defined
> git branch -a -v --no-abbrev 
// Checkout 663303d into local branch master
> git checkout -b master 663303d

git插件非常详细,但是它创建了一个新的存储库来获取所有分支和标签,但尚无本地分支,只有远程引用。

> git checkout -f 663303d

检查提交,但没有可用的本地分支。我们现在在一个独立的头上,因为没有本地分支。

> git checkout -b master 663303d

从以前的签出(独立头(提交663303d

中创建本地分支机构大师

git插件这样做的原因是他们已经这样实现了。如果您想澄清一下,也许会给他们留言。

为什么我的git回购进入独立的头状态?

最新更新