【问题标题】:environmentVariables() not working for Jenkins Job DSL and Pipeline JobsenvironmentVariables() 不适用于 Jenkins Job DSL 和 Pipeline Jobs
【发布时间】:2018-04-22 16:55:04
【问题描述】:

我们使用Jenkins Job DSL 进行 CI 设置。由于我们使用的 special command 仅适用于传统的 Jenkinsfile 语法,因此我们需要使用 pipeline job

在管道作业中,我们从 Git 检查我们的项目。我们正在为多个项目使用管道作业,因此我们希望将 git url 注入管道脚本。

这是生成管道作业的脚本的简短版本:

def createPipelineJob(def jobName, def gitUrl) {
    pipelineJob(jobName) {
        environmentVariables(GIT_URL: gitUrl)
        definition {
            cps {
                script('''
                    node {
                        sh 'env | sort' 
                    }
                ''')
                sandbox(true)
            }
        }       
    }   
}

这将创建以下 XML 配置:

<flow-definition>
    <actions/>
    <description/>
    <keepDependencies>false</keepDependencies>
    <properties>
        <EnvInjectJobProperty>
            <info>
                <propertiesContent>GIT_URL=my-git.url</propertiesContent>
                <loadFilesFromMaster>false</loadFilesFromMaster>
            </info>
            <on>true</on>
            <keepJenkinsSystemVariables>true</keepJenkinsSystemVariables>
            <keepBuildVariables>true</keepBuildVariables>
            <overrideBuildParameters>false</overrideBuildParameters>
            <contributors/>
        </EnvInjectJobProperty>
    </properties>
    <triggers/>
    <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition">
        <script>
            node { sh 'env | sort' }
        </script>
        <sandbox>true</sandbox>
    </definition>
</flow-definition>

但如果我运行它,GIT_URL 环境变量不会列出(其他环境变量是)。但是,如果我改为使用 setup 手动创建管道作业,则 GIT_URL 环境变量会打印得很好。手动创建作业几乎会创建相同的 xml 配置:

<flow-definition plugin="workflow-job@2.15">
    <actions>
        <io.jenkins.blueocean.service.embedded.BlueOceanUrlAction plugin="blueocean-rest-impl@1.3.1">
            <blueOceanUrlObject class="io.jenkins.blueocean.service.embedded.BlueOceanUrlObjectImpl">
                <mappedUrl>blue/organizations/jenkins/test-jobname</mappedUrl>
                <modelObject class="flow-definition" reference="../../../.."/>
            </blueOceanUrlObject>
        </io.jenkins.blueocean.service.embedded.BlueOceanUrlAction>
    </actions>
    <description/>
    <keepDependencies>false</keepDependencies>
    <properties>
        <com.sonyericsson.rebuild.RebuildSettings plugin="rebuild@1.27">
            <autoRebuild>false</autoRebuild>
            <rebuildDisabled>false</rebuildDisabled>
        </com.sonyericsson.rebuild.RebuildSettings>
        <EnvInjectJobProperty plugin="envinject@2.1.5">
            <info>
                <propertiesContent>GIT_URL=my-git.url</propertiesContent>
                <secureGroovyScript plugin="script-security@1.35">
                <script/>
                <sandbox>false</sandbox>
            </secureGroovyScript>
            <loadFilesFromMaster>false</loadFilesFromMaster>
        </info>
        <on>true</on>
        <keepJenkinsSystemVariables>true</keepJenkinsSystemVariables>
        <keepBuildVariables>true</keepBuildVariables>
        <overrideBuildParameters>false</overrideBuildParameters>
    </EnvInjectJobProperty>
        <org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
            <triggers/>
        </org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
    </properties>
    <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps@2.41">
        <script>
            node { sh 'env | sort' }
        </script>
        <sandbox>true</sandbox>
    </definition>
    <triggers/>
    <disabled>false</disabled>
</flow-definition>

我们很迷茫,因为我们是 jenkins 的新手,这个问题已经困扰了我们好几天。

编辑:

  • 作业在jenkins主节点上生成,但在从节点上执行
  • 詹金斯 2.37.3
  • 环境注入器插件 2.1.5
  • 管道 2.5

【问题讨论】:

    标签: jenkins continuous-integration environment-variables jenkins-pipeline jenkins-job-dsl


    【解决方案1】:

    这更像是一个评论而不是一个答案,但我修改并测试了你的 DSL 代码,它工作正常。

    我使用脚本创建了一个 DSL 作业:

    def createPipelineJob(def jobName, def gitUrl) {
        pipelineJob(jobName) {
            environmentVariables(GIT_URL: gitUrl)
            definition {
                cps {
                    script('''
                        node {
                            sh "echo $GIT_URL" 
                        }
                    ''')
                    sandbox(true)
                }
            }       
        }   
    }
    createPipelineJob('new-job-2','my-git.url')
    

    生成的管道作业具有与您发布的相同的 XML(减去 shell 脚本),并且构建管道作业会打印 GIT_URL 的值。

    [new-job-1] Running shell script
    + echo my-git.url
    my-git.url
    

    我的建议:

    • 如果您发布的简短版本(或者尝试我的版本)不起作用,我会尝试查看升级 Jenkins 或插件是否有任何不同。
    • 如果您发布的或我发布的短版确实有效,请发布完整版,可能有错误。

    【讨论】:

    • 我使用你的代码来生成作业,但是在开始作业时出现异常:groovy.lang.MissingPropertyException: No such property: GIT_URL for class: groovy.lang.Binding 我将在原始版本中包含我们的 jenkins 安装版本以及所有插件的版本题。但据我所知,它们都是最新的。我也在主节点上生成作业,而它在从属节点上执行。这可能是个问题吗?
    【解决方案2】:

    事实证明环境注入器插件没有成功安装,因此脚本没有正常运行。所以我所要做的就是重新启动 Jenkins,一切正常。特别感谢 Javier Garcés 确保我的脚本确实正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      相关资源
      最近更新 更多