Jenkins Imperative Pipeline vs Declarative Pipeline

Preview:

Citation preview

Jenkins PipelineПлохой, Хороший, Декларативный

@tolkv

@lavcraft

@aatarasoff

@aatarasoff

tolk.kv@gmail.com

aatarasoff@gmail.com

2

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

Recommended