Jenkins Pipeline阶段中固定值变量为什么不可见

77次阅读
没有评论

问题描述

在使用Jenkins Pipeline时遇到了一个问题,他在Pipeline的某个阶段中定义了一些固定值的变量,但在阶段执行过程中,这些变量的值为空。然而,其他在genericVariables部分中定义的变量(如$committer_name$committer_email)却能够正常显示。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

问题的原因是,$var1$var2变量的值并不是来自于Pipeline本身,而是来自于Generic Webhook Trigger插件。当Webhook被触发时,Webhook请求接收器会获取Jenkins作业的触发器,然后创建一个原因对象,该对象将获取您提供的通用变量列表,并将其传递给变量解析器,该解析器实际上会使用后置内容参数解析器,从后置内容中获取任何通用变量的值,其中您提供了JSON或XML路径作为值。如果值与请求头、请求参数或POST内容中的输入不匹配,则变量将被静默丢弃。

由于genericVariables仅由Generic Webhook Trigger使用,而不是由Jenkins Pipeline本身使用,因此如果您希望静态变量在进入阶段后仍然保持在作用域内,您需要在正确的上下文中定义它 – 即,在节点上下文中使用Groovy的def语句进行定义,或者使用环境变量。

以下是解决方案的步骤:

  1. 在Pipeline脚本的stage中,使用def语句定义需要在阶段中使用的静态变量。
  2. 在阶段中使用定义的变量。

下面是一个示例:

node {
    properties([
        pipelineTriggers([
            [$class: 'GenericTrigger',
                genericVariables: [
                    [key: 'committer_name', value: '$.actor.name'],
                    [key: 'committer_email', value: '$.actor.emailAddress'],
                    [key: 'ref', value: '$.changes[0].refId'],
                    [key: 'tag', value: '$.changes[0].ref.id', regexpFilter: 'refs/tags/'],
                    [key: 'commit', value: '$.changes[0].toHash'],
                    [key: 'repo_slug', value: '$.repository.slug'],
                    [key: 'project_key', value: '$.repository.project.key'],
                    [key: 'clone_url', value: '$.repository.links.clone[0].href'],
                    [key: 'var1', value: 'value1'],
                    [key: 'var2', value: 'value2'],
                    [key: 'var3', value: 'value3'],
                    [key: 'var4', value: 'value4']
                ],
                causeString: '$committer_name pushed tag $tag to $clone_url referencing $commit',
                token: 'my_token',
                printContributedVariables: true,
                printPostContent: true,
                regexpFilterText: '$ref',
                regexpFilterExpression: '^refs/tags/.*'
            ]
        ])
    ])

    stage("Prepare") {
        deleteDir()

        // 在阶段中使用定义的变量
        def var1 = 'value1'
        def var2 = 'value2'

        sh '''
        echo $committer_name
        echo $committer_email
        echo $var1
        echo $var2
        '''
    }
}

在上面的示例中,我们在stage中使用def语句定义了var1var2变量,并在阶段中使用了这些变量。

请注意,这种方法只适用于在阶段中需要使用静态变量的情况。如果您需要在多个阶段中共享变量,或者需要根据不同条件设置变量的值,可以考虑使用环境变量来管理变量。

希望这个解决方案对您有帮助!

正文完