如何在Jenkins管道中注入阶段或步骤

时间:2019-10-24 08:37:09

标签: jenkins jenkins-pipeline

此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管道具有一个带有日志的阶段点

2 个答案:

答案 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