如何从 shell bash 脚本部分 sh 获取变量到 jenkins-pipeline 的 groovy 文件中?

问题描述 投票:0回答:1

TLDR:如何从 sh 部分获取变量,进入随后的 groovy 阶段以在方法中使用? (如下面的代码所示,除非将

${ENV1_TOKEN}
${ENV1_PERMIT}
替换为硬编码值,否则该代码不起作用) 让我知道我的解决方案是否合理或者我是否需要完全不同的东西。 将任何类似的问题或具有半可比格式的文章链接到此 bash 脚本。

def serviceHelper
{
    node 
    {
        docker.image(env.DOCKER_REGISTRY + "/drainage/si-base-se:latest").inside('--privileged') 
        {
            withEnv(['HOME=.']) 
            {
                stage('Build Test') 
                {
                    withCredentials([
                            string(credentialsId: 'NPM_PERMIT', variable: 'NPM_PERMIT'),
                            string(credentialsId: 'AUTHORIZATION', variable: 'AUTHORIZATION')
                    ]) 
                    {
                        sh '''
                            rm -rf node_modules                                          
                            npm config set strict-ssl false
                            npm config set registry ${NPM_REGISTRY}
                            npm config set _auth ${NPM_PERMIT}
                            npm config set always-auth true
                            npx [email protected] install
                            
                            ENV1_PERMIT=$(echo <code to get string from AUTHORIZATION> )
                            export ENV1_PERMIT
                            ENV1_TOKEN=$(echo <code to get string from AUTHORIZATION> )
                            export ENV1_TOKEN
                            
                            npm run build
                        '''
                    }
                }
    
                stage('Deploy-ENV1') 
                {
                    withCredentials([
                            cfCredentials
                    ]) 
                    {
                        serviceHelper.admitterDeploy(<redacted arguments>,${ENV1_TOKEN}, ${ENV1_PERMIT})
                    }
                }
            }
        }
    }
}

使用遗留的 UI 程序,该程序由 Jenkins 以某种方式运行的 groovy 文件部署。 (管道配置不清楚) 这个 groovy 文件在 Jenkins 管道中运行该程序,我可以在那里检查其控制台输出。 该文件有一个方法

serviceHelper
,它有一个包含方法的节点:
admitterDeploy()
节点创建了一个
docker.image
,它创建了一个环境,该环境具有 Jenkins 管道中发生的多个阶段。 第一阶段
Build Test
检查 Jenkins Cloud Foundry 是否有继续管道所需的一些凭据/环境变量。 需要获得 3 个不同环境的凭据
permit
tag
ENV1
ENV2
ENV3
。所以有6个不同的字符串。 旧程序通过运行 shell bash 脚本来比较 Jenkins 上的子字符串(例如查找
ENV1
)并检索字符串来实现此目的。 它在下面的代码中使用 bash 脚本,凭据成功显示在控制台输出上。

找到字符串后,阶段

Deploy-ENV1
使用特定于环境的
permit
tag
值来运行
admitterDeploy()
permit
tag
admitterDeploy
的 2 个参数。 但是,我不知道如何从 bash 脚本 shell 检索值。 我只能通过硬编码
admitterDeploy
${ENV1_TOKEN}
)的值来使
${ENV1_PERMIT}
工作。

可能的解决方案(它们都不起作用,可能是由于语法错误):

  1. ServiceHelper
    之外创建一些全局变量并将它们的值分配给shell命令,例如
def ENV1_PERMIT2='';
def ENV1_TAG2='';
ENV1_PERMIT2=sh'''
echo($AUTHORIZATION <code to get string from AUTHORIZATION>)
'''
  1. 检查 jenkins.io Bash 脚本:
    returnstdout
    :以字符串形式返回任务的标准输出,而不是打印到控制台输出(构建日志)。 然后写代码:
ENV1_PERMIT2=sh'''
(returnstdout:true,'$AUTHORIZATION <code to get string from AUTHORIZATION>')
'''
  1. bash脚本命令
    export
    似乎没有在控制台输出中执行任何操作。 也许这需要以某种方式使用。
bash jenkins groovy
1个回答
1
投票

最简单的方法:

  • 从 shell 中回显你需要的内容
  • 将输出捕获到常规变量中
  • 按行分割

只需确保您的脚本没有打印任何其他内容

def shOut = sh returnStdout:true, script:'''
  ENV1_PERMIT=...
  ENV1_TOKEN=...
  
  echo ENV1_PERMIT
  echo ENV1_TOKEN
'''

shOut=shOut.readLines()
def env_permit = shOut[0]
def env_token  = shOut[1]

serviceHelper.admitterDeploy(..., env_token, env_permit)
© www.soinside.com 2019 - 2024. All rights reserved.