SlideShare ist ein Scribd-Unternehmen logo
1 von 117
Downloaden Sie, um offline zu lesen
Jenkins Shared Libraries Deep Dive
Julien Pivotto (@roidelapluie)
Day of Jenkins Oslo & Gothenburg
June 2017
whoami
Julien "roidelapluie" Pivotto
@roidelapluie
Sysadmin at inuits
Automation, monitoring, HA
Jenkins user for 5+ years
inuits
Jenkins Pipeline
Were you there this morning? :-)
One of the best things that happened to
Jenkins in 5 years
Pipeline limits
What when we build 10 projects who look the
same?
How to keep Jenkinsfiles in sync?
Split deployment from application code
What if we want to interact with the heart of
Jenkins (advanced use cases)
Declarative Pipelines are limited by design
Shared Libraries ?
Why do we need that?
Why do we need that?
Put logic in Declarative Pipeline
DRY (e.g. microservices)
Scalability
Escape the Groovy Sandbox
What is a "Shared Library"?
What is a "Shared Library"?
SCM repository (git, ...)
Groovy code
Pipeline steps
Resources (plain scripts, flat files, etc)
Easily reusable in your Pipeline jobs
The 4 features
Resources
Steps
Untrusted library
Trusted library
Now let's get prepared!!
Interrupt me at any time if you
need help or have questions!!
We will move forward when most of the
people are at the same point as me
Our goals today
We will not build real things (to have low
requirements)
We will (maybe) not do the complete
slidedeck... let's see!
Requirements
Jenkins with the Git Plugin or Filesystem SCM
plugin
2 repos (gitlab, github, filesystem...) + git
client on your laptop (names: "trusted" and
"untrusted")
Python 2 ("python" command)
Open your Jenkins instance
Make sure you have SCM repos
your Jenkins has access to
You can use the Git plugin or Filesystem SCM
plugin
Install from:
https://roidelapluie.be/uploads/filesystem_scm-1.21.hpi
Login to Jenkins (as admin)
We login as admin because it is easier. The
workshop will assume that.
Install the Pipeline Plugin
Download in Progress
Done!
Check plugins installation
Raise your hand if you have
problems getting the plugins
installed
Create a folder
Save
Don't do anything with Shared Libraries at that
point, just save.
You should have the folder
Raise your hand if you don't
have the folder / have questions
Create a Pipeline Project in the
folder
Pipeline script
pipeline {
 agent any
 stages {
  stage('Clone') {
   steps {
       git url: 
       'https://github.com/voxpupuli/puppetboard'
   }
  }
  stage('Compile') {
   steps {
    sh """find . ­name '*.py' ­print0|
    xargs ­0 ­L 1 python2 ­m py_compile"""
   }
  }
 }
}
Run it!
It should run successfully
If not, raise your hand
Congratz!! We have a Python
project (vaguely) tested within
our Jenkins with a Declarative
Pipeline
Now let's see how resources
work in shared libraries
Clone your (empty) shared
library git repo on your laptop
$ git clone git@github.com:jenkinsws/untrusted01.git
$ cd untrusted01
If you use Filesystem SCM, just
create a empty directory
$ mkdir untrusted01
$ cd untrusted01
Create a directory "resources"
This must be the exact name
$ mkdir resources
Then subdirecties
$ mkdir ­p resources/eu/inuits
What did we do?
What did we do?
In the directories resources, we created a directory
for the "inuits.eu" namespace: "eu/inuits".
Namespace for "example.com" would be
"com/example".
You can nest that as you like:
"com/example/web/design".
That's kind of a Java thing.
Let's create a file in
 resources/eu/inuits called
 python.sh with the following content:
find . ­name '*.py' ­print0|
xargs ­0 ­L 1 python2 ­m py_compile
Let's commit and push the file
to the repo
$ git add resources/eu/inuits/python.sh
$ git commit ­m 'add shared script python'
$ git push
you should see
 * [new branch]      master ­> master
Raise your hand if you have problems
Wait, Shared Libraries need a
vars or src directory
I let you decide if it's a bug or a feature
Create an empty file  vars/noop.groovy 
$ mkdir vars
$ touch vars/noop.groovy
(git only)
$ git add vars/noop.groovy
$ git commit ­m 'add vars directory'
$ git push
What did we do?
What did we do?
We created our first shared pipeline!!!
Congratulations!!!!
Let's use it now
In the folder
(git)
(filesystem)
Open your Pipeline config
Import the library
At the beginning of the pipeline script
@Library('pythonhelpers') _
Replace
    sh """find . ­name '*.py' ­print0|
    xargs ­0 ­L 1 python2 ­m py_compile"""
with
    sh(libraryResource('eu/inuits/python.sh'))
Now, run the job
We should get the same result as before.
Job output
(filesystem SCM)
(git)
Raise your hand if you don't have that
We have used our first shared
resource!! Congratz!!
Let's update our library
Change  resources/eu/inuits/python.sh 
find . ­name '*.py' ­print0|
xargs ­0 ­L 1 python2 ­m py_compile
by
find . ­name '*.py' ­print0|
xargs ­0 ­t ­L 1 python2 ­m py_compile
(add -t in the second line)
Push that change
$ git add resources/eu/inuits/python.sh
$ git commit ­m 'make xargs more verbose'
$ git push
Run the script again
Before:
Now you should see
Change in our script has been integrated in the
build!! Imagine changing the script once applies to
all the pipelines!
Raise your hand if you
have problems
let's go for something more
powerful
In the shared library git repo, create a file
 vars/compilePython.groovy with
def call() {
    sh """find . ­name '*.py' ­print0|
    xargs ­0 ­t ­L 1 python2 ­m py_compile"""
}
Note: you could reuse the libraryResource here.
Push the file
$ git add vars/compilePython.groovy
$ git commit ­m 'add a compilePython step'
$ git push
In the Pipeline script
Replace
    sh(libraryResource('eu/inuits/python.sh'))
with
    compilePython()
Run, it should work!
Raise your hand if you need
help
Congratz!! Our first shared step!
Let's add LOGIC
In the shared library git repo, change
 vars/compilePython.groovy 
def call(){
 if (fileExists("requirements.txt")){
 sh "virtualenv venv"
 sh "venv/bin/pip install ­r requirements.txt"
 }
 sh """find . ­name '*.py' ­print0|
 xargs ­0 ­t ­L 1 python2 ­m py_compile"""
}
Push the file
$ git add vars/compilePython.groovy
$ git commit ­m 'add vitualenv support'
$ git push
Run the build ; should fail
Let's add a parameter
In the shared library git repo, change
 vars/compilePython.groovy 
def call(String directory = '.') {
 sh """find ${directory} ­name '*.py' ­print0|
 xargs ­0 ­t ­L 1 python2 ­m py_compile"""
}
Push the file
$ git add vars/compilePython.groovy
$ git commit ­m 'add compilePython parameter'
$ git push
Run the Pipeline again, it
should fail as before
In the Pipeline script
Replace
    compilePython()
with
    compilePython("puppetboard")
    compilePython("test")
Run, it should work!
See the two steps
Documentation
In the pipeline
In shared lib repo create
 vars/compilePython.txt 
This step compiles python files in the given
directory
Push the file
$ git add vars/compilePython.txt
$ git commit ­m 'add compilePython doc'
$ git push
Build once and check the doc
again
o/ Raise your hands if you have questions
Note
You can remove our noop.groovy in the shared
library
$ git rm vars/noop.groovy
$ git commit ­m 'remove noop.groovy'
$ git push
Let's do something awesome
now.
Remember that Declarative Pipeline?
We can do this as a "shared step".
Create  vars/pythonPipeline.groovy 
def call(String githubproject){
 pipeline {
  agent any
  stages {
   stage('Clone') {
    steps {
       git url: 
       "https://github.com/${githubproject}"
    }
   }
   stage('Compile') {
    steps{
     sh("ls")
    }
   }
  }
 }
}
Add, commit and push
$ git add vars/pythonPipeline.groovy
$ git commit ­m 'add a Python Pipeline step'
$ git push
Make the library import implicit
That way you do not need to import it in your
Pipeline script.
Change the Pipeline
pythonPipeline("voxpupuli/puppetboard")
Yes, that's all
Save & run
What happened?
We have put the COMPLETE declarative
pipeline in a shared lib
The jenkins file is really small
It is parametrizable
Change to the shared lib can change a lot of
pipelines!
Improvement: groovy closure  vars/pythonPipeline.groovy 
def call(body) {
 def config = [:]
 body.resolveStrategy = Closure.DELEGATE_FIRST
 body.delegate = config
 body()
 pipeline {
  agent any
  stages {
   stage('Clone') {
    steps {
      git url: 
        "https://github.com/${config.githubproject}"
    }
   }
   stage('Compile') {
    steps{
     sh("ls")
    }
   }
  }
 }
}
Change the Pipeline
pythonPipeline {
  githubproject = "voxpupuli/puppetboard"
}
Save & run
Let's get groovy
We will now recreate the same step but as "plain
groovy".
The real power will come later with "trusted"
library.
Reset the Pipeline script
Now we will edit the job's Pipeline and revert our
latest change. Here is the new script (next slide).
pipeline {
 agent any
 stages {
  stage('Clone') {
   steps {
    git url: 
     "https://github.com/voxpupuli/puppetboard"
   }
  }
  stage('Compile') {
   steps{
    compilePython("puppetboard")
    compilePython("test")
   }
  }
 }
}
Save and run
In Pipeline dir, create
 src/eu/inuits 
$ mkdir ­p src/eu/inuits
once again, "eu/inuits" means "inuits.eu"
Create
 src/eu/inuits/PythonCompiler.groovy 
package eu.inuits
class PythonCompiler {
 static def compileDirectory(script, directory) {
  script.sh """find ${directory} ­name '*.py' 
  ­print0|
 xargs ­0 ­t ­L 1 python2 ­m py_compile"""
 }
}
Change  vars/compilePython.groovy 
import static eu.inuits.PythonCompiler.*
def call(String directory = '.') {
    echo("Compiling ${directory}")
    compileDirectory(this, directory)
}
Push the files
$ git add src/eu/inuits/PythonCompiler.groovy
$ git add vars/compilePython.groovy
$ git commit ­m 'add PythonCompiler class'
$ git push
Run, it should work :-)
Raise your hand if it does not
What happened?
We created a plain groovy library and we called it
from within a (shared) step
If you do not use Declarative Pipeline you can do it
in your Jenkinsfile directly
Keeping State
Create a  vars/compileFile.groovy in your
shared lib.
import eu.inuits.FileCompiler
def call(String project) {
    fc = new FileCompiler(this, project)
    fc.analyze('requirements.txt')
    fc.analyze('setup.py')
}
Implement it!
 src/eu/inuits/FileCompiler.groovy 
package eu.inuits
class FileCompiler implements Serializable {
  def script
  def project
  FileCompiler(script, String project){
    this.script = script
    this.project = project
    this.script.echo("Compiling ${project}")
  }
  def analyze(String file) {
    this.script.echo("${project}/${file}")
    this.script.sh("cat ${file}")
  }
}
Add and push
(you know the drill)
$ git add src/eu/inuits/FileCompiler.groovy
$ git add vars/compileFile.groovy
$ git commit ­m "Add compileFile step"
$ git push
In the Pipeline script
Replace
    compilePython("puppetboard")
    compilePython("test")
with
    compileFile("puppetboard")
Run it
ooops
We hit the security sandbox
In the Pipeline script
& run again! Should work!
What happened? We have a "state" (variable
project). It can be changed on the fly in the class,
etc...
Are you still following?
Global Trusted Library
Now let's look into another kind of global library:
the Trusted Libraries.
Those libraries are defined in the global config,
and run unsandboxed.
Clone a new git repo for your
trusted library
$ git clone git@github.com:jenkinsws/trusted01.git
$ cd trusted01
Add the Library as a Global Shared
Library
Same as we did before but in the global config
Global Libraries
Used with caution: can do everything
Unsandboxed
Let's go!
create  src/eu/inuits/Admin.groovy 
package eu.inuits
import com.cloudbees.groovy.cps.NonCPS
class Admin implements Serializable {
 def seedFullName = "seed"
 def script
 
 Admin(script) {
  this.currentJobValidation(script)
  this.script = script
 }
 @NonCPS
 void currentJobValidation(script){
  def name = 
    script.currentBuild.rawBuild.project.fullName
  assert name == this.seedFullName : "DENIED"
 }
}
Add and commit file
$ git add src/eu/inuits/Admin.groovy
$ git commit ­m 'add admin lib'
$ git push
Raise your hand if you need help!
Create a new job in the top
Set the following Pipeline Script
@Library('globalhelp') _
import eu.inuits.Admin
node {
    adm = new Admin(this)
}
And save.
Run the Pipeline
Rename the job
Run the renamed job
Our class can only be called from within a job
named seed.
Rename the job back
Who needs help at this point?
Add a function to the trusted lib
 src/eu/inuits/Admin.groovy 
after Package, before Class
import jenkins.model.Jenkins
then, in body
/**
  * Set the description of a folder
  *
  * @param folder A jenkins project name
  * @param description New description
  */
@NonCPS
void setFolderDescription(folder, description) {
    def f = Jenkins.instance.getItemByFullName(folder)
    f.setDescription(description)
}
Add, Commit and Push
$ git add src/eu/inuits/Admin.groovy
$ git commit ­m 'add setFolderDescription'
$ git push
Change seed job Pipeline Script
@Library('globalhelp') _
import eu.inuits.Admin
node {
  adm = new Admin(this)
  adm.setFolderDescription("python­projects",
  "Description set withing Global Pipeline")
}
Save and Run
Check the result
Raise your hand if you have a different result
@Grab
Just an example from
https://jenkins.io/doc/book/pipeline/shared-libraries/
@Grab('org.apache.commons:commons­math3:3.4.1')
import org.apache.commons.math3.primes.Primes
void parallelize(int count) {
  if (!Primes.isPrime(count)) {
    error "${count} was not prime"
  }
  // Ã¢â‚¬Â¦
}
Global Libs
Do not require sandbox escape at the job level
No sandbox exceptions needed
@Grab
Freedom!
Advice for safe global lib
Check what you return: void, string.. do not
return objects like Jenkins Job
Check the name of the job
No "implicit loading"
No "version overwrite"
Conclusions
Shared Libraries keep your Jenkinsfiles small
They allow you to scale your Pipelines
Change the build process without comitting to
all the repos
No need for tools like modulesync etc...
For this talk, thanks Jenkins, Praqma, Inuits.
Used for this talk: DigitalOcean, github, packer,
consul, terraform, traefik, let's encrypt,
gibby/letsencrypt-dns-digitalocean.
Julien Pivotto
roidelapluie
roidelapluie@inuits.eu
Inuits
https://inuits.eu
info@inuits.eu
Contact

Weitere ähnliche Inhalte

Was ist angesagt?

Introduction of cloud native CI/CD on kubernetes
Introduction of cloud native CI/CD on kubernetesIntroduction of cloud native CI/CD on kubernetes
Introduction of cloud native CI/CD on kubernetesKyohei Mizumoto
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門Kohei Tokunaga
 
[Cloud OnAir] Apigee でかんたん API 管理 2019年12月12日 放送
[Cloud OnAir] Apigee でかんたん API 管理 2019年12月12日 放送[Cloud OnAir] Apigee でかんたん API 管理 2019年12月12日 放送
[Cloud OnAir] Apigee でかんたん API 管理 2019年12月12日 放送Google Cloud Platform - Japan
 
忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春VerMasahito Zembutsu
 
Kubernetes Summit 2021: Multi-Cluster - The Good, the Bad and the Ugly
Kubernetes Summit 2021: Multi-Cluster - The Good, the Bad and the UglyKubernetes Summit 2021: Multi-Cluster - The Good, the Bad and the Ugly
Kubernetes Summit 2021: Multi-Cluster - The Good, the Bad and the Uglysmalltown
 
Getting started with Ansible
Getting started with AnsibleGetting started with Ansible
Getting started with AnsibleIvan Serdyuk
 
Harbor RegistryのReplication機能
Harbor RegistryのReplication機能Harbor RegistryのReplication機能
Harbor RegistryのReplication機能Masanori Nara
 
Ansible presentation
Ansible presentationAnsible presentation
Ansible presentationSuresh Kumar
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
Formation autour de git et git lab
Formation autour de git et git labFormation autour de git et git lab
Formation autour de git et git labAbdelghani Azri
 
gRPC と nginx による HTTP/2 サービスメッシュ構築
gRPC と nginx による HTTP/2 サービスメッシュ構築gRPC と nginx による HTTP/2 サービスメッシュ構築
gRPC と nginx による HTTP/2 サービスメッシュ構築Kazuki Ogiwara
 
CI:CD in Lightspeed with kubernetes and argo cd
CI:CD in Lightspeed with kubernetes and argo cdCI:CD in Lightspeed with kubernetes and argo cd
CI:CD in Lightspeed with kubernetes and argo cdBilly Yuen
 
Best Practices for Middleware and Integration Architecture Modernization with...
Best Practices for Middleware and Integration Architecture Modernization with...Best Practices for Middleware and Integration Architecture Modernization with...
Best Practices for Middleware and Integration Architecture Modernization with...Claus Ibsen
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティスAmazon Web Services Japan
 
Build CICD Pipeline for Container Presentation Slides
Build CICD Pipeline for Container Presentation SlidesBuild CICD Pipeline for Container Presentation Slides
Build CICD Pipeline for Container Presentation SlidesAmazon Web Services
 
MicroServices at Netflix - challenges of scale
MicroServices at Netflix - challenges of scaleMicroServices at Netflix - challenges of scale
MicroServices at Netflix - challenges of scaleSudhir Tonse
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 

Was ist angesagt? (20)

Introduction of cloud native CI/CD on kubernetes
Introduction of cloud native CI/CD on kubernetesIntroduction of cloud native CI/CD on kubernetes
Introduction of cloud native CI/CD on kubernetes
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
[Cloud OnAir] Apigee でかんたん API 管理 2019年12月12日 放送
[Cloud OnAir] Apigee でかんたん API 管理 2019年12月12日 放送[Cloud OnAir] Apigee でかんたん API 管理 2019年12月12日 放送
[Cloud OnAir] Apigee でかんたん API 管理 2019年12月12日 放送
 
忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver
 
Kubernetes Summit 2021: Multi-Cluster - The Good, the Bad and the Ugly
Kubernetes Summit 2021: Multi-Cluster - The Good, the Bad and the UglyKubernetes Summit 2021: Multi-Cluster - The Good, the Bad and the Ugly
Kubernetes Summit 2021: Multi-Cluster - The Good, the Bad and the Ugly
 
Getting started with Ansible
Getting started with AnsibleGetting started with Ansible
Getting started with Ansible
 
Meetup 23 - 03 - Application Delivery on K8S with GitOps
Meetup 23 - 03 - Application Delivery on K8S with GitOpsMeetup 23 - 03 - Application Delivery on K8S with GitOps
Meetup 23 - 03 - Application Delivery on K8S with GitOps
 
Harbor RegistryのReplication機能
Harbor RegistryのReplication機能Harbor RegistryのReplication機能
Harbor RegistryのReplication機能
 
Ansible presentation
Ansible presentationAnsible presentation
Ansible presentation
 
Nginx lua
Nginx luaNginx lua
Nginx lua
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Formation autour de git et git lab
Formation autour de git et git labFormation autour de git et git lab
Formation autour de git et git lab
 
Railsで作るBFFの功罪
Railsで作るBFFの功罪Railsで作るBFFの功罪
Railsで作るBFFの功罪
 
gRPC と nginx による HTTP/2 サービスメッシュ構築
gRPC と nginx による HTTP/2 サービスメッシュ構築gRPC と nginx による HTTP/2 サービスメッシュ構築
gRPC と nginx による HTTP/2 サービスメッシュ構築
 
CI:CD in Lightspeed with kubernetes and argo cd
CI:CD in Lightspeed with kubernetes and argo cdCI:CD in Lightspeed with kubernetes and argo cd
CI:CD in Lightspeed with kubernetes and argo cd
 
Best Practices for Middleware and Integration Architecture Modernization with...
Best Practices for Middleware and Integration Architecture Modernization with...Best Practices for Middleware and Integration Architecture Modernization with...
Best Practices for Middleware and Integration Architecture Modernization with...
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 
Build CICD Pipeline for Container Presentation Slides
Build CICD Pipeline for Container Presentation SlidesBuild CICD Pipeline for Container Presentation Slides
Build CICD Pipeline for Container Presentation Slides
 
MicroServices at Netflix - challenges of scale
MicroServices at Netflix - challenges of scaleMicroServices at Netflix - challenges of scale
MicroServices at Netflix - challenges of scale
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 

Ähnlich wie Jenkins Shared Libraries Workshop

Make an Instant Website with Webhooks
Make an Instant Website with WebhooksMake an Instant Website with Webhooks
Make an Instant Website with WebhooksAnne Gentle
 
The Scientific Filesystem
The Scientific FilesystemThe Scientific Filesystem
The Scientific FilesystemVanessa S
 
Hacktoberfest 2020 - Open source for beginners
Hacktoberfest 2020 - Open source for beginnersHacktoberfest 2020 - Open source for beginners
Hacktoberfest 2020 - Open source for beginnersDeepikaRana30
 
Deploying to DigitalOcean With GitHub Actions
Deploying to DigitalOcean With GitHub ActionsDeploying to DigitalOcean With GitHub Actions
Deploying to DigitalOcean With GitHub ActionsDigitalOcean
 
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016Easy contributable internationalization process with Sphinx @ PyCon APAC 2016
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016Takayuki Shimizukawa
 
MobileConf 2021 Slides: Let's build macOS CLI Utilities using Swift
MobileConf 2021 Slides:  Let's build macOS CLI Utilities using SwiftMobileConf 2021 Slides:  Let's build macOS CLI Utilities using Swift
MobileConf 2021 Slides: Let's build macOS CLI Utilities using SwiftDiego Freniche Brito
 
Github 101 An Adventurer's Guide To Open Source
Github 101   An Adventurer's Guide To Open SourceGithub 101   An Adventurer's Guide To Open Source
Github 101 An Adventurer's Guide To Open SourcePrachitibhukan
 
Software Quality Assurance Tooling - Wintersession 2024
Software Quality Assurance Tooling - Wintersession 2024Software Quality Assurance Tooling - Wintersession 2024
Software Quality Assurance Tooling - Wintersession 2024Henry Schreiner
 
Bang a Gong, GIT It On, or Running Drupal With a GIT Repository (11/04/20 - B...
Bang a Gong, GIT It On, or Running Drupal With a GIT Repository (11/04/20 - B...Bang a Gong, GIT It On, or Running Drupal With a GIT Repository (11/04/20 - B...
Bang a Gong, GIT It On, or Running Drupal With a GIT Repository (11/04/20 - B...DrupalCape
 
Scientist meets web dev: how Python became the language of data
Scientist meets web dev: how Python became the language of dataScientist meets web dev: how Python became the language of data
Scientist meets web dev: how Python became the language of dataGael Varoquaux
 
Singularity Registry HPC
Singularity Registry HPCSingularity Registry HPC
Singularity Registry HPCVanessa S
 
Introduction to Git for Non-Developers
Introduction to Git for Non-DevelopersIntroduction to Git for Non-Developers
Introduction to Git for Non-DevelopersAll Things Open
 
Introduction to Git for Non-Developers
Introduction to Git for Non-DevelopersIntroduction to Git for Non-Developers
Introduction to Git for Non-DevelopersJohn Anderson
 
August OpenNTF Webinar - Git and GitHub Explained
August OpenNTF Webinar - Git and GitHub ExplainedAugust OpenNTF Webinar - Git and GitHub Explained
August OpenNTF Webinar - Git and GitHub ExplainedHoward Greenberg
 
Digital RSE: automated code quality checks - RSE group meeting
Digital RSE: automated code quality checks - RSE group meetingDigital RSE: automated code quality checks - RSE group meeting
Digital RSE: automated code quality checks - RSE group meetingHenry Schreiner
 
Leiningen2 - humane build management for clojure
Leiningen2 - humane build management for clojureLeiningen2 - humane build management for clojure
Leiningen2 - humane build management for clojureJohn Stevenson
 
Introduction to GitHub, Open Source and Tech Article
Introduction to GitHub, Open Source and Tech ArticleIntroduction to GitHub, Open Source and Tech Article
Introduction to GitHub, Open Source and Tech ArticlePRIYATHAMDARISI
 

Ähnlich wie Jenkins Shared Libraries Workshop (20)

Take a Stroll in the Bazaar
Take a Stroll in the BazaarTake a Stroll in the Bazaar
Take a Stroll in the Bazaar
 
Make an Instant Website with Webhooks
Make an Instant Website with WebhooksMake an Instant Website with Webhooks
Make an Instant Website with Webhooks
 
The Scientific Filesystem
The Scientific FilesystemThe Scientific Filesystem
The Scientific Filesystem
 
Hacktoberfest 2020 - Open source for beginners
Hacktoberfest 2020 - Open source for beginnersHacktoberfest 2020 - Open source for beginners
Hacktoberfest 2020 - Open source for beginners
 
Deploying to DigitalOcean With GitHub Actions
Deploying to DigitalOcean With GitHub ActionsDeploying to DigitalOcean With GitHub Actions
Deploying to DigitalOcean With GitHub Actions
 
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016Easy contributable internationalization process with Sphinx @ PyCon APAC 2016
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016
 
MobileConf 2021 Slides: Let's build macOS CLI Utilities using Swift
MobileConf 2021 Slides:  Let's build macOS CLI Utilities using SwiftMobileConf 2021 Slides:  Let's build macOS CLI Utilities using Swift
MobileConf 2021 Slides: Let's build macOS CLI Utilities using Swift
 
Github 101 An Adventurer's Guide To Open Source
Github 101   An Adventurer's Guide To Open SourceGithub 101   An Adventurer's Guide To Open Source
Github 101 An Adventurer's Guide To Open Source
 
Software Quality Assurance Tooling - Wintersession 2024
Software Quality Assurance Tooling - Wintersession 2024Software Quality Assurance Tooling - Wintersession 2024
Software Quality Assurance Tooling - Wintersession 2024
 
Bang a Gong, GIT It On, or Running Drupal With a GIT Repository (11/04/20 - B...
Bang a Gong, GIT It On, or Running Drupal With a GIT Repository (11/04/20 - B...Bang a Gong, GIT It On, or Running Drupal With a GIT Repository (11/04/20 - B...
Bang a Gong, GIT It On, or Running Drupal With a GIT Repository (11/04/20 - B...
 
Scientist meets web dev: how Python became the language of data
Scientist meets web dev: how Python became the language of dataScientist meets web dev: how Python became the language of data
Scientist meets web dev: how Python became the language of data
 
Singularity Registry HPC
Singularity Registry HPCSingularity Registry HPC
Singularity Registry HPC
 
Jenkins Pipelines
Jenkins PipelinesJenkins Pipelines
Jenkins Pipelines
 
Untangling4
Untangling4Untangling4
Untangling4
 
Introduction to Git for Non-Developers
Introduction to Git for Non-DevelopersIntroduction to Git for Non-Developers
Introduction to Git for Non-Developers
 
Introduction to Git for Non-Developers
Introduction to Git for Non-DevelopersIntroduction to Git for Non-Developers
Introduction to Git for Non-Developers
 
August OpenNTF Webinar - Git and GitHub Explained
August OpenNTF Webinar - Git and GitHub ExplainedAugust OpenNTF Webinar - Git and GitHub Explained
August OpenNTF Webinar - Git and GitHub Explained
 
Digital RSE: automated code quality checks - RSE group meeting
Digital RSE: automated code quality checks - RSE group meetingDigital RSE: automated code quality checks - RSE group meeting
Digital RSE: automated code quality checks - RSE group meeting
 
Leiningen2 - humane build management for clojure
Leiningen2 - humane build management for clojureLeiningen2 - humane build management for clojure
Leiningen2 - humane build management for clojure
 
Introduction to GitHub, Open Source and Tech Article
Introduction to GitHub, Open Source and Tech ArticleIntroduction to GitHub, Open Source and Tech Article
Introduction to GitHub, Open Source and Tech Article
 

Mehr von Julien Pivotto

What's New in Prometheus and Its Ecosystem
What's New in Prometheus and Its EcosystemWhat's New in Prometheus and Its Ecosystem
What's New in Prometheus and Its EcosystemJulien Pivotto
 
Prometheus: What is is, what is new, what is coming
Prometheus: What is is, what is new, what is comingPrometheus: What is is, what is new, what is coming
Prometheus: What is is, what is new, what is comingJulien Pivotto
 
What's new in Prometheus?
What's new in Prometheus?What's new in Prometheus?
What's new in Prometheus?Julien Pivotto
 
Introduction to Grafana Loki
Introduction to Grafana LokiIntroduction to Grafana Loki
Introduction to Grafana LokiJulien Pivotto
 
Why you should revisit mgmt
Why you should revisit mgmtWhy you should revisit mgmt
Why you should revisit mgmtJulien Pivotto
 
Observing the HashiCorp Ecosystem From Prometheus
Observing the HashiCorp Ecosystem From PrometheusObserving the HashiCorp Ecosystem From Prometheus
Observing the HashiCorp Ecosystem From PrometheusJulien Pivotto
 
Monitoring in a fast-changing world with Prometheus
Monitoring in a fast-changing world with PrometheusMonitoring in a fast-changing world with Prometheus
Monitoring in a fast-changing world with PrometheusJulien Pivotto
 
5 tips for Prometheus Service Discovery
5 tips for Prometheus Service Discovery5 tips for Prometheus Service Discovery
5 tips for Prometheus Service DiscoveryJulien Pivotto
 
Prometheus and TLS - an Introduction
Prometheus and TLS - an IntroductionPrometheus and TLS - an Introduction
Prometheus and TLS - an IntroductionJulien Pivotto
 
Powerful graphs in Grafana
Powerful graphs in GrafanaPowerful graphs in Grafana
Powerful graphs in GrafanaJulien Pivotto
 
HAProxy as Egress Controller
HAProxy as Egress ControllerHAProxy as Egress Controller
HAProxy as Egress ControllerJulien Pivotto
 
Improved alerting with Prometheus and Alertmanager
Improved alerting with Prometheus and AlertmanagerImproved alerting with Prometheus and Alertmanager
Improved alerting with Prometheus and AlertmanagerJulien Pivotto
 
SIngle Sign On with Keycloak
SIngle Sign On with KeycloakSIngle Sign On with Keycloak
SIngle Sign On with KeycloakJulien Pivotto
 
Monitoring as an entry point for collaboration
Monitoring as an entry point for collaborationMonitoring as an entry point for collaboration
Monitoring as an entry point for collaborationJulien Pivotto
 
Incident Resolution as Code
Incident Resolution as CodeIncident Resolution as Code
Incident Resolution as CodeJulien Pivotto
 
Monitor your CentOS stack with Prometheus
Monitor your CentOS stack with PrometheusMonitor your CentOS stack with Prometheus
Monitor your CentOS stack with PrometheusJulien Pivotto
 
Monitor your CentOS stack with Prometheus
Monitor your CentOS stack with PrometheusMonitor your CentOS stack with Prometheus
Monitor your CentOS stack with PrometheusJulien Pivotto
 
An introduction to Ansible
An introduction to AnsibleAn introduction to Ansible
An introduction to AnsibleJulien Pivotto
 

Mehr von Julien Pivotto (20)

The O11y Toolkit
The O11y ToolkitThe O11y Toolkit
The O11y Toolkit
 
What's New in Prometheus and Its Ecosystem
What's New in Prometheus and Its EcosystemWhat's New in Prometheus and Its Ecosystem
What's New in Prometheus and Its Ecosystem
 
Prometheus: What is is, what is new, what is coming
Prometheus: What is is, what is new, what is comingPrometheus: What is is, what is new, what is coming
Prometheus: What is is, what is new, what is coming
 
What's new in Prometheus?
What's new in Prometheus?What's new in Prometheus?
What's new in Prometheus?
 
Introduction to Grafana Loki
Introduction to Grafana LokiIntroduction to Grafana Loki
Introduction to Grafana Loki
 
Why you should revisit mgmt
Why you should revisit mgmtWhy you should revisit mgmt
Why you should revisit mgmt
 
Observing the HashiCorp Ecosystem From Prometheus
Observing the HashiCorp Ecosystem From PrometheusObserving the HashiCorp Ecosystem From Prometheus
Observing the HashiCorp Ecosystem From Prometheus
 
Monitoring in a fast-changing world with Prometheus
Monitoring in a fast-changing world with PrometheusMonitoring in a fast-changing world with Prometheus
Monitoring in a fast-changing world with Prometheus
 
5 tips for Prometheus Service Discovery
5 tips for Prometheus Service Discovery5 tips for Prometheus Service Discovery
5 tips for Prometheus Service Discovery
 
Prometheus and TLS - an Introduction
Prometheus and TLS - an IntroductionPrometheus and TLS - an Introduction
Prometheus and TLS - an Introduction
 
Powerful graphs in Grafana
Powerful graphs in GrafanaPowerful graphs in Grafana
Powerful graphs in Grafana
 
YAML Magic
YAML MagicYAML Magic
YAML Magic
 
HAProxy as Egress Controller
HAProxy as Egress ControllerHAProxy as Egress Controller
HAProxy as Egress Controller
 
Improved alerting with Prometheus and Alertmanager
Improved alerting with Prometheus and AlertmanagerImproved alerting with Prometheus and Alertmanager
Improved alerting with Prometheus and Alertmanager
 
SIngle Sign On with Keycloak
SIngle Sign On with KeycloakSIngle Sign On with Keycloak
SIngle Sign On with Keycloak
 
Monitoring as an entry point for collaboration
Monitoring as an entry point for collaborationMonitoring as an entry point for collaboration
Monitoring as an entry point for collaboration
 
Incident Resolution as Code
Incident Resolution as CodeIncident Resolution as Code
Incident Resolution as Code
 
Monitor your CentOS stack with Prometheus
Monitor your CentOS stack with PrometheusMonitor your CentOS stack with Prometheus
Monitor your CentOS stack with Prometheus
 
Monitor your CentOS stack with Prometheus
Monitor your CentOS stack with PrometheusMonitor your CentOS stack with Prometheus
Monitor your CentOS stack with Prometheus
 
An introduction to Ansible
An introduction to AnsibleAn introduction to Ansible
An introduction to Ansible
 

Kürzlich hochgeladen

How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 

Kürzlich hochgeladen (20)

How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 

Jenkins Shared Libraries Workshop