Извлечение всего этапа Jenkins в общую библиотеку? - PullRequest
0 голосов
/ 08 ноября 2018

Можно ли взять полное определение stage('foo') {...} и извлечь его в общую библиотеку в Jenkins? Документы очень четко рассказывают о том, как вытащить отдельный шаг, но я не могу найти способ пройти весь этап, параметризовать его и повторно использовать в глобальном масштабе. Я думал, что, возможно, просто return stage... сработает, но это ошибочное возвращаемое значение.

1 Ответ

0 голосов
/ 08 ноября 2018

Зависит от того, используете ли вы сценарий или декларативный конвейер.

Скриптовый конвейер более гибок и позволяет вам, например, создавать этапы на основе определенных условий (каждый этап конвейера может иметь различное количество и вид этапов). В этом типе конвейера вы можете извлечь полную стадию в класс совместно используемой библиотеки и внутри блока node {}. Рассмотрим следующий пример:

// src/ScriptedFooStage.groovy
class ScriptedFooStage {
    private final Script script

    ScriptedFooStage(Script script) {
        this.script = script
    }

    // You can pass as many parameters as needed
    void execute(String name, boolean param1) {
        script.stage(name) {
            script.echo "Triggering ${name} stage..."
            script.sh "echo 'Execute your desired bash command here'"

            if (param1) {
                script.sh "echo 'Executing conditional command, because param1 == true'"
            }
        }
    }
}

Тогда Jenkinsfile может выглядеть так:

node {
    new ScriptedFooStage(this).execute('Foo', true)
}

Как видите, вся сцена была заключена в методе ScriptedFooStage.execute(). Его имя также взято из параметра name - сценарий конвейера позволяет вам делать такие вещи.


Декларативный конвейер , с другой стороны, более строг и самоуверен. Это исправлено, если речь идет о количестве этапов и их именах (вы не можете динамически моделировать, какие этапы присутствуют в каждой сборке и как они называются). Вы по-прежнему можете использовать классы совместно используемой библиотеки, но вы можете выполнять их только внутри блока script {} внутри блока stage('Name') { steps {} }. Это означает, что вы не можете извлечь всю стадию в отдельный класс, но только некоторую часть, которая выполняется на уровне шагов. Рассмотрим следующий пример:

// src/DeclarativeFooStage.groovy
class DeclarativeFooStage {
    private final Script script

    DeclarativeFooStage(Script script) {
        this.script = script
    }

    // You can pass as many parameters as needed
    void execute(String name, boolean param1) {
        script.echo "Triggering script with name == ${name}"
        script.sh "echo 'Execute your desired bash command here'"

        if (param1) {
            script.sh "echo 'Executing conditional command, because param1 == true'"
        }
    }
}

И Jenkinsfile может выглядеть так:

// Jenkinsfile
pipeline {
    agent any

    stages {
        stage('Foo') {
            steps {
                script {
                    new DeclarativeFooStage(this).execute('something', false)
                }
            }
        }
    }
}

Если бы мы попытались выполнить new DeclarativeFooStage(this).execute('something', false) вне блока script {} в декларативном конвейере, мы получили бы ошибки компиляции.

Заключение

Выбор между сценарием или декларативным конвейером зависит от конкретного варианта использования. Если вы хотите получить максимальную гибкость при моделировании бизнес-логики конвейера, сценарий конвейера может быть хорошим выбором. Тем не менее, это идет с некоторой ценой. Например, скриптовый конвейер не поддерживает перезапуск сборки конвейера с определенного этапа - это поддерживается только декларативным конвейером. (Представьте, что у вас есть 10 этапов в конвейере, а этап 7 не выполнен из-за какой-то глупой ошибки, и вы хотели бы перезапустить сборку с 7-го этапа - в сценарии с конвейером вам придется перезапускаться с самого начала, тогда как декларативный конвейер может перезапускаться с 7-го этапа, запоминая результаты всех 6 предыдущих этапов).

...