Jenkins Pipeline Плохой, Хороший, Декларативный
Jenkins PipelineПлохой, Хороший, Декларативный
DISCLAIMER
Наше мнение может не совпадать с официальной позицией наших работодателей, начальников, коллег или других специалистов.
Мы не претендуем на роль последней инстанции в вопросах использования той или иной технологии.
Все представленные решения вы можете использовать на свой страх и риск. За все ваши действия ответственность несёте только вы сами.
Все персонажи вымышлены, совпадения случайны.
5
Что делает Jenkins на JUG?
План
● Что такое декларативный пайплайн?● Почему его стоит попробовать?● Немного теории● Демо● Делаем выводы
7
Jenkins Pipeline
Предпосылки к Declarative
Структура
Условные(conditional) функции
Вариативность
Declarative Pipeline 1.0Февраль 2017
Declarative Pipeline 1.0Февраль 2017 Далее кратко – DP
BlueOcean и DP = ❤
Declarative Pipeline
durability
supportability
velocity
надежная сериализация
строгие правила расширения
порог входа и скорость изменений
15
pipeline location and declaration
pipeline {
…
}
16
Agent
agent any
● any● none● label● node (like label but with advanced options)● docker● dockerfile
17
Stages and steps
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}18
Environment
environment {
MYKEY = credentials('my-prefined-secret-text')
}
steps {
sh 'printenv'
}
19
Post → after steps
post {
success {
junit 'target/surefire-reports/**/*.xml'
}
}
20
Post
● always
● success
● failure
● unstable
● changed
21
Parameters
parameters {
string(
name: 'PERSON',
defaultValue: 'Mr Jenkins',
description: 'Who should I say hello to?'
)
}
22
Parallel
parallel (
linux: {
build job: 'full-build-linux',
parameters: [string(name: 'GIT_BRANCH_NAME',
value: GIT_BRANCH)]
},
windows: {
build job: 'full-build-windows',
parameters: [string(name: 'GIT_BRANCH_NAME',
value: GIT_BRANCH)]
},
failFast: false
)
23
When → expression
expression {
return readFile('pom.xml')
.contains('mycomponent')
}
expression { return A || B }
anyOf { branch 'master'; branch 'staging' } } 24
When → expression
when {
branch 'production'
environment name: 'DEPLOY_TO',
value: 'production'
}
25
When → expression
expression {
GIT_BRANCH = 'origin/' + sh(
returnStdout: true,
script: 'git rev-parse --abbrev-ref HEAD')
.trim()
return !(GIT_BRANCH == 'origin/master'
|| params.FORCE_FULL_BUILD)
}
} 26
Options
● retry● timestamps● disableConcurrentBuilds● timeout
27
Retry
stage('deploy-test') {
try {
build 'yourJob'
} catch(error) {
echo "First build failed, let's retry"
retry(2) {
input 'Retry the job ?'
build 'yourJob'
}
}
}
28
Wait until
stage('deploy-test') {
waitUntil {
try {
build 'yourJob'
true
} catch(error) {
input "Retry the job ?"
currentBuild.result = 'SUCCESS'
false
}
}
}
29
Хватит п***ть давай демо DP
30
Script
script {
def browsers = ['chrome', 'firefox']
for (int i = 0; i < browsers.size(); ++i) {
echo "Testing the ${browsers[i]} browser"
}
}
31
Declarative Pipeline. Demo
● перепишем всё используя новые знания● when { waitForQualityGate() ... } → steps { error '...' }
● script and shared args
32
Императивный
→ Просто работает
→ Легко настраивается
→
→ Pipeline Hell
→ Нет структуры
→ CPS
Декларативный
→ Сложнее сломать*
→ Легче поддерживать
→ И распространять
→ За рамками дозволенного действовать
сложно
→ Документация пока страдает
→ Нет “простых” точек расширения
Материалы
Jenkins Handbook
Jenkins Blog
Cloudbees Documentation
34
Jenkins Area Meetup JAM
Jenkins Moscow Meetup
@jenkins_ru
#jenkinsci_ru
https://github.com/aatarasoff/Jenkins-pipeline-live-demo
https://github.com/aatarasoff/spring-boot-example-for-jenkins-pipeline
https://github.com/lavcraft/jenkins-pipeline-libs-example
https://alfalab.design/vacancies/java-razrabotchik
https://alfalab.design/vacancies/
Минутка маркетинга
Спасибо! Готовы ответить на ваши вопросы
@tolkv
@aatarasoff
@lavcraft
@aatarasoff