我正在尝试创建一个为应用程序构建多个项目的管道。
当项目成功构建(并行)时,我需要更新主执行器上的文件(以更改标签)。但是,詹金斯被困在“等待执行者”(我猜是因为执行者正在等待并行阶段完成?)
我的管道(简体):
def parallelStages = [:]
pipeline {
agent any
options { skipDefaultCheckout() }
stages {
// Grab code from GitRepo
stage ("Checkout Code") {
steps {
// grab code from repo
// stash code for slaves
// This stage is executed on master, at workspace NAME@2
}
}
stage ("Find Project") {
steps {
// findFiles is used to find projects, and assign them
parralelStages.put('foldername', BuildAndTestProject('folder'))
// This stage is executed on master, at workspace NAME@2
}
}
stage ("BuildAndTest") {
steps {
script {
parralelStages.put('failFast', false)
parallel(parralelStages)
}
}
}
stage ("deploy") {
// Deploy newly built projects based on YAML
}
}
BuildAndTestProject-Function(简体):
def BuildAndTestReact(def name) {
def label = "build-slave-${name}-${BUILD_NUMBER}"
return {
podTemplate(label: label, yaml: """) {
node(label) { // This is a build-slave
stage("BuildAndTest") {
stage("Unstash") {
// Unstash source for project on slave
}
stage("Build") {
// Build Project
}
stage("Test") {
// Test Project
}
stage("Set Yaml-Tag") {
node('master') { // THIS SHOULD RUN ON THE MAIN EXECUTOR, AS IT HAS THE FILES FOR ALL PROJECTS (I don't really know how I would dynamically stash/unstash these back to that executor from this slave)
// Update YAML for this project to set the tag to the one that was built in Build-Stage
}
}
}
}
}
}
}
我想要的是主要执行者(运行'Checkout Code'阶段的那个)为并行构建的每个项目更新YAML。
我不在乎YAML更新是否按顺序进行,我只需要对所有已构建的项目进行更新。
[将来,我要确保在“查找项目”阶段仅抓取具有文件更改的项目。然后,所有其他项目将在“部署”阶段保留标签“最新”。
[在主节点上有多个执行程序,'Set Yaml-Tag'在不同的工作空间(例如NAME @ 3 NAME @ 4等)中运行,这些工作空间实际上没有NAME @ 2中的文件。 (意味着它不适用于文件)
编辑:视觉辅助(由Blue Ocean插件提供):
此行为完全是设计使然,因为当多个分支并行运行时,詹金斯确实想[[not想要更新同一文件,因为在大多数情况下,一个分支会破坏另一个分支。
您可能希望以其他方式解决您的问题。我可以想到的是让所有并行分支都为您设置一个具有所需值的环境变量,并在所有并行分支都完成后,使最终分支读取这些环境变量并使用这些值更新文件。