Jenkinsfile $ {steps.env.BUILD_NUMBER}: неправильная замена - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь напечатать переменную в Jenkins.Но я получаю сообщение об ошибке "плохая замена".Я использую Jenkinsfile для достижения этой цели.Это то, что я делаю.

static def printbn() {
    sh '''
            #!/usr/bin/env bash

            echo \"${env.BUILD_NUMBER}\"
    '''
}

pipeline {
    agent any
        stages {
            stage('Print Build Number') {
                steps {
                    printbn()
                }
            }
        }
}

Ошибка, которую я получаю

/var/lib/jenkins/workspace/groovymethod@tmp/durable-7d9ef0b0/script.sh: line 4: ${steps.env.BUILD_NUMBER}: bad substitution

ПРИМЕЧАНИЕ. Я использую версию Jenkins Jenkins ver. 2.163

1 Ответ

0 голосов
/ 18 февраля 2019

В Shell имя переменной не разрешено использовать ., поэтому вы получаете следующую ошибку: bad substitution

В Groovy есть 4 способа представления строки:

  1. одиночная кавычка: 'строка'
  2. тройная одинарная кавычка: '' 'строка' ''
  3. двойная кавычка: "строка"
  4. двойная кавычка: "" "строка" ""

А Groovy выполняет интерполяцию строк только для строк двойной и тройной двойной кавычки.

Например:

def name = 'Tom'

print "Hello ${name}"
print """Hello ${name}"""  
// do interpolation before print, thus get Hello Tom printed out

print 'Hello ${name}' 
print '''Hello ${name}'''
//no interpolation thus, print Hello ${name} out directly.

BUILD_NUMBER - переменная встроенной среды задания Jenkins.Вы можете напрямую получить к нему доступ в shell / bat.

static def printbn() {
    sh '''
    #!/usr/bin/env bash

    echo ${BUILD_NUMBER} 
    // directly access any Jenkins build-in environment variable,
    // no need to use pattern `env.xxxx` which only works in groovy not in shell/bat
    '''
}

Если вы хотите использовать шаблон env.xxxx, вы можете заархивировать его с помощью шпунтовой интерполяции строк.

static def printbn() {

    // use pipeline step: echo
    echo "${env.BUILD_NUMBER}" // env.BUILD_NUMBER is groovy variable 

    // or use pipeline step: sh
    sh """#!/usr/bin/env bash
      echo ${env.BUILD_NUMBER} 
    """
    // will do interpolation firstly, to replace ${env.BUILD_NUMBER} with real value
    // then execute the whole shell script.
}
...