首页 > 解决方案 > Jenkins 在 sh 中使用脚本变量

问题描述

我正在尝试在scriptJenkins 文件的部分中声明一个名为 output 的变量,并尝试像这样使用它

stages {
  stage('Deploy') {
    steps {
      script {
 
        output = 'output.log' 
        sh 'cd invoker && mvn clean install && mvn exec:java -Dexec.mainClass="com.company.Deployer" -Dexec.args="qal ${GIT_COMMIT_HASH}" > ../${output}'
        echo readFile(output)
       }
     }        
   }
}

但我收到此错误:script.sh: cannot create ../: Is a directory. 这意味着变量没有被填充。我都尝试了 ${output}$output但得到了同样的错误。

我究竟做错了什么?

标签: jenkinsjenkins-pipeline

解决方案


在 groovy 中,单引号 ( '') 字符串不支持字符串插值,只有双引号 ( "") 字符串 (GStrings) 支持它,因此您的参数不会被评估。
要解决此问题,只需在您的sh步骤中使用双引号:

 sh "cd invoker && mvn clean install && mvn exec:java -Dexec.mainClass=\"com.company.Deployer\" -Dexec.args=\"qal ${GIT_COMMIT_HASH}\" > ../${output}"

另一种选择是使用声明性管道环境指令,它是声明性管道语法的一部分,它设置将作为环境变量加载到 shell 执行环境的参数(除了默认参数)。因此,您可以在块中定义参数environment,然后在脚本中使用环境变量的 shell 语法:$PARAM.
就像是:

pipeline {
   agent any
   environment {
       OUTPUT_FILE= 'output.log'
   }
   stages {
       stage('Use Global Parameter') {
           steps {
               sh 'cd invoker && mvn clean install && mvn exec:java -Dexec.mainClass="com.company.Deployer" -Dexec.args="qal $GIT_COMMIT_HASH" > ../$OUTPUT_FILE'
               echo readFile(output)
           }
       }
   }
}

推荐阅读