Многоотраслевой конвейер Jenkins не поддерживает триггеры PathRestriction - PullRequest
0 голосов
/ 22 мая 2018

Цель

Построить репо чаще для изменений java и реже для изменений базового образа докера.

Ситуация

У нас есть два многоотраслевых конвейерных задания: build-java и build-base-docker.Мы хотим, чтобы build-base-docker запускался для основных ветвей и функций, только когда толчки содержат изменения ниже /docker.

Подход

После облачных пчел Какнастроить Checkout для Pipleine Multibranch? doc, мы реализовали следующие изменения.

Однако, изменение src/main/java/foo.java запускает задание build-base-docker для этой ветви, когда мы не хотим, чтобы оно

Это действительно ошибка JENKINS-36195 или я делаю что-то неправильно, что приводит к неожиданному триггеру?

node('java-build') {

stage ('git checkout') {
    checkout([
            $class: 'GitSCM',
            branches: scm.branches,
            extensions: scm.extensions + [
                [$class: 'PathRestriction', excludedRegions: '.*', includedRegions: 'docker/.*']
            ],
            userRemoteConfigs: [[credentialsId: 'our-git-repo-deploy-key', url: 'git@github.com:we/our-repo.git']]

    ])
}
...
}

1 Ответ

0 голосов
/ 22 мая 2018

Если Дженкинс не может хорошо обрабатывать ограничения пути для многоотраслевых конвейеров, то мы делаем это из нашего кода конвейера (или из общей библиотеки, чтобы уменьшить дублирование).

Если у нас несколько проверок, это может стать немного проблематичным, так как обо всех будет сообщено.Тем не менее, при условии, что они не используют один и тот же макет, риск ложных срабатываний низок.Например, jenkins-shared-library обычно видит изменения ниже / vars dir, а не docker.

node() {
    if ( ! doChangesRequireBuild('^docker/.*')) {
        currentBuild.result = 'ABORTED'
        return 'Changes not made to docker/... base image files. Aborting build'
    }
}

/**
 * Provide List of changed file paths since last successful build
 */
def getChangedFiles() {
    def found = []

    for (def changeSet in currentBuild.getChangeSets()) {
        for (def change in changeSet.logs) {
            for (def path in change.paths) {
                found.add(path.path)
            }
        }
    }
    return found
}

/**
 * do changes since last successful build mandate a build?
 * @param pathRegex path restriction regex pattern
 * @return true if any file paths match the regex
 */
boolean doChangesRequireBuild(def pathRegex) {

    for (def path in getChangedFiles()) {
        if ( path ==~ pathRegex) {
            return true
        }
    }
    return false
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...