无法替换Jenkinsfile内bash脚本中的变量

9rygscc1  于 12个月前  发布在  Jenkins
关注(0)|答案(1)|浏览(163)

我在基于Groovy的Jenkinsfile中遇到了一个非常奇怪的问题。我有一个变量,我需要在我的shell脚本中替换docker容器的名称。但无论我怎么尝试,它都无法读取该变量。这让它变得很奇怪,因为我可以在脚本语句之前和之后读取变量的值,但不能在脚本语句内部读取。
有人能解释一下为什么会出现这个问题以及如何解决这个问题吗?
我档案里的一部分-

stage('Snyk Scan') {
                    if (params.buildDockerImage == 'true') {
                        println(ANSI_BOLD + ANSI_GREEN + "build_tag with value as: " + build_tag + ANSI_NORMAL) // this works
                        sh("echo build tag is ${build_tag}") // this works too
                        sh '''
                    export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"
snyk container test ${hub_org}/player:${build_tag} --json | snyk-to-html -d -o snyk_results.html
                    '''
                    sh("echo build tag is ${build_tag}") // even this works
                    }
                }

当我看到控制台输出时,它是-

22:54:42  + snyk container test registery/sunbidrded/player: --json
22:54:42  + snyk-to-html -d -o snyk_results.html
22:54:47  Vulnerability snapshot saved at snyk_results.html
[Pipeline] sh
22:54:47  + echo build tag is container_scanning_ad2aecee29_23
22:54:47  build tag is container_scanning_ad2aecee29_23

正如你在build_tag后面的snyk container test registery/sunbidrded/player:部分看到的,冒号build_tag总是空白的。
我试过将${hub_org}/player:${build_tag}放在双引号内,也试过将字符串存储在变量中,然后在语句中替换它,但这也不起作用。
我在这里定义了build_tag-

node('build-slave') {
    try {
        String ANSI_GREEN = "\u001B[32m"
        ... // (other color variables)

        ansiColor('xterm') {
            timestamps {
                stage('Checkout') {
                    if (!env.hub_org) {
                        println(ANSI_BOLD + ANSI_RED + "Uh Oh! Please set a Jenkins environment variable named hub_org with value as registery/sunbidrded" + ANSI_NORMAL)
                        error 'Please resolve the errors and rerun..'
                    } else {
                        println(ANSI_BOLD + ANSI_GREEN + "Found environment variable named hub_org with value as: " + hub_org + ANSI_NORMAL)
                    }
                }
                // cleanWs()
                checkout scm
                commit_hash = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim()
                build_tag = sh(script: "echo " + params.github_release_tag.split('/')[-1] + "_" + commit_hash + "_" + env.BUILD_NUMBER, returnStdout: true).trim()
                echo "build_tag: " + build_tag

                stage('Customize dependencies') {
                    ...
                }
                stage('Snyk Setup') {
                    ...
                }
...
ogq8wdun

ogq8wdun1#

@Matthew Schuchard给出的见解是正确的。它帮助我确定了问题到底是什么。
我只需要做进一步的小修改,就可以执行NVM命令,并将变量build_tag替换为-

sh """
export NVM_DIR="\$HOME/.nvm"
[ -s "\$NVM_DIR/nvm.sh" ] && . "\$NVM_DIR/nvm.sh"
[ -s "\$NVM_DIR/bash_completion" ] && . "\$NVM_DIR/bash_completion"
snyk container test ${hub_org}/player:${build_tag} --json | snyk-to-html -d -o snyk_results.html
"""

相关问题