此python eval的输出看起来可能是jenkins管道中的各个阶段
$ python3 -c 'print("\n".join(["stage({val}) {{ do something with {val} }}".format(val=i) for i in range(3)]))'
stage(0) { do something with 0 }
stage(1) { do something with 1 }
stage(2) { do something with 2 }
jenkins是否可以使用这样的输出在管道中创建步骤或阶段,以便正在运行的python脚本能够更新jenkins?这样做的目的是使Blue Ocean管道具有一个阶段点,该阶段点是由运行单独作业的外部脚本制作的。
详细说明示例...如果此demo.py脚本在阶段中输出正常运行时间
#!/bin/env python3.6
import subprocess, time
def uptime():
return (subprocess.run('uptime', stdout=subprocess.PIPE, encoding='utf8')).stdout.strip()
for i in range(3):
print("stage({val}) {{\n echo \"{output}\" \n}}".format(val=i, output=uptime()))
time.sleep(1)
在詹金斯管道中的何处设置
node {
stage("start demo"){
sh "/tmp/demo.py"
}
}
此演示程序只是输出文本,不会在蓝海中创建任何阶段
[Pipeline] sh
+ /tmp/demo.py
stage(0) {
echo "03:17:16 up 182 days, 12:17, 8 users, load average: 0.00, 0.03, 0.05"
}
stage(1) {
echo "03:17:17 up 182 days, 12:17, 8 users, load average: 0.00, 0.03, 0.05"
}
stage(2) {
echo "03:17:18 up 182 days, 12:17, 8 users, load average: 0.00, 0.03, 0.05"
}
同样,要使Blue Ocean管道具有一个带有日志的阶段点
答案 0 :(得分:1)
您可以对表达式求值,然后调用它。
node(''){
Closure x = evaluate("{it -> evaluate(it)}" )
x(" stage('test'){ script { echo 'hi'}}")
}
答案 1 :(得分:0)
由于Jenkins将您的Groovy脚本转换为Java,进行编译并然后执行结果,因此使用外部程序生成更多Groovy来执行将非常困难,因为该额外的Groovy代码会需要转换。但是生成的代码是运行的结果,这意味着转换已经完成。
相反,您可能想以编程方式在Groovy中构建阶段。
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="app">
<h2>Hello <a id="myName" href="#" v-on:mouseover="showMessage" v-bind:title="message">{{username}}</a></h2>
<div>
{{message}}
</div>
</div>
然后在您的主管道中
some_array = ["/tmp/demo.py", "sleep 10", "uptime"]
def getBuilders()
{
def builders = [:]
some_array.eachWithIndex { it, index ->
// name the stage
def name = 'Stage #' + (index + 1)
builders[name] = {
stage (name) {
def my_label = "jenkins_label" // can choose programmatically if needed
node(my_label) {
try {
doSomething(it)
}
catch (err) { println "Failed to run ${it}"; throw err }
finally { }
}
}
}
};
return builders
}
def doSomething(something) {
sh "${something}"
}
这将运行三个并行阶段,其中一个阶段将运行 stage('Do it all') {
steps {
script {
def builders = getBuilders()
parallel builders
}
}
,第二个阶段/tmp/demo.py
,第三个sleep 10
。