В настоящее время я работаю над общим конвейером, который будет использоваться через общую библиотеку для замены существующих заданий, чтобы упростить управление всеми заданиями из более централизованного места.Большинство существующих заданий имеют три этапа:
- выделяет узел
- извлекает код из репозитория git и создает его
- развертывает код для тестированиярепозиторий
Некоторые из заданий имеют несколько этапов 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
?Или, если есть другой, возможно, даже лучший способ справиться с этим делом?