jenkins imperative pipeline vs declarative pipeline
Embed Size (px)
TRANSCRIPT

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