Основываясь на идее следующей статьи:
https://jenkins.io/blog/2017/10/02/pipeline-templates-with-shared-libraries/
У меня есть следующий конвейер:
pipeline {
agent any
environment {
branch = 'master'
scmUrl = 'ssh://git@myScmServer.com/repos/myRepo.git'
serverPort = '8080'
developmentServer = 'dev-myproject.mycompany.com'
stagingServer = 'staging-myproject.mycompany.com'
productionServer = 'production-myproject.mycompany.com'
}
stages {
stage('checkout git') {
steps {
git branch: branch, credentialsId: 'GitCredentials', url: scmUrl
}
}
stage('build') {
steps {
sh 'mvn clean package -DskipTests=true'
}
}
stage ('test') {
steps {
parallel (
"unit tests": { sh 'mvn test' },
"integration tests": { sh 'mvn integration-test' }
)
}
}
stage('deploy development'){
steps {
deploy(developmentServer, serverPort)
}
}
stage('deploy staging'){
steps {
deploy(stagingServer, serverPort)
}
}
stage('deploy production'){
steps {
deploy(productionServer, serverPort)
}
}
}
post {
failure {
mail to: 'team@example.com', subject: 'Pipeline failed', body: "${env.BUILD_URL}"
}
}
}
Затем в статье показано, как сделатькод, полностью пригодный для повторного использования и передающий настраиваемые параметры следующим образом:
myDeliveryPipeline(branch: 'master', scmUrl: 'ssh://git@myScmServer.com/repos/myRepo.git',
email: 'team@example.com', serverPort: '8080',
developmentServer: 'dev-myproject.mycompany.com',
stagingServer: 'staging-myproject.mycompany.com',
productionServer: 'production-myproject.mycompany.com')
То, что там описано, решает только одну часть моих проблем, хотя мне также необходимо добавить некоторые пользовательские этапы.
Возвращаясь к конвейеру, это будет шаблонная часть:
pipeline {
agent any
environment {
branch = 'master'
scmUrl = 'ssh://git@myScmServer.com/repos/myRepo.git'
serverPort = '8080'
developmentServer = 'dev-myproject.mycompany.com'
stagingServer = 'staging-myproject.mycompany.com'
productionServer = 'production-myproject.mycompany.com'
}
stages {
stage('checkout git') {
steps {
git branch: branch, credentialsId: 'GitCredentials', url: scmUrl
}
}
stage('build') {
steps {
sh 'mvn clean package -DskipTests=true'
}
}
stage ('test') {
steps {
parallel (
"unit tests": { sh 'mvn test' },
"integration tests": { sh 'mvn integration-test' }
)
}
}
// CUT HERE THE PART TO BE INJECTED
}
post {
failure {
mail to: 'team@example.com', subject: 'Pipeline failed', body: "${env.BUILD_URL}"
}
}
}
Чтобы иметь какой-то вид:
myDeliveryPipeline(branch: 'master', scmUrl: 'ssh://git@myScmServer.com/repos/myRepo.git',
email: 'team@example.com', serverPort: '8080',
developmentServer: 'dev-myproject.mycompany.com',
stagingServer: 'staging-myproject.mycompany.com',
productionServer: 'production-myproject.mycompany.com') {
stage('deploy development'){
steps {
deploy(developmentServer, serverPort)
}
}
stage('deploy staging'){
steps {
deploy(stagingServer, serverPort)
}
}
stage('deploy production'){
steps {
deploy(productionServer, serverPort)
}
}
}
Как этого достичь?