Jenkins:未设置时跳过Shell变量确认

gywdnpxw  于 2023-03-13  发布在  Shell
关注(0)|答案(1)|浏览(190)

我已根据上游${SHOW_OPTION}条件“是”或“否”有条件地设置Jenkins参数以读取USER_INPUT_VALUE。

if ("$SHOW_OPTION" == ("NO")) {
     properties([ //No USER INPUT passed
       ])
else
{
     properties([
       parameters([ string(name: 'USER_INPUT_VALUE', defaultValue: 'mydefault']")
     ])
}

后来Jenikinsfile调用一个shell脚本作为ONE Liner,它分配一个shell变量,如下所示:当SHOW_OPTION为NO时,我分配硬编码值,否则分配实际的USER值,

if [ ${SHOW_OPTION} == "NO" ]; then TARGET='"NO_USER_VALUE"'; else TARGET=$USER_INPUT_VALUE; fi;

但当SHOW_OPTION为NO时,构建版本会报告为groovy.lang.MissingPropertyException: No such property: USER_INPUT_VALUE for class: groovy.lang.Binding
为什么脚本在这里验证其他部分,因为它不适用。有没有办法跳过shell脚本中的验证。
注:当我在常规shell上运行一个liner时,我没有看到任何问题(使用echo $?验证)

2lpgd968

2lpgd9681#

声明性管道

  • 不要忘记使用#!/bin/bash启动bash脚本
  • 生成参数不发送到shell脚本。
  • 只有jenkins env变量被发送到shell脚本。
def scriptContent = """#!/bin/bash

echo "script arguments"
echo "\$@" 

#echo "env variables passed to script"
#env 

if [ \$SHOW_OPTION == "NO" ]; then TARGET=\'"NO_USER_VALUE"\'; else TARGET=\$USER_INPUT_VALUE; fi;

echo "shell result:"
echo TARGET="\$TARGET"
""";

pipeline {
    agent any
    
    environment {
        SHOW_OPTION="NO"
    }    
    
    stages {
        stage('Setup parameters') {
            steps {
                
                //simulating your shell script
                writeFile(file: "script.sh" , text: scriptContent) 
                
                script { 
                    if ("$SHOW_OPTION" == ("NO")) {
                         println "no parameters are configured"
                    }else{
                         properties([
                           parameters([
                                string(defaultValue: 'mydefault', name: 'USER_INPUT_VALUE')
                            ])  
                         ])
                    }
                }
                
                println "build params"
                println params
                //simulating your shell script
                sh "chmod +x script.sh"
                sh "./script.sh"
            }
        }
    }   
}

SHOW_OPTION为“是”时的结果:

SHOW_OPTION为“否”时的结果:

注意:应手动删除参数,因为当SHOW_OPTION=YES时,参数已添加到管道中。因此,我建议不要在管道中配置动态参数。您可以使用标准方式添加参数并比较其值是否为空

脚本化管道

如果有人正在使用脚本化管道,则可以按预期工作:

def SHOW_OPTION= "true";

node {

    if ("$SHOW_OPTION" == "NO") {
     println "no parameters"
    }else{
        properties(
            [
                parameters([
                        string(defaultValue: 'mydefault', name: 'USER_INPUT_VALUE')
                ])   
            ]
        )      
    }

    println params.USER_INPUT_VALUE
    
}

相关问题