JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET JENKINS - - PowerPoint PPT Presentation

jenkins moderne et jenkins moderne et jenkins moderne et
SMART_READER_LITE
LIVE PREVIEW

JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET JENKINS - - PowerPoint PPT Presentation

JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET LIVRAISON CONTINUE LIVRAISON CONTINUE LIVRAISON CONTINUE LIVRAISON CONTINUE LIVRAISON CONTINUE LIVRAISON CONTINUE JENKINS


slide-1
SLIDE 1

JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET JENKINS MODERNE ET LIVRAISON CONTINUE LIVRAISON CONTINUE LIVRAISON CONTINUE LIVRAISON CONTINUE LIVRAISON CONTINUE LIVRAISON CONTINUE LIVRAISON CONTINUE LIVRAISON CONTINUE LIVRAISON CONTINUE LIVRAISON CONTINUE LIVRAISON CONTINUE LIVRAISON CONTINUE LIVRAISON CONTINUE LIVRAISON CONTINUE LIVRAISON CONTINUE LIVRAISON CONTINUE

Écrivons ensemble des Pipeline Déclaratifs pour votre application

1
slide-2
SLIDE 2

MOTIVATIONS OF THIS TALK

2 . 1
slide-3
SLIDE 3 2 . 2
slide-4
SLIDE 4

JENKINS PROJECT

3 . 1
slide-5
SLIDE 5

MEET JENKINS

#1 Continuous Integration and Delivery server Created by Kohsuke Kawaguchi 12 years ago (Hudson) An independent and active community ( ) 100,000 active installations 300,000 Jenkins servers 1,200+ plugins https://jenkins.io

3 . 2
slide-6
SLIDE 6

JENKINS POPULARITY

http://www.infoq.com/research/ci-server http://stats.jenkins.io/

3 . 3
slide-7
SLIDE 7

JENKINS IS THE CD ORCHESTRATOR

3 . 4
slide-8
SLIDE 8

WHY JENKINS 2

Jenkins 1 is more than 12 years old Because Continuous Integration have changed…​ jenkins-ci.org !? slave ➞ agent "Fire and forget" "Modern Web": https://jenkins.io https://jenkins.io/docs https://plugins.jenkins.io

3 . 5
slide-9
SLIDE 9

JENKINS 2 GOALS

Target: CI → CD No breaking changes from Jenkins 1 Smooth upgrade Plugins compatibility First time experience improvement Brand new Wizard Pipeline-as-Code: Jenkinsfile stored in SCM Groovy DSL: "Code your Pipeline"

3 . 6
slide-10
SLIDE 10

JENKINS IN 2017

Declarative Pipeline Still Jenkinsfile Easier Compatible with Scripted Pipeline BlueOcean Brand new GUI Written in ReactJS Opiniated

3 . 7
slide-11
SLIDE 11

HELLO

4 . 1
slide-12
SLIDE 12

WHOAMI: DAMIEN DUPORTAL

Training Engineer @ CloudBees Docker & Apple fanboy. Sorry Human stack focused Rock climber Contact: Twitter: Github: Google: @DamienDuportal dduportal damien.duportal@gmail.com

4 . 2
slide-13
SLIDE 13

CLOUDBEES

<sell> Software at the Speed of Ideas Hub of "Enterprise Jenkins and DevOps" We provide: Jenkins "Enterprise" Distribution Services around Jenkins </sell>

4 . 3
slide-14
SLIDE 14

WHO ARE YOU ?

4 . 4
slide-15
SLIDE 15

REQUIREMENTS

VirtualBox >= 5.1.18 Vagrant >= 1.9.1 From a Terminal, download the VM (1 time, ~1Gb): Initialize the VM project:

vagrant box add mixit2017-jenkins \ https://github.com/oufti-playground/lab-vm/releases/download/mixit-2017/jenkins-lab-demo.box mkdir mixit2017-jenkins cd mixit2017-jenkins vagrant init -m -f mixit2017-jenkins

4 . 5
slide-16
SLIDE 16

LET’S GET STARTED

Start the VM from the mixit2017-jenkins folder: Access your instance homepage:

$ ls Vagrantfile $ pwd .../mixit2017-jenkins $ vagrant up

http://localhost:10000

4 . 6
slide-17
SLIDE 17

DEMO APPLICATION

5 . 1
slide-18
SLIDE 18

DEMO APPLICATION: WHY ?

Goal: Illustrate a Software Supply Chain with a demo application Challenge: So many languages/framework/toolchains Solution: Opinionated demo application (language, tooling, etc.) Put everyone on same page with initial exercise

5 . 2
slide-19
SLIDE 19

DEMO APPLICATION: WHAT ?

Web application Homepage show a link to /greeting endpoint Endpoint /greeting: greets the world Provides the parameter name: greet the person /greeting?name=Butler prints Hello Butler

5 . 3
slide-20
SLIDE 20

DEMO APPLICATION: TECHNICAL STACK

This is the Language: Java (OpenJDK 8) Toolchain: Maven (Maven >= 3.3) Source code stored inside a local Git repository Spring Boot Starter

5 . 4
slide-21
SLIDE 21

DEMO APPLICATION: HOW ?

5 . 5
slide-22
SLIDE 22

DEMO APPLICATION: ACCESS IT

Open the local GitServer: Sign In using the top-right button User is butler, same for the password Browse to the repository. Either: Click on Explore → butler/demoapp

  • r direct link:

http://localhost:10000/gitserver http://localhost:10000/gitserver/butler/demoapp

5 . 6
slide-23
SLIDE 23

DEMO APPLICATION: CHECK IT

Maven configuration: pom.xml Application Source code: src/main/java/ Application Templates/HTML: src/main/resources/ Application Test code: src/test/java

5 . 7
slide-24
SLIDE 24

DEMO APPLICATION: GET IT

Open the DevBox, the Web based command line: WebSockets must be authorized Copy the demoapp repository URL from GitServer Run the following commands: http://localhost:10000/devbox

# Get the git repository git clone http://localhost:10000/gitserver/butler/demoapp.git # Browse to the local repository cd ./demoapp # Check source code ls -l cat pom.xml

5 . 8
slide-25
SLIDE 25

DEMO APPLICATION: DEVBOX TRICKS

Clear the window: clean Show command history: history CTRL + R: search the command history interactively CTRL + C: cancel current command and clean line buffer CTRL + A: jump to beginning of line CTRL + E: jump to end of line

5 . 9
slide-26
SLIDE 26

DEMO APPLICATION: MAVEN

Maven TL;DR: Provide a standardized workflow pom.xml describe the application Maven Command line : mvn, expects goals (workflow steps) Can have flags (configuration on the fly)

mvn dependency:list mvn dependency:list -fn

5 . 10
slide-27
SLIDE 27

DEMO APPLICATION: COMPILE IT

Maven goal is compile Solves dependencies for build Process source code Generate classes Content put in the ./target folder:

mvn compile ls -l ./target

5 . 11
slide-28
SLIDE 28

DEMO APPLICATION: UNIT-TEST IT

Maven goal is test Solves dependencies for unit test Call compile Compile Unit Test classes Run Unit Test Tests Reports put in the ./target/surefire-reports folder:

mvn test ls -l ./target/surefire-reports

5 . 12
slide-29
SLIDE 29

DEMO APPLICATION: BUILD IT

Maven goal is package Solves dependencies for packaging Call compile and test Package the application as specified in pom.xml Put the artifact (generated packages) in ./target

mvn package ls -lrh ./target/

5 . 13
slide-30
SLIDE 30

DEMO APPLICATION: RUN IT

Spring Boot demo is run as an "Über-Jar" You only need the java CLI from a JRE: Check the application on the 10080 port:

java -jar ./target/demoapp.jar

http://localhost:10080

5 . 14
slide-31
SLIDE 31

DEMO APPLICATION: A NOTE ABOUT TESTS

Unit / Integration Test ? Bedtime reading: https://martinfowler.com/tags/testing.html

5 . 15
slide-32
SLIDE 32

DEMO APPLICATION: INTEGRATION TESTING

Maven goal is verify Solves dependencies for integration tests Call compile, test and package Run Tests against the packaged application Tests Reports put in the ./target/failsafe-reports folder:

mvn verify ls -l ./target/failsafe-reports

5 . 16
slide-33
SLIDE 33

THAT’S ALL FOLKS !

5 . 17
slide-34
SLIDE 34

CONTINUOUS INTEGRATION WITH JENKINS

aka "CI"

6 . 1
slide-35
SLIDE 35

CI: WHY ?

— Martin Fowler Continuous Integration doesn’t get rid of bugs, but it does make them dramatically easier to find and remove.

6 . 2
slide-36
SLIDE 36

CI: WHAT ?

— Martin Fowler - Continuous Integration Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily, leading to multiple integrations per day.

6 . 3
slide-37
SLIDE 37

CI: HOW ?

Each integration is verified by an automated build (including test) Integrate code often, at least daily, to make integration a non-event Continuously build and integrate, with a feedback loop

6 . 4
slide-38
SLIDE 38

CONTINUOUS INTEGRATION WITH JENKINS

6 . 5
slide-39
SLIDE 39

CI: ACCESSING JENKINS

Access your Jenkins instance: Log in as the user butler (password is the same) It is the "Legacy UI" http://localhost:10000/jenkins

6 . 6
slide-40
SLIDE 40

CI: JENKINS BLUEOCEAN

Switch to BlueOcean, the new UI Direct link: Or click on the top button "Open Blue Ocean" http://localhost:10000/jenkins/blue

6 . 7
slide-41
SLIDE 41

CI: CREATING PROJECT

Create your 1st Pipeline: Stored in Git Fetch URL from the Gitserver Direct link: Add a User/password credential (butler / butler) Pipeline is empty (for now): no Jenkinsfile http://localhost:10000/gitserver/butler/demoapp.git

6 . 8
slide-42
SLIDE 42

CI: FAST FEEDBACK WITH WEBHOOKS

We want Fast feedback ! Pushed code to repository ? Tell Jenkins to build it now Let’s use Webhook to the repository HTTP request Gitserver → Jenkins

6 . 9
slide-43
SLIDE 43

CI: ADD A GOGS WEBHOOKS

From repo. in Gitserver → Settings → Webhooks Direct link: Add a Gogs webhook: Payload URL: When should this webhook be triggered?: I need everything http://localhost:10000/gitserver/butler/demoapp/settings/hooks http://localhost:10000/jenkins/job/demoapp/build? delay=0

6 . 10
slide-44
SLIDE 44

CI: STARTING WITH PIPELINES

Pipeline-as-code: We need a Jenkinsfile Declarative or Scripted ? Where to start ? Documentation: Getting Started: Syntax Reference: https://jenkins.io/doc/pipeline https://jenkins.io/doc/pipeline/tour/hello-world/ https://jenkins.io/doc/book/pipeline/syntax/

6 . 11
slide-45
SLIDE 45

CI: BLUEOCEAN PIPELINE EDITOR

Provides the full round trip with SCM No Pipeline ? Follow the wizard (not Gandalf fool !) Already have a Pipeline ? Edit, commit, run it Needs a compliant SCM Only Github with BO 1.0.1 Interested ? Open-Source: Contribute !

6 . 12
slide-46
SLIDE 46

CI: USE THE PIPELINE EDITOR

Let’s hack: open the BlueOcean Pipeline Editor Direct (hidden) URL: Use CTRL + S (On Mac: CMD +S) to switch to textual version Also, use the "Legacy" Pipeline Syntax Snippet Generator: http://localhost:10000/jenkins/blue/organizations/jenkins/pipeline- editor/ http://localhost:10000/jenkins/job/demoapp/pipeline-syntax/

6 . 13
slide-47
SLIDE 47

CI: EXERCISE - YOUR FIRST PIPELINE

Use the BO editor and Gitserver Create a Pipeline that have a single stage "Hello" This stage have 1 step that prints the message "Hello World" Copy/Paste this Pipeline in a new file Jenkinsfile on the repository root A build will kick off immediately: demoapp Activity Dashboard

6 . 14
slide-48
SLIDE 48

CI: SOLUTION - YOUR FIRST PIPELINE

pipeline { agent any stages { stage('Build') { steps { echo 'Hello World !' } } } }

6 . 15
slide-49
SLIDE 49

CI: EXERCISE - SIMPLE BUILD PIPELINE

Exercise: Implement a simple build pipeline demoapp We want 4 stages, for the 4 Maven goals: clean compile, test, package, verify We need to build on the maven agent

6 . 16
slide-50
SLIDE 50

CI: SOLUTION - SIMPLE BUILD PIPELINE

pipeline { agent { node { label 'maven' } } stages { stage('Compile') { steps { sh 'mvn compile' } } stage('Unit T ests') { steps { sh 'mvn test' } } stage('Build') { steps { sh 'mvn package' } } stage('Verify') {

6 . 17
slide-51
SLIDE 51

CI: EXERCISE - ARTIFACTS

We want to simplify to 2 stages, based on Unit Tests definition: Build: compile, unit test and package the application Verify: Run Integration Tests We also want to archive the generated jar file Only if the build is in sucess Clues: Keywords post + success (not in Editor), and archiveArtifacts

6 . 18
slide-52
SLIDE 52

CI: SOLUTION - ARTIFACTS

pipeline { agent { node { label 'maven' } } stages { stage('Build') { steps { sh 'mvn clean compile test package' } } stage('Verify') { steps { sh 'mvn verify' } } } post { success { archiveArtifacts 'target/demoapp.jar' } }

6 . 19
slide-53
SLIDE 53

CI: EXERCISE - INTEGRATION TESTS REPORTS

We want the integration test reports to be published to Jenkins Better feedback loop If Integration Tests are failing, do NOT fail the build Make it UNSTABLE instead Clues: Maven flag -fn ("Fails Never") keyword junit (Pipeline keyword)

6 . 20
slide-54
SLIDE 54

CI: SOLUTION - INTEGRATION TESTS REPORTS

pipeline { agent { node { label 'maven' } } stages { stage('Build') { steps { sh 'mvn clean compile test package' } } stage('Verify') { steps { sh 'mvn verify -fn' junit '**/target/failsafe-reports/*.xml' } } } post { success { archiveArtifacts 'target/demoapp.jar' }

6 . 21
slide-55
SLIDE 55

CI: EXERCISE - ALL TESTS REPORTS

We now want all test reports published Problem: how to handle Unit test failure ? We also want to archive artifacts if build is unstable only due to the Verify stage Clues: post can be used per stage

6 . 22
slide-56
SLIDE 56

CI: SOLUTION - ALL TESTS REPORTS

pipeline { agent { node { label 'maven' } } stages { stage('Build') { steps { sh 'mvn clean compile test package' } post { always { junit '**/target/surefire-reports/*.xml' } } } stage('Verify') { steps { sh 'mvn verify -fn' junit '**/target/failsafe-reports/*.xml' } post {

6 . 23
slide-57
SLIDE 57

CI: FAILING TESTS

Validate your changes by making your tests fails. Edit each one and uncomment the failing block: Integration: src/master/src/test/java/hello/ApplicationIT.java Unit Tests: src/master/src/test/java/hello/ApplicationT est.java Browse the top-level items "Changes", "Tests" and "Artifacts" Do NOT forget to correct your tests at the end

6 . 24
slide-58
SLIDE 58

THAT’S ALL FOLKS !

6 . 25
slide-59
SLIDE 59

DOCKER

to the Rescue

7 . 1
slide-60
SLIDE 60

DOCKER: WHY ?

7 . 2
slide-61
SLIDE 61

DOCKER: WHAT ?

7 . 3
slide-62
SLIDE 62

DOCKER HOW ?

7 . 4
slide-63
SLIDE 63

DOCKER: DOCKERFILE

Dockerfile: recipe for building your immutable image

FROM debian:jessie LABEL Maintainer="Damien DUPORTAL" RUN apt-get update && apt-get install -y nginx VOLUME ["/tmp","/app"] EXPOSE 80 ENTRYPOINT ["/usr/sbin/nginx"] CMD ["-g","daemon off;"]

7 . 5
slide-64
SLIDE 64

DOCKER: BUILDING DOCKER IMAGE

Using the docker CLI:

docker build -t my_image:1.0.0 ./

7 . 6
slide-65
SLIDE 65

DOCKER: RUNNING A DOCKER

Using the docker CLI:

docker run -P -d my_image:1.0.0

7 . 7
slide-66
SLIDE 66

DOCKER: DEMO APPLICATION’S DOCKERFILE

Using GitServer, from the repository root Check the Dockerfile content

7 . 8
slide-67
SLIDE 67

DOCKER: BUILDING DEMO APPLICATION

Using Devbox, from the local repository root Checking images with docker images Build an image named demoapp:latest Check again images

7 . 9
slide-68
SLIDE 68

DOCKER: RUNNING DOCKER CONTAINER

Using Devbox, from the local repository root Check running containers with docker ps Run and test the container with this command: Stop it with docker stop <Container ID>

docker run -p 10081:8080 -d my_image:1.0.0 # Then open http://localhost:10081[]

7 . 10
slide-69
SLIDE 69

CONTINUOUS DELIVERY WITH JENKINS

aka "CD"

8 . 1
slide-70
SLIDE 70

CD: WHY ?

Reduce deployment risks Allow more frequent user feedback Make progress believable by everyone How long would it take to your organization to deploy a change that involves just one single line of code?

8 . 2
slide-71
SLIDE 71

CD: WHAT ?

Continuous Delivery is the next step after Continuous Integration: Every change to the system can be released for production Delivery can be done at any time, on any environment — Martin Fowler Your team prioritizes keeping the software deployable

  • ver working on new features
8 . 3
slide-72
SLIDE 72

CD IS NOT CONTINUOUS DEPLOYMENT

Both are always confused:

8 . 4
slide-73
SLIDE 73

CD: HOW ?

Having a collaborating working relationship with everyone involved Using Deployment Pipelines, which are automated implementations of your application’s build lifecycle process

8 . 5
slide-74
SLIDE 74

CD: DELIVERY TARGET

Production runs on Docker Your Ops team use a Docker Registry Expected Artifact: Not a jar file But a Docker image

8 . 6
slide-75
SLIDE 75

CD: EXERCISE - GENERATE DOCKER IMAGE

Goal: Add a stage named "Docker" for building the Docker image Before Integration Test This steps should use the name demoapp:latest Challenge: we need the jar file Clues: Keywords stash and unstash

8 . 7
slide-76
SLIDE 76

CD: SOLUTION - GENERATE DOCKER IMAGE

pipeline { agent { node { label 'maven' } } stages { stage('Build') { steps { sh 'mvn clean compile test package' stash(name: 'app', includes: 'target/demoapp.jar') } post { always { junit '**/target/surefire-reports/*.xml' } } } stage('Docker') { agent { label 'docker' } steps {

8 . 8
slide-77
SLIDE 77

CD: EXERCISE - DOCKER SMOKE TEST

Goal: Run a Docker Smoke Test before Integration Tests Use the command bats ./src/test/bats/docker.bats It takes care of building and naming the docker resources We do not need the archive the artifact unless Integration Test is unstable

8 . 9
slide-78
SLIDE 78

CD: SOLUTION - DOCKER SMOKE TEST

pipeline { agent { node { label 'maven' } } stages { stage('Build') { steps { sh 'mvn clean compile test package' stash(name: 'app', includes: 'target/demoapp.jar') } post { always { junit '**/target/surefire-reports/*.xml' } } } stage('Docker') { agent { label 'docker' } steps {

8 . 10
slide-79
SLIDE 79

CD: EXERCISE - APPROVAL AND DELIVERY

Goal: Manual Approval for Delivery Add a stage named Delivery that will: Ask for a manual validation, after Integration Tests And will push the Docker Image to the registry localhost:5000 Clues: Keyword input

8 . 11
slide-80
SLIDE 80

CD: SOLUTION - APPROVAL AND DELIVERY

pipeline { agent { node { label 'maven' } } stages { stage('Build') { steps { sh 'mvn clean compile test package' stash(name: 'app', includes: 'target/demoapp.jar') } post { always { junit '**/target/surefire-reports/*.xml' } } } stage('Docker') { agent { label 'docker' } steps {

8 . 12
slide-81
SLIDE 81

CD: EXERCISE - BUILDING WITH DOCKER

Goal: Use Docker to provide the build environment Use the agent allocation to build and run builds within a Docker container Use the Dockerfile.build from the repository Clues: Keyword agent any, agent { dockerfile }

8 . 13
slide-82
SLIDE 82

CD: SOLUTION - BUILDING WITH DOCKER

pipeline { agent any stages { stage('Build') { agent { dockerfile { filename 'Dockerfile.build' } } steps { sh 'mvn clean compile test package' stash(name: 'app', includes: 'target/demoapp.jar') } post { always { junit '**/target/surefire-reports/*.xml' } } } stage('Docker') { agent { label 'docker' }

8 . 14
slide-83
SLIDE 83

CD: EXERCISE - PARALLEL STAGES

Goal: Run Stages in parallels to gain time We can safely run Docker Smoke and Integration Tests in parallel To specify a specific agent, use Scripted Pipeline Block and the node allocation Clues: Keyword parallel, script, node

8 . 15
slide-84
SLIDE 84

CD: SOLUTION - PARALLEL STAGES

pipeline { agent any stages { stage('Build') { agent { dockerfile { filename 'Dockerfile.build' } } steps { sh 'mvn clean compile test package' stash(name: 'app', includes: 'target/demoapp.jar') } post { always { junit '**/target/surefire-reports/*.xml' } } } stage('T ests') { steps { parallel ( "Integration T ests": {

8 . 16
slide-85
SLIDE 85

CD: EXERCISE - SCALING PIPELINE

Goal: Share Pipeline across your teams We want to use There is one autoconfigured named deploy Use the annotation to load the Library, on master branch Check the library Shared Libraries here

8 . 17
slide-86
SLIDE 86

CD: SOLUTION - SCALING PIPELINE

@Library('deploy@master') _ pipeline { agent { label 'docker' } stages { stage('Build') { agent { dockerfile { filename 'Dockerfile.build' } } steps { sh 'mvn clean compile test package' stash(name: 'app', includes: 'target/demoapp.jar') } post { always { junit '**/target/surefire-reports/*.xml' } } }

8 . 18
slide-87
SLIDE 87

THAT’S ALL FOLKS !

8 . 19
slide-88
SLIDE 88

THANK YOU !

Mix-IT organization CloudBees and Jenkins Community YOU

9