Есть ли способ обеспечить закрытие в трубопроводе Дженкинс? - PullRequest
3 голосов
/ 16 апреля 2019

В настоящее время я работаю над общим конвейером, который будет использоваться через общую библиотеку для замены существующих заданий, чтобы упростить управление всеми заданиями из более централизованного места.Большинство существующих заданий имеют три этапа:

  1. выделяет узел
  2. извлекает код из репозитория git и создает его
  3. развертывает код для тестированиярепозиторий

Некоторые из заданий имеют несколько этапов if/else, которые выполняют действия на основе параметров или переменных среды, но в целом задания очень похожи в остальном.Решение, которое мне приходит в голову, состоит в том, чтобы использовать Closures, чтобы допустить выполнение дополнительного логического кода на этих этапах, но у меня возникают трудности с выяснением, как обеспечить это, чтобы единственными возможными «шагами», которые вы можете выполнить, были shи bat.

Вот упрощенный пример vars/genericPipeline.groovy, чтобы проиллюстрировать то, о чем я говорю:

def call(body)
{
    def config = [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = config
    body()

    String AGENT_LABEL = config.getOrDefault('label', 'mvn3')

    Closure MVN_BUILD = config.getOrDefault('build', {
        sh "mvn clean install"
    })

    Closure MVN_DEPLOY = config.getOrDefault('deploy', { BRANCH_NAME, ARTIFACT_COORDINATES, SERVER_ID, REPO, TMP_REPO ->
        def SERVER_URL = REPO

        if (BRANCH_NAME != 'master')
        {
            SERVER_URL = TMP_REPO
        }

        sh label: "Deploying ${ARTIFACT_COORDINATES}",
           script: "mvn deploy" +
                   " -DskipTests" +
                   " -DaltDeploymentRepository=${SERVER_ID}::default::${SERVER_URL}"
    })

    pipeline {
        agent {
            node {
                label AGENT_LABEL
            }
        }
        environment {
            GROUP_ID = readMavenPom().getGroupId()
            ARTIFACT_ID = readMavenPom().getArtifactId()
            VERSION = readMavenPom().getVersion()
            ARTIFACT_COORDINATES = "${readMavenPom().getGroupId()}:${readMavenPom().getArtifactId()}:${readMavenPom().getVersion()}"
        }
        stages {
            stage('Building...') {
                steps {
                    MVN_BUILD()
                }
            }
            stage('Deploying...') {
                steps {
                    MVN_DEPLOY(BRANCH_NAME, env.ARTIFACT_COORDINATES, config.serverId, config.repo, config.tmpRepo)
                }
            }
        }
    }
}

Это может позже использоваться в заданиях как:

genericPipeline {
   build = {
       sh "mvn clean install"
   }
   // could be set for the "corner cases" or could skipped to use the 
   // default deploy closure for all other cases.
   deploy = {
       sh "mvn deploy"
   }
}

Как видите, deploy использует для развертывания два разных репозитория на основе имени branch.Я знаю, что я мог бы просто поместить логику в stage, но проблема в том, что некоторые задания не являются многоотраслевыми, и у них не было бы этой логики if/else.Однако они все равно будут иметь одинаковую структуру конвейера без каких-либо других изменений, и я предпочел бы поддерживать один конвейер, а не 5 относительно похожих каналов для всех различных случаев if/else, которые могут возникнуть на этапе развертывания.:)

Итак, вопрос здесь - возможно ли только занести в белый список выполнение определенных шагов (т.е. sh/bat) в замыканиях MVN_BUILD и MVN_DEPLOY?Или, если есть другой, возможно, даже лучший способ справиться с этим делом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...