groovy - 为 Groovy for 循环提供列表以多次运行任务
问题描述
我在 Groovy 中定义了列表,例如:
all_services:[processor-create, processor-update, read-service]
我如何将此列表提供给 for 循环每个用于另一个阶段剧本变量 ${service}
script {
sh("""
ansible-playbook -i localhost, cleanup.yml --extra-vars=@${service}.yml
""")
...
因此,如果列表有 2 个项目,则该剧本应该运行,那么它必须为每个项目运行 2 次。
让我说清楚。
我有 groovy 脚本它有多个阶段:
stages {
stage('Prepare') {
agent any
steps {
script {
if (params.DEPLOY_ALL_SERVICES == true){
all_services = new ArrayList(Arrays.asList("${params.ALL_SERVICES}".split("\\+")))
println "all_services:" + all_services
} else{
if (params.DEPLOY_ALL_EX_SERVICES == true){
all_ex_services = new ArrayList(Arrays.asList("${params.ALL_EX_SERVICES}".split("\\+")))
println "deploy all ex services:" + all_account_services
all_services += all_ex_services
}
println "All Services:" + all_services
}
}
}
}
stage('Create conf'){
agent any
steps {
script {
def services = "$all_services"
println services // it works till here, it's printing the list, if add single quotes to list then hopefully it should loop through it
services.each {service ->
sh("""
ansible-playbook -i localhost, cleanup.yml --extra-vars=@${service}.yml
""")
}
}
}
}
}
当我执行管道时,它能够在控制台上打印列表,但无法将该列表提供给 def services =“$all_services”,它没有让所有列表都进行循环。
控制台输出 println 服务:
[processor-create, processor-update, ex-service]
an exception which occurred:
in field com.cloudbees.groovy.cps.impl.FunctionCallEnv.locals
in object com.cloudbees.groovy.cps.impl.FunctionCallEnv@1a3dd25b
in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@7f249352
in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
in object com.cloudbees.groovy.cps.impl.LoopBlockScopeEnv@59936027
in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@6a3531fb
in field com.cloudbees.groovy.cps.impl.CallEnv.caller
解决方案
您的问题定义得不够好,无法确定您在寻找什么,但是下面的常规代码:
def services = ['processor-create', 'processor-update', 'read-service']
services.each { service ->
sh("ansible-playbook -i localhost, cleanup.yml --extra-vars=@${service}.yml")
}
def sh(str) {
println "fake execution>> \n${str}\n"
}
演示了集合的迭代和字符串插值。保存上述solution.groovy
内容并执行它会产生:
~> groovy solution.groovy
fake execution>>
ansible-playbook -i localhost, cleanup.yml --extra-vars=@processor-create.yml
fake execution>>
ansible-playbook -i localhost, cleanup.yml --extra-vars=@processor-update.yml
fake execution>>
ansible-playbook -i localhost, cleanup.yml --extra-vars=@read-service.yml
应该注意的是,由于上面的代码使用的是纯 groovy 并且没有开箱即用script
或sh
在 groovy 中,我已经模拟了sh
仅在 stdout 上打印结果的方法。
推荐阅读
- javascript - 根据变量显示/隐藏图像
- c++ - 如何将回调函数从 C++ 传递到 Objective-C
- c++ - C++:子类成员的“升级”指针类型
- javascript - 在 AJAX 响应后,翻转插件和 javascript 功能不起作用
- c++ - 联合作为模板化基类的部分特化
- java - java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.createFileWithMode0(Ljava/lang/String;JJJI)Ljava/io/FileDescriptor
- javascript - 如何将文件上传到 AWS 中的预签名 URL?
- java - 如何强制使用 JDK 1.7 的 SBT 安装程序始终使用 Maven 接受的 HTTPS 协议?
- r - 在 dplyr 管道操作中将 here() 函数与 map() 集成
- python - 使用 while:True 块退出代码 -1