首页 > 解决方案 > 在 k8s 容器中访问 jenkins shell 变量

问题描述

stages
{
    stage('test')
    {
        steps
        {
            withCredentials([string(credentialsId: 'kubeconfigfile', variable: 'KUBECONFIG' )])
            {
                container('deploycontainer')
                {
                    sh 'TEMPFILE=$(mktemp -p "${PWD}" kubeconfig.XXXXX)'
                    sh 'echo "${TEMPFILE}"'
                }
            }
        }        
    }
}

我是创建管道的新手,正在尝试将自由式工作转换为管道。我正在尝试为容器中的 kubeconfig 文件创建一个临时文件。我已经尝试了所有我能想到的访问 shell 的 var 而不是 groovy var 的方法。

即使尝试以下内容也不会在 echo 上打印任何内容:

sh 'TEMPFILE="foo"'
sh 'echo ${TEMPFILE}'

我尝试转义并使用双引号以及单引号和三引号块。

如何从容器块中访问 shell 变量/如何制作临时文件并将其回显到该容器块中?

标签: jenkinsjenkins-pipeline

解决方案


使用 Jenkinsfiles,每个sh步骤都运行自己的 shell。当每个 shell 终止时,它的所有状态都会丢失。

如果你想按顺序运行多个 shell 命令,你可以做两件事之一。

您可以使用分号分隔一长串命令:

sh 'cmd1; cmd2; cmd3; ...'

或者您可以使用'''"""将命令扩展到多行(当然请注意,如果您使用,"""则 groovy 将执行字符串插值):

sh """
cmd1
cmd2
cmd3
...
"""

在您的特定情况下,如果您选择选项 2,它将如下所示:

sh '''
TEMPFILE=$(mktemp -p "${PWD}" kubeconfig.XXXXX)
echo "${TEMPFILE}"
'''

警告

如果您要指定特定的 shebang,并且您使用的是多行字符串,则必须将 shebang 紧跟在引号之后,而不是在下一行:

sh """#!/usr/bin/env zsh
cmd1
cmd2
cmd3
...
"""

推荐阅读