来自不同分支中SCM的Jenkins管道不工作

来自不同分支中SCM的Jenkins管道不工作,jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,我在Jenkins的环境中使用管道,该环境已经从SCM配置了管道脚本,然后将groovy文件用于管道中的阶段/作业。此脚本位于主分支中的Bitbucket上 每次jenkins jobs启动时,它都会调用master branch,它会毫无问题地运行,管道的各个阶段都会运行 现在,我在bitbucket上创建了一个新分支,并修改了groovy文件以包含更多的步骤(如运行单元测试和其他内容),我希望jenkins使用我指定的分支(我创建的分支)运行该脚本 问题是,即使我在“分支说明符”中指定了我的

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

每次jenkins jobs启动时,它都会调用master branch,它会毫无问题地运行,管道的各个阶段都会运行

现在,我在bitbucket上创建了一个新分支,并修改了groovy文件以包含更多的步骤(如运行单元测试和其他内容),我希望jenkins使用我指定的分支(我创建的分支)运行该脚本

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

这是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'


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

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

另一个更好的选择是从Jenkins作业中提供GIT分支作为参数。下面是快照

更新: 这可以通过安装

并在“代码签出”阶段添加以下code snippet,并进行相应更改。这里,“gitbranch”是从build传递的参数

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

我在这里遇到了完全相同的问题,并且尝试了很多次。事实证明,脚本路径中指定的Jenkinsfile只能从git默认url获得,决不能使用我们在
分支中指定的分支来构建


为了避免这种情况,我必须使用多分支管道……

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

对于我来说,上面提到的任何一种方法都没有帮助

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 not found”。

一切看起来都很好……您是否验证了控制台输出中的提交id?……您是否可以通过隐藏机密信息来共享控制台输出……我在那里编辑并添加了它。可以看到3个分支,但主分支正在运行。我希望该作业运行我的分支“DEVOPS-568-pipeline-ci”,我包括开始运行主分支作业的部分。然后作业运行成功管道结束正常,但仅与主分支共享“签出scm”发生的管道脚本?脚本仅包含以下内容:@Library(“gp extractor deploy”)\uDeployExtractor{confiFileId=“extractor-conf.properties”serverIp='x.x.x'slackChannel='\xxxxx'}调用一个groovy文件,其中所有作业/步骤都运行{stage('Code Checkout')){git branch:'REQUIRED branch',凭证ID:'xxxxxxxxxxxxxxxxxxxxxxxxxxxx',url:'ssh://git@bitbucket.org/xxxxx/xxximporter'此代码是要部署的代码之一,而不是进行部署的脚本的代码。我将检查您建议的第二部分另一个更好的选择是提供GIT BRANCH作为Jenkins作业的参数。下面是快照。为什么我在Jenkins中没有这个选项?这是一个插件还是我必须添加的东西?thanks@Guillermo-卡斯柯:如果新的更新有效,请将答案标记为已接受/向上投票,因为当其他人面临类似问题时,答案会有所帮助。它还没有,我上周五正在处理这个问题我添加了新的配置和新的插件,并且得到了建议,作业仍然在master上运行。我正在检查Jenkins配置,看看是否有不同之处。将检查并告知您。仍然在运行master:(它看到3个分支,但只运行master。这是我现在配置的映像。从git@bitbucket.org:xxxxxx/deploy.git>/usr/bin/git--version#timeout=10>/usr/bin/git fetch--tags--progressgit@bitbucket.org:xxxxxx/deploy.git+refs/heads/*:refs/remotes/origin/*已在存储库origin/DEVOPS-56中看到分支8-pipeline-ci-Seen-branch-in-repository-origin/dev-Seen-branch-in-repository-origin/master-Seen-3远程分支>/usr/bin/git show ref--tags-d#timeout=10签出修订版ccdf39b3fdabcb0(master)
> 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