我有一张在Groovy管道脚本中提取的数据图。 在管道的下一阶段,我想遍历数据并插入环境变量以供使用。
此阶段包括一个ant
命令,该命令使用构建xml来检索环境${env.appName}
参数。
(请参见下面的xml示例)
<project ...>
...
<entry ...value="${env.appName}/>
<entry ...value="${env.version}/>
...
</project>
我正在浏览地图的键值对。
pipeline {
agent any
stages{
stage ('Data') {
steps{
scripts {
def map = [app1: "01.01", app2: "02.02"]
}
}
}
stage ('Loop'){
steps {
withAnt(){
sh '''
{map.collect{ k,v -> "appName=${k} version=${v}"}}
ant -buildfile ~/build.xml
...
'''
}
}
}
}
}
但是,我得到一个错误:
line 3 : {map.collect{ k,v -> "appName=${k} version=${v}"}}: bad substitution.
是否可以在sh
块中循环映射?
有没有一种方法可以对地图的每个元素执行ant
命令?
答案 0 :(得分:0)
...
withAnt{
def cmd = map.collect{k,v-> "\n appName=${k}\n version=${v}\n ant -buildfile ~/build.xml"}.join()
sh cmd
}
对于地图[app1: "01.01", app2: "02.02"]
,cmd
变量将具有:
appName=app1
version=01.01
ant -buildfile ~/build.xml
appName=app2
version=02.02
ant -buildfile ~/build.xml
或者您可以将表达式包含在多行评估(双引号)字符串中:
sh """
....
${ map.collect{k,v-> "\n appName=${k}\n version=${v}\n ant -buildfile ~/build.xml"}.join() }
....
"""
答案 1 :(得分:0)
为了在阶段之间传递值,我将值加载到文件中并加载了文件。然后可以在外壳中访问这些值。
pipeline {
agent any
stages {
stage ('Data') {
steps {
script {
...
map. each{ key,value ->
writeFile ([file: filename, text: "env.App=\"${key}\"\n"])
def content = readFile filename
writeFile([fiel: filename, text: "env.Version=\"${value}\"\n"])}
}
}
}
}
stage ('Loop') {
...
load "filename"
sh '''
echo $App
'''
...
}
}
}