java .lang.NoSuchMethodError: среди шагов не найден такой агент метода DSL. - PullRequest
0 голосов
/ 09 мая 2020

Этот вопрос связан с одним из моих предыдущих вопросов здесь

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

Типа Вторая часть моего вопроса, мой конвейер кажется взломанным? Я мог бы полностью заменить параллельные этапы, создав отдельные задания для каждого компонента и вызвав их из конвейера. Какой подход лучше?

...