Дженкинс использует переменную скрипта внутри sh

#jenkins #jenkins-pipeline

Вопрос:

Я пытаюсь объявить переменную с именем output в script разделе файла Дженкинса и пытаюсь использовать ее следующим образом

 stages {
  stage('Deploy') {
    steps {
      script {
 
        output = 'output.log' 
        sh 'cd invoker amp;amp; mvn clean install amp;amp; 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 другое, но получил ту же ошибку.

Что я делаю не так?

Ответ №1:

В строках groovy одинарные кавычки ( '' ) не поддерживают интерполяцию строк, ее поддерживают только строки в двойных кавычках ( "" ) (GStrings), и поэтому ваш параметр не оценивается.
Чтобы решить проблему, просто используйте двойные кавычки в своем sh шаге:

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

Другой вариант-использовать директиву среды декларативного конвейера, которая является частью синтаксиса декларативного конвейера, которая задает параметры (в дополнение к параметрам по умолчанию), которые будут загружаться в качестве переменных среды в среду выполнения оболочки.
Таким образом, вы можете определить параметр в environment блоке, а затем использовать его в скрипте с синтаксисом оболочки для переменных среды: $PARAM .
Что-то вроде:

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