【问题标题】:Jenkins Job DSL Git Plugin - How to merge before buildJenkins Job DSL Git 插件 - 如何在构建之前合并
【发布时间】:2019-05-01 18:53:03
【问题描述】:

首先,这不是“构建前合并”功能的重复问题。我搜索并查看了我发现的有关此功能的所有内容。但是没有人谈论我的问题。

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

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 和开发人员正在处理的分支。

目标:我想要一个由 Bitbucket 服务器为每个拉取请求触发的工作。在工作中,我想检查 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 后,正在再次检查原始提交 (git checkout -f 1606dd8) 并继续构建。日志显示它确实是没有从 master 构建的分支更改的代码。

问题:
1. 合并后为什么要检出原来的commit?为什么不继续在合并后的代码上构建?
2. 如何使mergeOptions 中的branch 参数动态化,使其始终是拉取请求中的other 分支?

谢谢。

【问题讨论】:

    标签: jenkins jenkins-job-dsl


    【解决方案1】:

    我不知道为什么,但它以某种方式解决了问题。将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"
    

    【讨论】:

      【解决方案2】:
      > 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 Plugin 非常冗长,但它创建了一个新的存储库,获取所有分支和标签,但还没有本地分支,只有远程引用。

      > git checkout -f 663303d
      

      检查提交,但没有可用的本地分支。我们现在处于超然状态,因为没有本地分支机构。

      > git checkout -b master 663303d
      

      从以前签出的(分离的头)提交 663303d 创建本地分支 master

      Git Plugin 这样做的原因是他们以这种方式实现了它。如果您想澄清,可以给他们留言。

      Why did my Git repo enter a detached HEAD state?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-24
        • 1970-01-01
        • 1970-01-01
        • 2021-06-03
        • 2016-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多