У меня есть несколько микросервисов, использующих один и тот же конвейер из общей библиотеки , которая называется jenkins-shared-pipelines . Jenkinsfile для микросервиса выглядит следующим образом:
@Library(['jenkins-shared-pipelines']) _
gradleProjectPrPipeline([buildAgent: 'oc-docker-jdk11', disableIntegrationTestStage: true])
В jenkins-shared-pipelines / vars, gradleProjectPrPipeline имеет следующие этапы:
/**
* gradleProjectPrPipeline is a generic pipeline
* @param pipelineProperties map used to pass parameters
* @return
*/
void call(Map pipelineProperties = [:]) {
.
.
.
pipeline {
agent {
node {
label "${pipelineProperties.buildAgent}"
}
}
options {
skipDefaultCheckout true
timeout(time: 1, unit: 'HOURS')
buildDiscarder(logRotator(
numToKeepStr: '5',
daysToKeepStr: '7',
artifactNumToKeepStr: '1',
artifactDaysToKeepStr: '7'
))
}
stages {
stage('Clone') {
steps {
//clone step
}
}
stage('Compile') {
steps {
script {
/*Some custom logic*/
}
runGradleTask([task: 'assemble',
rawArgs: defaultGradleArgs + " -Pcurrent_version=${releaseTag}"
])
}
}
stage('Tests') {
parallel {
stage('Unit tests') {
steps {
//Unit tests
}
}
stage('Integration tests') {
steps {
//Integration tests
}
}
}
}
stage('Sonar scan') {
steps {
//Sonar scanning
}
}
}
post {
unsuccessful {
script {
bitbucketHandler.notifyBuildFail([
displayName: pipelineName,
displayMessage: "Build ${env.BUILD_ID} failed at ${env.BUILD_TIMESTAMP}."
])
}
}
success {
script {
bitbucketHandler.notifyBuildSuccess([
displayName: pipelineName,
displayMessage: "Build ${env.BUILD_ID} completed at ${env.BUILD_TIMESTAMP}."
])
}
}
}
}
}
Сейчас, в дополнение к указанному выше конвейеру в jenkins-shared-pipelines (в том же каталоге vars) будет еще несколько конвейеров например: awsPipeline, azurePipeline и т. Д., Которые также будут включать этапы развертывания. Эти дополнительные конвейеры потребуют все этапы в вышеупомянутом gradleProjectBranchWrapper, а также добавят несколько своих собственных этапов . В настоящее время мы просто копируем и вставляем эти этапы в эти дополнительные конвейеры,
void call (Map pipelineProperties = [:]) {. ,.
pipeline {
agent {
node {
label "${pipelineProperties.buildAgent}"
}
}
options {
skipDefaultCheckout true
timeout(time: 1, unit: 'HOURS')
buildDiscarder(logRotator(
numToKeepStr: '5',
daysToKeepStr: '7',
artifactNumToKeepStr: '1',
artifactDaysToKeepStr: '7'
))
}
stages {
stage('Clone') {
steps {
//clone step
}
}
stage('Compile') {
steps {
script {
/*Some custom logic*/
}
runGradleTask([task: 'assemble',
rawArgs: defaultGradleArgs + " -Pcurrent_version=${releaseTag}"
])
}
}
stage('Tests') {
parallel {
stage('Unit tests') {
steps {
//Unit tests
}
}
stage('Integration tests') {
steps {
//Integration tests
}
}
}
}
stage('Sonar scan') {
steps {
//Sonar scanning
}
}
stage('AWS'){
}
}
post {
unsuccessful {
script {
bitbucketHandler.notifyBuildFail([
displayName: pipelineName,
displayMessage: "Build ${env.BUILD_ID} failed at ${env.BUILD_TIMESTAMP}."
])
}
}
success {
script {
bitbucketHandler.notifyBuildSuccess([
displayName: pipelineName,
displayMessage: "Build ${env.BUILD_ID} completed at ${env.BUILD_TIMESTAMP}."
])
}
}
}
}
}
затем мы вызываем эти новые конвейеры из микроуслуг, например:
@Library(['jenkins-shared-pipelines']) _
awsPipeline([buildAgent: 'oc-docker-jdk11', disableIntegrationTestStage: true])
Как очевидно, существует избыточность кода как клонирование на стадии sonarScanраспространены, но не существует «базового конвейера» или другого способа включить эти общие этапы во все конвейеры . Мне было интересно, есть ли способ «включить» gradleProjectPrPipeline (который может служить «базовым конвейером») в такие конвейеры, как awsPipeline, azurePipeline и так далее. Примечание:
- Рабочее пространство (где олень-клон проверяет код и работают более поздние этапы) будет использоваться awsPipeline и т. Д. Другими словами, переменные и результаты изgradleProjectBranchWrapper должен быть доступен для awsPipeline и т. д.
- В gradleProjectBranchWrapper есть постоблок, другие конвейеры могут иметь свои собственные постблоки