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}
工作。
ServiceHelper
之外创建一些全局变量并将它们的值分配给shell命令,例如def ENV1_PERMIT2='';
def ENV1_TAG2='';
ENV1_PERMIT2=sh'''
echo($AUTHORIZATION <code to get string from AUTHORIZATION>)
'''
returnstdout
:以字符串形式返回任务的标准输出,而不是打印到控制台输出(构建日志)。
然后写代码:ENV1_PERMIT2=sh'''
(returnstdout:true,'$AUTHORIZATION <code to get string from AUTHORIZATION>')
'''
export
似乎没有在控制台输出中执行任何操作。
也许这需要以某种方式使用。最简单的方法:
只需确保您的脚本没有打印任何其他内容
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)