Этот вопрос связан с одним из моих предыдущих вопросов здесь
Tl; dr связанного вопроса :
В основном я хочу, чтобы конвейер c генерировал распространяемые пакеты (zip-файлы и c) любого из моих приложений. Приложение может иметь несколько компонентов (почти все компоненты являются проектами Java / Spring или NodeJS).
План состоял в том, чтобы сохранить дескриптор конвейера каждого приложения в файле JSON, например:
{
"app": "MyApp",
"components": [
{
"name": "Component1",
"scmUrl": "https://git.mycompany.com/app/component1.git",
"buildCmd": "mvn clean install"
},
{
"name": "Component2",
"scmUrl": "https://git.mycompany.com/app/component2.git",
"buildCmd": "npm run build"
},
]
}
Для каждого приложения будет свой дескриптор, который будет проверяться в отдельном репозитории.
При запуске конвейера требуемое имя приложения будет входным параметром, а указанное выше репо будет клонировано и соответствующий дескриптор JSON будет загружен.
Здесь все начинает усложняться. Все компоненты будут иметь несколько общих этапов (Checkout, Build, Docker Build). Итак, я пытаюсь l oop массив компонентов и запускать этапы параллельно:
def parallelCheckoutStages = components.collectEntries {
[ "Checkout ${it.name}", generateCheckoutStage(it) ]
}
generateCheckoutStage(component) {
return {
stage("Stage: ${component.name}") {
script {
git(url: component.scmUrl, branch: component.branch)
}
}
}
}
def parallelBuildStages = components.collectEntries {
[ "Build ${it.name}", generateBuildStage(it) ]
}
generateBuildStage(component) {
return {
stage("Stage: ${component.name}") {
script {
sh script "${component.buildCmd}"
}
}
}
}
pipeline {
agent any
stages {
.
. // clone repo and load json
.
stage("Checkout Components") {
steps {
script {
parallel parallelCheckoutStages
}
}
}
stage("Build Components") {
steps {
script {
parallel parallelBuildStages
}
}
}
}
}
Иногда мне нужно запустить команду сборки внутри docker контейнера ( только для некоторых компонентов ). Чтобы выполнить sh это, я хочу изменить метод generateBuildStage
на что-то вроде этого:
generateBuildStage(component) {
if(component.requiresDocker) {
return {
stage("Stage: ${component.name}") {
agent {
docker {
image 'jdk11-mvn3.6'
}
}
script {
sh script "${component.buildCmd}"
}
}
}
} else {
return {
stage("Stage: ${component.name}") {
script {
sh script "${component.buildCmd}"
}
}
}
}
}
Когда я запускаю указанный выше код, я получаю сообщение об ошибке java.lang.NoSuchMethodError: No such DSL method 'agent' found among steps
Типа Вторая часть моего вопроса, мой конвейер кажется взломанным? Я мог бы полностью заменить параллельные этапы, создав отдельные задания для каждого компонента и вызвав их из конвейера. Какой подход лучше?