Запустить действие в декларативном конвейере Jenkins сразу после окончания этапа или непосредственно перед его началом? - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть следующее Jenkinsfile:

pipeline {
    agent any
    environment { }
    stages {
        stage('stageA') {
            steps {
                ... Do something with arg1, arg2 or arg3
            }
        }
        stage('stageB') {
            steps {
                ... Do something with arg1, arg2 or arg3
            }
        }
        ...
    }
}

Можно ли где-нибудь указать универсальный набор действий «до этапа» или «после этапа»? Сценарий использования будет отправлять информацию о регистрации в конце этапа в менеджер журналов, но было бы предпочтительно не копировать и вставлять эти вызовы в конце каждого этапа.

1 Ответ

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

Насколько я знаю, в трубопроводах Дженкинса нет универсального пост- или предстадийного хука. Вы можете определить этапы публикации в post разделе , но вам необходим один этап на каждом этапе.

Однако, если вы не хотите повторяться, у вас есть несколько вариантов.

Использовать общую библиотеку

Место для размещения повторяющегося кода общая библиотека . Этот способ позволяет вам объявлять свои собственные шаги, используя Groovy.

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

Использовать функцию

Если вы объявляете функцию вне pipeline, вы можете вызывать ее с любого этапа. Это на самом деле не задокументировано и может быть предотвращено в будущем. Насколько я понимаю, это портит координацию между мастером и агентами. Тем не менее, это работает:

pipeline {

    agent any

    stages {
        stage ("First") {
            steps {
                writeFile file: "resultFirst.txt", text: "all good"
            }
            post {
                always {
                    cleanup "first"
                }
            }
        }
        stage ("Second") {
            steps {
                writeFile file: "resultSecond.txt", text: "all good as well"
            }
            post {
                always {
                    cleanup "second"
                }
            }
        }

        post {
            always {
                cleanup "global" // this is only triggered after all stages, not after every
            }
        }
    }
}

void cleanup(String stage) {
    echo "cleanup ${stage}"
    archiveArtifacts artifacts: "result*"
}
...