来自SCM的Jenkins管道在不同分支中不起作用

时间:2018-03-08 14:40:13

标签: jenkins groovy jenkins-pipeline

我正在使用Jenkins中的管道,这个环境已经从SCM配置了一个管道脚本,然后将一个groovy文件用于管道内的阶段/作业。这个脚本位于主分支的Bitbucket上。

每次jenkins作业启动时都会调用master分支,它运行没有问题,并且管道的各个阶段都在运行。

现在我在bitbucket上创建了一个新的分支并修改了groovy文件以包含更多的步骤(比如运行单元测试和更多的东西)我希望jenkins运行该脚本但是我指定的分支(我的那个)创建)。

虽然我在“分支说明符”中指定了我的分支,但是jenkins仍然运行主分支。以下是我配置的一些图像 如何在SCM的管道脚本中指定我想要运行的分支?

enter image description here enter image description here

Lightweight checkout support not available, falling back to full checkout.
Checking out git git@bitbucket.xxxxxx/xxxxxx.git into /data/jobs/extractor-pipeline-test-dev/workspace@script to read extractor-dev/Jenkinsfile
Cloning the remote Git repository
Cloning repository git@bitbucket.org:xxxxxx/xxxxxxxxxx.git
 > /usr/bin/git init /data/jobs/extractor-pipeline-test-dev/workspace@script # timeout=10
Fetching upstream changes from git@bitbucket.org:xxxx/xxxxxx.git
 > /usr/bin/git --version # timeout=10
 > /usr/bin/git fetch --tags --progress git@bitbucket.org:xxxxxx/deploy.git +refs/heads/*:refs/remotes/origin/*
 > /usr/bin/git config remote.origin.url git@bitbucket.org:xxxxx/deploy.git # timeout=10
 > /usr/bin/git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
 > /usr/bin/git config remote.origin.url git@bitbucket.org:xxxxxxx/deploy.git # timeout=10
Fetching upstream changes from git@bitbucket.org:xxxxx/deploy.git
 > /usr/bin/git fetch --tags --progress git@bitbucket.org:grydev/gp_deploy.git +refs/heads/*:refs/remotes/origin/*
**Seen branch in repository origin/DEVOPS-568-pipeline-ci
Seen branch in repository origin/dev
Seen branch in repository origin/master**
Seen 3 remote branches
 > /usr/bin/git tag -l # timeout=10
Checking out Revision e3270789a8181b26464f878bfccdf39b3fdabcb0 (master)
Commit message: " ....."
 > /usr/bin/git config core.sparsecheckout # timeout=10
 > /usr/bin/git checkout -f e3270789a8181b26464f878bfccdf39b3fdabcb0
 > /usr/bin/git rev-list e3270789a8181b26464f878bfccdf39b3fdabcb0 # timeout=10

这是groovy文件,但是groovy文件会执行将要部署的代码的步骤。它不运行任何jenkin脚本。其中“master”表示要部署的maser代码而不是部署脚本。

Groovy文件:

def call(body) {

    def config = [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = config
    body()

    def artifactName = 'imp'
    def artifactExt = '.war'
    def artifactVersion = '0.0.1'

    def buildPath = 'target/'
    def warFile = artifactName + '-' + artifactVersion + artifactExt
    def warPath = buildPath + warFile
    def warNoVersion = artifactName + artifactExt

    def deployPath = '/var/lib/tomcat8/webapps/'
    def deployFile = deployPath + warNoVersion

    node {
        // Clean workspace before doing anything
        //deleteDir()

        try {

            stage ('Code Checkout') {
                git branch: 'master',
                    credentialsId: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx',
                    url: 'ssh://git@bitbucket.org/xxxxx/xxxximporter'

enter image description here

enter image description here

enter image description here

4 个答案:

答案 0 :(得分:2)

问题是即使Jenkinsfile来自所需的分支,代码检出也是通过“master”分支进行的。 原因是代码签出来自“代码结帐阶段”中的分支“主”。更改代码如下:

try {
    stage ('Code Checkout') {
        git branch: 'REQUIRED BRANCH',
            credentialsId: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx',
            url: 'ssh://git@bitbucket.org/xxxxx/xxxximporter'

另一种更好的选择是提供 GIT BRANCH作为Jenkins作业的参数。下面的快照。

enter image description here

<强>更新: 这可以通过安装git parameter plugin.

来实现

并在“代码结帐”阶段中添加以下co de片段并相应更改。这里“gitbranch”是您从构建传递的参数。

 checkout changelog: false, poll: false, scm: [$class: 'GitSCM', branches: [[name: gitbranch]], doGenerateSubmoduleConfigurations: false,    
extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '********', url: '**********']]]

答案 1 :(得分:1)

对我来说,上述任何方法都无济于事。

Git参数插件似乎以'origin / <...>'的形式传递了分支,根据日志它不会转换为有效的refspec:

> git fetch --tags --force --progress -- ssh://git@***************/group/repo.git +refs/heads/*:refs/remotes/origin/*
> git rev-parse "refs/remotes/origin/origin/devel^{commit}" # timeout=10
> git rev-parse "refs/remotes/origin/refs/heads/origin/devel^{commit}" # timeout=10
> git rev-parse "refs/heads/origin/devel^{commit}" # timeout=10

我无法将Jenkinsfile与“ refs / tags / $ {TAG}”一起使用。

此外,当未选中“轻型结帐”时,作业总是失败,并显示“ <...> @ script \ Jenkinsfile”。

答案 2 :(得分:0)

我在这里遇到了完全相同的问题,并尝试了很多次。原来,脚本路径中指定的Jenkinsfile仅从git默认url获得,从不使用我们在Branch to build中指定的分支。

为避免这种情况,我必须使用多个分支管道。...

答案 3 :(得分:0)

在“分支说明符”中,单击“添加分支”,然后再次放置所选分支。即使使用环境变量,这也对我有用。