问题描述
在使用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
语句进行定义,或者使用环境变量。
以下是解决方案的步骤:
- 在Pipeline脚本的
stage
中,使用def
语句定义需要在阶段中使用的静态变量。 - 在阶段中使用定义的变量。
下面是一个示例:
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
语句定义了var1
和var2
变量,并在阶段中使用了这些变量。
请注意,这种方法只适用于在阶段中需要使用静态变量的情况。如果您需要在多个阶段中共享变量,或者需要根据不同条件设置变量的值,可以考虑使用环境变量来管理变量。
希望这个解决方案对您有帮助!