gpt4 book ai didi

jenkins - 脚本化 jenkinsfile 并行阶段

转载 作者:行者123 更新时间:2023-12-02 03:32:49 26 4
gpt4 key购买 nike

我正在尝试使用 groovy DSL 编写一个脚本化的 Jenkinsfile,它将在一组阶段内具有并行步骤。

这是我的 Jenkins 文件:

node {   
stage('Build') {
sh 'echo "Build stage"'
}

stage('API Integration Tests') {
parallel Database1APIIntegrationTest: {
try {
sh 'echo "Build Database1APIIntegrationTest parallel stage"'
}
finally {
sh 'echo "Finished this stage"'
}

}, Database2APIIntegrationTest: {
try {
sh 'echo "Build Database2APIIntegrationTest parallel stage"'
}
finally {
sh 'echo "Finished this stage"'
}

}, Database3APIIntegrationTest: {
try {
sh 'echo "Build Database3APIIntegrationTest parallel stage"'
}
finally {
sh 'echo "Finished this stage"'
}
}
}

stage('System Tests') {
parallel Database1APIIntegrationTest: {
try {
sh 'echo "Build Database1APIIntegrationTest parallel stage"'
}
finally {
sh 'echo "Finished this stage"'
}

}, Database2APIIntegrationTest: {
try {
sh 'echo "Build Database2APIIntegrationTest parallel stage"'
}
finally {
sh 'echo "Finished this stage"'
}

}, Database3APIIntegrationTest: {
try {
sh 'echo "Build Database3APIIntegrationTest parallel stage"'
}
finally {
sh 'echo "Finished this stage"'
}
}
}
}

我想要 3 个阶段:构建;集成测试和系统测试。在这两个测试阶段中,我希望并行执行 3 组测试,每组测试针对不同的数据库。

我有 3 个可用的执行者。一个在主服务器上,两个代理,我希望每个并行步骤都在任何可用的执行器上运行。

我注意到,运行管道后,我只看到 3 个阶段,每个阶段都标记为绿色。我不想查看该阶段的日志来确定该阶段内的任何并行步骤是否成功/不稳定/失败。

我希望看到测试阶段中的 3 个步骤 - 标记为绿色、黄色或红色(成功、不稳定或失败)。

我考虑过将测试扩展到自己的阶段,但意识到不支持并行阶段(有谁知道这是否会受到支持?),所以我不能这样做,因为管道会花费太多时间需要很长时间才能完成。

任何见解将不胜感激,谢谢

最佳答案

在 Jenkins 脚本化管道中,parallel(...) 采用一个映射来描述要构建的每个阶段。因此,您可以通过编程方式预先构建构建阶段,这种模式允许灵活的串行/并行切换。
我使用了与此类似的代码,其中prepareBuildStages返回一个映射列表,每个列表元素按顺序执行,而映射描述了该点的并行阶段。

// main script block
// could use eg. params.parallel build parameter to choose parallel/serial
def runParallel = true
def buildStages

node('master') {
stage('Initialise') {
// Set up List<Map<String,Closure>> describing the builds
buildStages = prepareBuildStages()
println("Initialised pipeline.")
}

for (builds in buildStages) {
if (runParallel) {
parallel(builds)
} else {
// run serially (nb. Map is unordered! )
for (build in builds.values()) {
build.call()
}
}
}

stage('Finish') {
println('Build complete.')
}
}

// Create List of build stages to suit
def prepareBuildStages() {
def buildStagesList = []

for (i=1; i<5; i++) {
def buildParallelMap = [:]
for (name in [ 'one', 'two', 'three' ] ) {
def n = "${name} ${i}"
buildParallelMap.put(n, prepareOneBuildStage(n))
}
buildStagesList.add(buildParallelMap)
}
return buildStagesList
}

def prepareOneBuildStage(String name) {
return {
stage("Build stage:${name}") {
println("Building ${name}")
sh(script:'sleep 5', returnStatus:true)
}
}
}

生成的管道显示为: Jenkins Blue Ocean parallel pipeline

并行 block 中可以嵌套的内容有一定的限制,请参阅the pipeline documentation以获得确切的详细信息。不幸的是,大部分引用文献似乎偏向于声明式管道,尽管它比脚本式管道更不灵活(恕我直言)。pipeline examples页面是最有帮助的。

关于jenkins - 脚本化 jenkinsfile 并行阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46834998/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com