SlideShare una empresa de Scribd logo
1 de 63
Descargar para leer sin conexión
De lo sencillo a lo más molón
Jenkins
Pipeline
Patxi Gortázar
francisco.gortazar@urjc.es
@fgortazar
2
Who?
ElasTest H2020 Project Coordinator
Devops @ Kurento
Teaching distributed systems @etsii_urjc
Haskeller aficionado
@fgortazar
https://es.linkedin.com/in/franciscogortazar
3
Jenkins
•Jenkins es el servidor de CI más popular
•Es utilizado para construir, para ejecutar tests y
para desplegar cualquier proyecto software
4
Jenkins
https://zeroturnaround.com/rebellabs/java-tools-and-technologies-landscape-2016/
Encuesta sobre el uso de servidor CI 2016
5
Jenkins
•Instalación rápida
– Necesitamos Java 8 o superior
– Vamos a https://jenkins.io/
– Seleccionamos download
– Descargamos la LTS Release (Generic Java
package)
6
Jenkins
•Instalación rápida
– Ejecutamos
$ java -jar jenkins.war --httpPort=8081
– La password de admin aparece en el log o en el fichero
~/.jenkins/secrets/initialAdminPassword
– Nota: Borrar la carpeta ~/.jenkins si ya teníamos
instalado Jenkins de antes y queremos empezar de cero
7
Jenkins
•Instalación rápida
– Accedemos a http://localhost:8081/
8
Jenkins
9
Jenkins
10
Jenkins
Configuramos la
cuenta de
administrador
11
Jenkins
12
Jenkins
Configuramos
la Jenkins
13
Jenkins
14
Jenkins
Especificamos
la ruta al JDK
que tengamos
instalado
15
Jenkins
Añadimos
Maven para
que se pueda
usar en las
tareas (jobs)
16
Jenkins
Ponemos
como nombre
“M3”
17
Jenkins
●
Creación de tareas (jobs)
– El objetivo de jenkins es ejecutar tareas
– Una tarea es la ejecución de un comando
– Esos comandos pueden terminar correctamente o con error
– La salida del comando se puede consultar mientras se
ejecuta y se guarda para una consulta posterior
– Los comandos pueden generar ficheros que también se
guardan
18
Jenkins
●
Creación de tareas (jobs)
– Las tareas se pueden ejecutar:
●
Iniciadas por el desarrollador (manualmente)
●
Cada cierto tiempo (periódicamente)
●
Motivadas por un evento externo (nuevo
commit en un repositorio)
19
Jenkins
●
Creación de tareas (jobs)
– Una tarea típica en Jenkins consiste en:
●
1) Descargar un proyecto software de un repositorio
git
●
2) Compilar el proyecto
●
3) Ejecutar los tests sobre el proyecto
●
4) Opcionalmente generar un binario/paquete y
publicarlo en algún repositorio de binarios
20
Jenkins
Creamos una nueva
tarea para descargar
el proyecto y ejecutar
los tests
21
Jenkins
22
Jenkins
Seleccionamos
Github+Maven como
pantilla para el script de
pipeline
23
Jenkins
Ejecutamos
la nueva
tarea
24
Jenkins
Tarea finalizada
correctamente (los
tests han pasado)
La tarea
ejecuta
varias etapas
25
Jenkins
Podemos ver los logs
de cada etapa
26
Jenkins
27
Jenkins
Pinchamos en el
número de ejecución
para ver más detalles
28
Jenkins
El jar se ha
guardado
Podemos ver los
resultados de los
tests
29
Jenkins
Podemos ver toda
la salida por
consola
30
Jenkins
Las instrucciones
de pipeline salen
en gris claro
Las salidas de los
comandos en
negro
31
Pipeline
● Jenkins soporta dos sintaxis de pipelines
– Sintaxis declarativa
● DSL para definir pipelines
● Sencillo de utilizar
● Útil si tu pipeline es sencillo
● Se puede incluir código groovy para cosas más complejas en seccion
– Script (Groovy)
● Se puede utilizar directamente el lenguaje groovy
● Se dispone de librerías específicas para poder utilizar una notación similar a pipelines
declarativos
● Más flexible y potente
32
Pipeline
node {
def mvnHome
stage('Preparation') {
git 'https://github.com/jglick/...'
mvnHome = tool 'M3'
}
stage('Build') {
if (isUnix()) {
sh "'${mvnHome}/bin/mvn' ..."
} else {
bat(/"${mvnHome}binmvn" ...)
}
}
stage('Results') {
junit '**/target/surefire-reports/...'
archive 'target/*.jar'
}
}
pipeline {
tools {
maven "M3"
}
agent any
stages {
stage("Preparation") {
steps {
git 'https://github.com/jglick/...'
}
}
stage("Build") {
steps {
sh "mvn -Dmaven.test.failure.ignore ..."
}
}
}
post {
always {
junit "**/target/surefire-reports/..."
}
success {
archive "target/*.jar"
}
}
}
Declarativa ScriptDeclarativa Script
33
Pipeline
node {
def mvnHome
stage('Preparation') {
git 'https://github.com/jglick/...'
mvnHome = tool 'M3'
}
stage('Build') {
if (isUnix()) {
sh "'${mvnHome}/bin/mvn' ..."
} else {
bat(/"${mvnHome}binmvn" ...)
}
}
stage('Results') {
junit '**/target/surefire-reports/...'
archive 'target/*.jar'
}
}
pipeline {
tools {
maven "M3"
}
agent any
stages {
stage("Preparation") {
steps {
git 'https://github.com/jglick/...'
}
}
stage("Build") {
steps {
sh "mvn -Dmaven.test.failure.ignore ..."
}
}
}
post {
always {
junit "**/target/surefire-reports/..."
}
success {
archive "target/*.jar"
}
}
}
Declarativa ScriptDeclarativa Script
Indicamos dónde se
debe ejecutar.
Si no indicamos
nada (o any en
declarativa) se
escogerá uno
cualquiera
34
Pipeline
node {
def mvnHome
stage('Preparation') {
git 'https://github.com/jglick/...'
mvnHome = tool 'M3'
}
stage('Build') {
if (isUnix()) {
sh "'${mvnHome}/bin/mvn' ..."
} else {
bat(/"${mvnHome}binmvn" ...)
}
}
stage('Results') {
junit '**/target/surefire-reports/...'
archive 'target/*.jar'
}
}
pipeline {
tools {
maven "M3"
}
agent any
stages {
stage("Preparation") {
steps {
git 'https://github.com/jglick/...'
}
}
stage("Build") {
steps {
sh "mvn -Dmaven.test.failure.ignore ..."
}
}
}
post {
always {
junit "**/target/surefire-reports/..."
}
success {
archive "target/*.jar"
}
}
}
Declarativa ScriptDeclarativa Script
En los scripts puedo
declarar variables
globales que podré
usar en las
diferentes etapas
35
Pipeline
node {
def mvnHome
stage('Preparation') {
git 'https://github.com/jglick/...'
mvnHome = tool 'M3'
}
stage('Build') {
if (isUnix()) {
sh "'${mvnHome}/bin/mvn' ..."
} else {
bat(/"${mvnHome}binmvn" ...)
}
}
stage('Results') {
junit '**/target/surefire-reports/...'
archive 'target/*.jar'
}
}
pipeline {
tools {
maven "M3"
}
agent any
stages {
stage("Preparation") {
steps {
git 'https://github.com/jglick/...'
}
}
stage("Build") {
steps {
sh "mvn -Dmaven.test.failure.ignore ..."
}
}
}
post {
always {
junit "**/target/surefire-reports/..."
}
success {
archive "target/*.jar"
}
}
}
Declarativa ScriptDeclarativa Script
Un pipeline está
compuesto de una o
más etapas
(stages)
36
Pipeline
node {
def mvnHome
stage('Preparation') {
git 'https://github.com/jglick/...'
mvnHome = tool 'M3'
}
stage('Build') {
if (isUnix()) {
sh "'${mvnHome}/bin/mvn' ..."
} else {
bat(/"${mvnHome}binmvn" ...)
}
}
stage('Results') {
junit '**/target/surefire-reports/...'
archive 'target/*.jar'
}
}
pipeline {
tools {
maven "M3"
}
agent any
stages {
stage("Preparation") {
steps {
git 'https://github.com/jglick/...'
}
}
stage("Build") {
steps {
sh "mvn -Dmaven.test.failure.ignore ..."
}
}
}
post {
always {
junit "**/target/surefire-reports/..."
}
success {
archive "target/*.jar"
}
}
}
Declarativa ScriptDeclarativa Script
Dentro de cada
etapa puede haber
uno o más pasos
(steps)
37
Pipeline
node {
def mvnHome
stage('Preparation') {
git 'https://github.com/jglick/...'
mvnHome = tool 'M3'
}
stage('Build') {
if (isUnix()) {
sh "'${mvnHome}/bin/mvn' ..."
} else {
bat(/"${mvnHome}binmvn" ...)
}
}
stage('Results') {
junit '**/target/surefire-reports/...'
archive 'target/*.jar'
}
}
pipeline {
tools {
maven "M3"
}
agent any
stages {
stage("Preparation") {
steps {
git 'https://github.com/jglick/...'
}
}
stage("Build") {
steps {
sh "mvn -Dmaven.test.failure.ignore ..."
}
}
}
post {
always {
junit "**/target/surefire-reports/..."
}
success {
archive "target/*.jar"
}
}
}
Declarativa ScriptDeclarativa Script
Existen diferentes
tipos de steps
38
Pipeline
node {
def mvnHome
stage('Preparation') {
git 'https://github.com/jglick/...'
mvnHome = tool 'M3'
}
stage('Build') {
if (isUnix()) {
sh "'${mvnHome}/bin/mvn' ..."
} else {
bat(/"${mvnHome}binmvn" ...)
}
}
stage('Results') {
junit '**/target/surefire-reports/...'
archive 'target/*.jar'
}
}
pipeline {
tools {
maven "M3"
}
agent any
stages {
stage("Preparation") {
steps {
git 'https://github.com/jglick/...'
}
}
stage("Build") {
steps {
sh "mvn -Dmaven.test.failure.ignore ..."
}
}
}
post {
always {
junit "**/target/surefire-reports/..."
}
success {
archive "target/*.jar"
}
}
}
Declarativa ScriptDeclarativa Script
La forma de utilizar
las herramientas
configuradas es
diferente
39
Pipeline
● Build steps...
– Son funciones disponibles dentro del pipeline
– Los plugins pueden contribuir nuevos steps
– Se pueden utilizar en ambos tipos de sintaxis
– En la mayoría de los casos requieren parámetros
● Los parámetros son pares clave-valor (parámetros nombrados)
● Si sólo hay uno, se puede obviar el nombre
readFile ‘build.properties’
● O no:
readFile file: ‘build.properties’
● Pero si hay varios hay que ponerlos (nótese la coma):
readFile file: ‘build.properties’, encoding: ‘UTF-8’
40
Pipeline
● Build steps...
– Hay tres sintaxis diferentes para invocar steps
● Cuando no hay colisión de nombres, y existe un alias para el step:
archiveArtifacts ‘**.jar’
● Cuando hay colisión de nombres o no hay alias para el step:
step([$class: ‘ArtifactsArchiver’, artifacts: ‘**.jar’])
● Siempre podemos utilizar Groovy plano:
step(new ArtifactArchiver(‘**.jar’))
41
Pipeline
Hay que desmarcar
el sanbox
(no se permite
código)
42
Pipeline
Los tres ficheros se
archivan
43
Pipeline
Tenemos a nuestra
disposición un
generador de
steps
44
Pipeline
Seleccionamos el
step que queremos
Especificamos los
parámetros
Obtenemos el texto
que hay que copiar
en el pipeline
45
Tenemos también
disponibles
variables globales
46
Notificaciones
● Podemos añadir acciones al final del job
– Se ejecutarán al finalizar dependiendo del estado
– Interesante para mandar correos o archivar artefactos
– Podemos ejecutar unas acciones u otras en función del estado del job:
● Always: acciones que se ejecutarán siempre
● Success: acciones para ser ejecutadas si el job tiene éxito
● Failure: acciones para ser ejecutadas si el job falla
● Unstable: acciones que se ejecutarán si el job tiene test fallidos
● Changed: acciones que se ejecutarán sólo si el estado de la ejecución actual difiere
del estado de la ejecución anterior
● Aborted: acciones que se ejecutarán si el job se para manualmente
47
Notificaciones
● Por ejemplo:
– Enviar un correo cuando el job cambie de estado
– Archivar artefactos cuando el job tenga éxito
– Archivar logs cuando el job sea inestable
48
Notificaciones
pipeline {
agent any
stages {
stage('Prepara') {
steps {
writeFile encoding: 'utf-8', file: 'artifact.txt', text: 'Hello, world!'
writeFile encoding: 'utf-8', file: 'logs.txt', text: 'Core dumped!'
}
}
}
post {
changed {
mail to:"me@example.com", subject:"OK: ${currentBuild.fullDisplayName}",body: "Success"
}
unstable {
archiveArtifacts 'logs.txt'
}
success {
archiveArtifacts 'artifact.txt'
}
}
}
49
Builds
● Podemos lanzar otros jobs directamente desde el pipeline
● Nos permite definir flujos complejos
● Con Scripted pipeline tenemos control total sobre el flujo
50
Builds
node {
stage('First sample') {
Build job: 'StepSyntaxArchiveArtifacts',
propagate: false
}
stage('Second sample') {
build 'DeclarativePipeline'
}
}
Evita propagar el
error si el job fallara
(el segundo stage
siempre se
ejecutará)
51
Builds
52
Builds
stage('Update ci environments') {
steps {
build job: 'Development/run_ansible',
propagate: false
build job: 'Development/kurento_ci_build',
propagate: false,
parameters: [string(name: 'GERRIT_REFSPEC', value: 'master')]
}
}
Podemos pasar
parámetros al job
53
Builds
stage('Testing new environment') {
steps {
parallel (
"kurento_api_audit" : {
build job: 'Development/kurento_api_audit', propagate: false,
parameters: [string(name: 'GERRIT_REFSPEC', value: 'master')]
},
"kurento_app_audit" : {
build job: 'Development/kurento_app_audit', propagate: false,
parameters: [string(name: 'GERRIT_REFSPEC', value: 'master')]
},
"capability_functional_audit" : {
build job: 'Development/capability_functional_audit', propagate: false,
parameters: [string(name: 'GERRIT_REFSPEC', value: 'master')]
},
"capability_stability_audit" : {
build job: 'Development/capability_stability_audit', propagate: false,
parameters: [string(name: 'GERRIT_REFSPEC', value: 'master')]
},
"webrtc_audit" : {
build job: 'Development/webrtc_audit', propagate: false,
parameters: [string(name: 'GERRIT_REFSPEC', value: 'master')]
}
)
}
}
Ojo, que son
paréntesis...
54
Builds
55
Reutilización
● Supongamos que tenemos varios jobs muy similares entre sí
– Comparten stages
– Comparten configuraciones específicas
● Supongamos que tenemos que cambiar algo de esa parte común
– Refactorizar un stage compartido entre varios jobs
– Cambiar algún parámetro
– …
● Preferiría no tener que cambiar los jobs uno a uno
– Incluso usando Jenkinsfile dentro de proyectos esto es un engorro cuando varios proyectos
comparten una misma estructura de Jenkinsfile
● ¿Qué puedo hacer? ¿Estoy vendido? ¿Y si son 50 jobs (de verdad NO OS HA
PASADO)?
56
Reutilización
● La solución se llama Shared Libraries
– Librerías Groovy que puedo utilizar en los pipelines
– Tienen que estar disponibles en un repositorio de código
– Se dan de alta en la configuración global de Jenkins
– Se importan en el pipeline y se utilizan
57
Reutilización
● Shared Libraries: estructura del proyecto
(root)
+- src # Groovy source files
| +- org
| +- foo
| +- Bar.groovy # for org.foo.Bar class
+- vars
| +- foo.groovy # for global 'foo' variable
| +- foo.txt # help for 'foo' variable
+- resources # resource files (external libraries
only)
| +- org
| +- foo
| +- bar.json # static helper data for org.foo.Bar
58
Definimos nuestra
clase con nuestros
métodos
59
Reutilización
● Shared Libraries: estructura del proyecto
60
Reutilización
Nos desplazamos a
la sección Global
Pipeline Libraries
Indicamos el
nombre y la versión
a utilizar
Indicamos cómo
obtener la librería
61
Reutilización (scripted pipeline)
Cargamos la librería
e importamos el
paquete
Usamos la librería
de forma normal
62
Reutilización (declarative pipeline)
Cargamos la librería
e importamos el
paquete
Usamos la librería
dentro de un bloque
script
De lo sencillo a lo más molón
Jenkins
Pipeline
Patxi Gortázar
francisco.gortazar@urjc.es
@fgortazar

Más contenido relacionado

La actualidad más candente

Using GitLab CI
Using GitLab CIUsing GitLab CI
Using GitLab CIColCh
 
Kubernetes for Beginners: An Introductory Guide
Kubernetes for Beginners: An Introductory GuideKubernetes for Beginners: An Introductory Guide
Kubernetes for Beginners: An Introductory GuideBytemark
 
Learning git
Learning gitLearning git
Learning gitSid Anand
 
Gitlab flow solo
Gitlab flow soloGitlab flow solo
Gitlab flow soloviniciusban
 
Git Tutorial For Beginners | What is Git and GitHub? | DevOps Tools | DevOps ...
Git Tutorial For Beginners | What is Git and GitHub? | DevOps Tools | DevOps ...Git Tutorial For Beginners | What is Git and GitHub? | DevOps Tools | DevOps ...
Git Tutorial For Beginners | What is Git and GitHub? | DevOps Tools | DevOps ...Simplilearn
 
Kubernetes Deployment Strategies
Kubernetes Deployment StrategiesKubernetes Deployment Strategies
Kubernetes Deployment StrategiesAbdennour TM
 
Introduction to Git
Introduction to GitIntroduction to Git
Introduction to GitColin Su
 
Jenkins tutorial for beginners
Jenkins tutorial for beginnersJenkins tutorial for beginners
Jenkins tutorial for beginnersBugRaptors
 
Git,Github,How to host using Github
Git,Github,How to host using GithubGit,Github,How to host using Github
Git,Github,How to host using GithubSujata Regoti
 
Version control
Version controlVersion control
Version controlvisual28
 
Gestion de la configuracion del software
Gestion de la configuracion del softwareGestion de la configuracion del software
Gestion de la configuracion del softwareJohan Prevot R
 

La actualidad más candente (20)

Kubernetes 101
Kubernetes 101Kubernetes 101
Kubernetes 101
 
Using GitLab CI
Using GitLab CIUsing GitLab CI
Using GitLab CI
 
Git n git hub
Git n git hubGit n git hub
Git n git hub
 
Jenkins Overview
Jenkins OverviewJenkins Overview
Jenkins Overview
 
Kubernetes for Beginners: An Introductory Guide
Kubernetes for Beginners: An Introductory GuideKubernetes for Beginners: An Introductory Guide
Kubernetes for Beginners: An Introductory Guide
 
Learning git
Learning gitLearning git
Learning git
 
Introduction git
Introduction gitIntroduction git
Introduction git
 
Gitlab flow solo
Gitlab flow soloGitlab flow solo
Gitlab flow solo
 
Git Tutorial For Beginners | What is Git and GitHub? | DevOps Tools | DevOps ...
Git Tutorial For Beginners | What is Git and GitHub? | DevOps Tools | DevOps ...Git Tutorial For Beginners | What is Git and GitHub? | DevOps Tools | DevOps ...
Git Tutorial For Beginners | What is Git and GitHub? | DevOps Tools | DevOps ...
 
Introduction to helm
Introduction to helmIntroduction to helm
Introduction to helm
 
Git
GitGit
Git
 
Kubernetes Deployment Strategies
Kubernetes Deployment StrategiesKubernetes Deployment Strategies
Kubernetes Deployment Strategies
 
Github basics
Github basicsGithub basics
Github basics
 
Introduction to Git
Introduction to GitIntroduction to Git
Introduction to Git
 
Jenkins tutorial for beginners
Jenkins tutorial for beginnersJenkins tutorial for beginners
Jenkins tutorial for beginners
 
Jenkins
JenkinsJenkins
Jenkins
 
Git,Github,How to host using Github
Git,Github,How to host using GithubGit,Github,How to host using Github
Git,Github,How to host using Github
 
Version control
Version controlVersion control
Version control
 
Introduction To Git
Introduction To GitIntroduction To Git
Introduction To Git
 
Gestion de la configuracion del software
Gestion de la configuracion del softwareGestion de la configuracion del software
Gestion de la configuracion del software
 

Similar a De lo sencillo a lo más molón con Jenkins

Magallanes, Herramienta de despliegue PHP sencilla y poderosa
Magallanes, Herramienta de despliegue PHP sencilla y poderosa�Magallanes, Herramienta de despliegue PHP sencilla y poderosa�
Magallanes, Herramienta de despliegue PHP sencilla y poderosaFco Javier Núñez Berrocoso
 
Realidad Aumentada 01 documentacion tapir
Realidad Aumentada 01 documentacion tapirRealidad Aumentada 01 documentacion tapir
Realidad Aumentada 01 documentacion tapirAgustín Hv
 
Java day 2018 -> Integración y entrega continua no es más trabajo
Java day 2018 ->  Integración y entrega continua no es más trabajoJava day 2018 ->  Integración y entrega continua no es más trabajo
Java day 2018 -> Integración y entrega continua no es más trabajoDavid Recinos Orellana
 
Humanizacion de java script con typescript para d365
Humanizacion de java script con typescript para d365Humanizacion de java script con typescript para d365
Humanizacion de java script con typescript para d365Demian Raschkovan
 
Curso Kubernetes CodeURJC
Curso Kubernetes CodeURJCCurso Kubernetes CodeURJC
Curso Kubernetes CodeURJCMicael Gallego
 
Usando Django con Docker
Usando Django con DockerUsando Django con Docker
Usando Django con DockerErnesto Crespo
 
Manual de instalacion y configuracion de nagios
Manual de instalacion y configuracion de nagiosManual de instalacion y configuracion de nagios
Manual de instalacion y configuracion de nagiosManuel Pérez Ozorio
 
40 Novedades de JavaSE 9
40 Novedades de JavaSE 940 Novedades de JavaSE 9
40 Novedades de JavaSE 9Alexis Lopez
 
Docker: la revolución en virtualización
Docker: la revolución en virtualizaciónDocker: la revolución en virtualización
Docker: la revolución en virtualizaciónMarcelo Ochoa
 
Presentación SUbversion
Presentación SUbversionPresentación SUbversion
Presentación SUbversionrxif914u41
 
Presentacion Subversion
Presentacion SubversionPresentacion Subversion
Presentacion SubversionCesar Yanez
 
Notas de la version de MKVToolNix 79.0
 Notas de la version de MKVToolNix 79.0 Notas de la version de MKVToolNix 79.0
Notas de la version de MKVToolNix 79.0PILFRUTFELIZ
 
Proyectos JAVA con maven
Proyectos JAVA con mavenProyectos JAVA con maven
Proyectos JAVA con mavenJuan Vladimir
 
Proyectos java-con-maven
Proyectos java-con-mavenProyectos java-con-maven
Proyectos java-con-mavenJuan Vladimir
 
Continuous Delivery Un caso de estudio
Continuous Delivery Un caso de estudioContinuous Delivery Un caso de estudio
Continuous Delivery Un caso de estudioOsvaldo
 

Similar a De lo sencillo a lo más molón con Jenkins (20)

Integrando sonar
Integrando sonarIntegrando sonar
Integrando sonar
 
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
Magallanes, Herramienta de despliegue PHP sencilla y poderosa�Magallanes, Herramienta de despliegue PHP sencilla y poderosa�
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
 
Realidad Aumentada 01 documentacion tapir
Realidad Aumentada 01 documentacion tapirRealidad Aumentada 01 documentacion tapir
Realidad Aumentada 01 documentacion tapir
 
Java day 2018 -> Integración y entrega continua no es más trabajo
Java day 2018 ->  Integración y entrega continua no es más trabajoJava day 2018 ->  Integración y entrega continua no es más trabajo
Java day 2018 -> Integración y entrega continua no es más trabajo
 
Humanizacion de java script con typescript para d365
Humanizacion de java script con typescript para d365Humanizacion de java script con typescript para d365
Humanizacion de java script con typescript para d365
 
ATICA DevOps
ATICA DevOpsATICA DevOps
ATICA DevOps
 
Curso Kubernetes CodeURJC
Curso Kubernetes CodeURJCCurso Kubernetes CodeURJC
Curso Kubernetes CodeURJC
 
Usando Django con Docker
Usando Django con DockerUsando Django con Docker
Usando Django con Docker
 
Manual de instalacion y configuracion de nagios
Manual de instalacion y configuracion de nagiosManual de instalacion y configuracion de nagios
Manual de instalacion y configuracion de nagios
 
Redes
RedesRedes
Redes
 
40 Novedades de JavaSE 9
40 Novedades de JavaSE 940 Novedades de JavaSE 9
40 Novedades de JavaSE 9
 
Docker: la revolución en virtualización
Docker: la revolución en virtualizaciónDocker: la revolución en virtualización
Docker: la revolución en virtualización
 
Gestión Remota de Equipos con Python
Gestión Remota de Equipos con PythonGestión Remota de Equipos con Python
Gestión Remota de Equipos con Python
 
Presentación SUbversion
Presentación SUbversionPresentación SUbversion
Presentación SUbversion
 
Presentacion Subversion
Presentacion SubversionPresentacion Subversion
Presentacion Subversion
 
Notas de la version de MKVToolNix 79.0
 Notas de la version de MKVToolNix 79.0 Notas de la version de MKVToolNix 79.0
Notas de la version de MKVToolNix 79.0
 
Proyectos JAVA con maven
Proyectos JAVA con mavenProyectos JAVA con maven
Proyectos JAVA con maven
 
Proyectos java-con-maven
Proyectos java-con-mavenProyectos java-con-maven
Proyectos java-con-maven
 
Docker desde cero
Docker desde ceroDocker desde cero
Docker desde cero
 
Continuous Delivery Un caso de estudio
Continuous Delivery Un caso de estudioContinuous Delivery Un caso de estudio
Continuous Delivery Un caso de estudio
 

Más de Patxi Gortázar

Desarrollo web backend: Spring Boot, MongoDB y Azure
Desarrollo web backend: Spring Boot, MongoDB y AzureDesarrollo web backend: Spring Boot, MongoDB y Azure
Desarrollo web backend: Spring Boot, MongoDB y AzurePatxi Gortázar
 
La computación en la nube en el aula
La computación en la nube en el aulaLa computación en la nube en el aula
La computación en la nube en el aulaPatxi Gortázar
 
Path relinking for high dimensional continuous optimization
Path relinking for high dimensional continuous optimizationPath relinking for high dimensional continuous optimization
Path relinking for high dimensional continuous optimizationPatxi Gortázar
 
Grammarware engineering: un enfoque dirigido por modelos
Grammarware engineering: un enfoque dirigido por modelosGrammarware engineering: un enfoque dirigido por modelos
Grammarware engineering: un enfoque dirigido por modelosPatxi Gortázar
 
Git: un enfoque práctico
Git: un enfoque prácticoGit: un enfoque práctico
Git: un enfoque prácticoPatxi Gortázar
 

Más de Patxi Gortázar (7)

Docker & ci
Docker & ciDocker & ci
Docker & ci
 
Migrando CI a Docker
Migrando CI a DockerMigrando CI a Docker
Migrando CI a Docker
 
Desarrollo web backend: Spring Boot, MongoDB y Azure
Desarrollo web backend: Spring Boot, MongoDB y AzureDesarrollo web backend: Spring Boot, MongoDB y Azure
Desarrollo web backend: Spring Boot, MongoDB y Azure
 
La computación en la nube en el aula
La computación en la nube en el aulaLa computación en la nube en el aula
La computación en la nube en el aula
 
Path relinking for high dimensional continuous optimization
Path relinking for high dimensional continuous optimizationPath relinking for high dimensional continuous optimization
Path relinking for high dimensional continuous optimization
 
Grammarware engineering: un enfoque dirigido por modelos
Grammarware engineering: un enfoque dirigido por modelosGrammarware engineering: un enfoque dirigido por modelos
Grammarware engineering: un enfoque dirigido por modelos
 
Git: un enfoque práctico
Git: un enfoque prácticoGit: un enfoque práctico
Git: un enfoque práctico
 

Último

Presentación de html, css y javascript.
Presentación  de html, css y javascript.Presentación  de html, css y javascript.
Presentación de html, css y javascript.CeteliInmaculada
 
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVOSISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVOELIAMARYTOVARFLOREZD
 
Semana 5-Conceptualización del lenguaje de programación C++
Semana 5-Conceptualización del lenguaje de programación C++Semana 5-Conceptualización del lenguaje de programación C++
Semana 5-Conceptualización del lenguaje de programación C++luzgaray6
 
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptxMacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptxcalzadillasluis134
 
Theme design in Plone 6 - World Plone Day 2024
Theme design in Plone 6 - World Plone Day 2024Theme design in Plone 6 - World Plone Day 2024
Theme design in Plone 6 - World Plone Day 2024Leonardo J. Caballero G.
 
Introducción a Plone CMS - World Plone Day 2024
Introducción a Plone CMS - World Plone Day 2024Introducción a Plone CMS - World Plone Day 2024
Introducción a Plone CMS - World Plone Day 2024Leonardo J. Caballero G.
 

Último (6)

Presentación de html, css y javascript.
Presentación  de html, css y javascript.Presentación  de html, css y javascript.
Presentación de html, css y javascript.
 
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVOSISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
 
Semana 5-Conceptualización del lenguaje de programación C++
Semana 5-Conceptualización del lenguaje de programación C++Semana 5-Conceptualización del lenguaje de programación C++
Semana 5-Conceptualización del lenguaje de programación C++
 
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptxMacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
 
Theme design in Plone 6 - World Plone Day 2024
Theme design in Plone 6 - World Plone Day 2024Theme design in Plone 6 - World Plone Day 2024
Theme design in Plone 6 - World Plone Day 2024
 
Introducción a Plone CMS - World Plone Day 2024
Introducción a Plone CMS - World Plone Day 2024Introducción a Plone CMS - World Plone Day 2024
Introducción a Plone CMS - World Plone Day 2024
 

De lo sencillo a lo más molón con Jenkins

  • 1. De lo sencillo a lo más molón Jenkins Pipeline Patxi Gortázar francisco.gortazar@urjc.es @fgortazar
  • 2. 2 Who? ElasTest H2020 Project Coordinator Devops @ Kurento Teaching distributed systems @etsii_urjc Haskeller aficionado @fgortazar https://es.linkedin.com/in/franciscogortazar
  • 3. 3 Jenkins •Jenkins es el servidor de CI más popular •Es utilizado para construir, para ejecutar tests y para desplegar cualquier proyecto software
  • 5. 5 Jenkins •Instalación rápida – Necesitamos Java 8 o superior – Vamos a https://jenkins.io/ – Seleccionamos download – Descargamos la LTS Release (Generic Java package)
  • 6. 6 Jenkins •Instalación rápida – Ejecutamos $ java -jar jenkins.war --httpPort=8081 – La password de admin aparece en el log o en el fichero ~/.jenkins/secrets/initialAdminPassword – Nota: Borrar la carpeta ~/.jenkins si ya teníamos instalado Jenkins de antes y queremos empezar de cero
  • 14. 14 Jenkins Especificamos la ruta al JDK que tengamos instalado
  • 15. 15 Jenkins Añadimos Maven para que se pueda usar en las tareas (jobs)
  • 17. 17 Jenkins ● Creación de tareas (jobs) – El objetivo de jenkins es ejecutar tareas – Una tarea es la ejecución de un comando – Esos comandos pueden terminar correctamente o con error – La salida del comando se puede consultar mientras se ejecuta y se guarda para una consulta posterior – Los comandos pueden generar ficheros que también se guardan
  • 18. 18 Jenkins ● Creación de tareas (jobs) – Las tareas se pueden ejecutar: ● Iniciadas por el desarrollador (manualmente) ● Cada cierto tiempo (periódicamente) ● Motivadas por un evento externo (nuevo commit en un repositorio)
  • 19. 19 Jenkins ● Creación de tareas (jobs) – Una tarea típica en Jenkins consiste en: ● 1) Descargar un proyecto software de un repositorio git ● 2) Compilar el proyecto ● 3) Ejecutar los tests sobre el proyecto ● 4) Opcionalmente generar un binario/paquete y publicarlo en algún repositorio de binarios
  • 20. 20 Jenkins Creamos una nueva tarea para descargar el proyecto y ejecutar los tests
  • 24. 24 Jenkins Tarea finalizada correctamente (los tests han pasado) La tarea ejecuta varias etapas
  • 25. 25 Jenkins Podemos ver los logs de cada etapa
  • 27. 27 Jenkins Pinchamos en el número de ejecución para ver más detalles
  • 28. 28 Jenkins El jar se ha guardado Podemos ver los resultados de los tests
  • 29. 29 Jenkins Podemos ver toda la salida por consola
  • 30. 30 Jenkins Las instrucciones de pipeline salen en gris claro Las salidas de los comandos en negro
  • 31. 31 Pipeline ● Jenkins soporta dos sintaxis de pipelines – Sintaxis declarativa ● DSL para definir pipelines ● Sencillo de utilizar ● Útil si tu pipeline es sencillo ● Se puede incluir código groovy para cosas más complejas en seccion – Script (Groovy) ● Se puede utilizar directamente el lenguaje groovy ● Se dispone de librerías específicas para poder utilizar una notación similar a pipelines declarativos ● Más flexible y potente
  • 32. 32 Pipeline node { def mvnHome stage('Preparation') { git 'https://github.com/jglick/...' mvnHome = tool 'M3' } stage('Build') { if (isUnix()) { sh "'${mvnHome}/bin/mvn' ..." } else { bat(/"${mvnHome}binmvn" ...) } } stage('Results') { junit '**/target/surefire-reports/...' archive 'target/*.jar' } } pipeline { tools { maven "M3" } agent any stages { stage("Preparation") { steps { git 'https://github.com/jglick/...' } } stage("Build") { steps { sh "mvn -Dmaven.test.failure.ignore ..." } } } post { always { junit "**/target/surefire-reports/..." } success { archive "target/*.jar" } } } Declarativa ScriptDeclarativa Script
  • 33. 33 Pipeline node { def mvnHome stage('Preparation') { git 'https://github.com/jglick/...' mvnHome = tool 'M3' } stage('Build') { if (isUnix()) { sh "'${mvnHome}/bin/mvn' ..." } else { bat(/"${mvnHome}binmvn" ...) } } stage('Results') { junit '**/target/surefire-reports/...' archive 'target/*.jar' } } pipeline { tools { maven "M3" } agent any stages { stage("Preparation") { steps { git 'https://github.com/jglick/...' } } stage("Build") { steps { sh "mvn -Dmaven.test.failure.ignore ..." } } } post { always { junit "**/target/surefire-reports/..." } success { archive "target/*.jar" } } } Declarativa ScriptDeclarativa Script Indicamos dónde se debe ejecutar. Si no indicamos nada (o any en declarativa) se escogerá uno cualquiera
  • 34. 34 Pipeline node { def mvnHome stage('Preparation') { git 'https://github.com/jglick/...' mvnHome = tool 'M3' } stage('Build') { if (isUnix()) { sh "'${mvnHome}/bin/mvn' ..." } else { bat(/"${mvnHome}binmvn" ...) } } stage('Results') { junit '**/target/surefire-reports/...' archive 'target/*.jar' } } pipeline { tools { maven "M3" } agent any stages { stage("Preparation") { steps { git 'https://github.com/jglick/...' } } stage("Build") { steps { sh "mvn -Dmaven.test.failure.ignore ..." } } } post { always { junit "**/target/surefire-reports/..." } success { archive "target/*.jar" } } } Declarativa ScriptDeclarativa Script En los scripts puedo declarar variables globales que podré usar en las diferentes etapas
  • 35. 35 Pipeline node { def mvnHome stage('Preparation') { git 'https://github.com/jglick/...' mvnHome = tool 'M3' } stage('Build') { if (isUnix()) { sh "'${mvnHome}/bin/mvn' ..." } else { bat(/"${mvnHome}binmvn" ...) } } stage('Results') { junit '**/target/surefire-reports/...' archive 'target/*.jar' } } pipeline { tools { maven "M3" } agent any stages { stage("Preparation") { steps { git 'https://github.com/jglick/...' } } stage("Build") { steps { sh "mvn -Dmaven.test.failure.ignore ..." } } } post { always { junit "**/target/surefire-reports/..." } success { archive "target/*.jar" } } } Declarativa ScriptDeclarativa Script Un pipeline está compuesto de una o más etapas (stages)
  • 36. 36 Pipeline node { def mvnHome stage('Preparation') { git 'https://github.com/jglick/...' mvnHome = tool 'M3' } stage('Build') { if (isUnix()) { sh "'${mvnHome}/bin/mvn' ..." } else { bat(/"${mvnHome}binmvn" ...) } } stage('Results') { junit '**/target/surefire-reports/...' archive 'target/*.jar' } } pipeline { tools { maven "M3" } agent any stages { stage("Preparation") { steps { git 'https://github.com/jglick/...' } } stage("Build") { steps { sh "mvn -Dmaven.test.failure.ignore ..." } } } post { always { junit "**/target/surefire-reports/..." } success { archive "target/*.jar" } } } Declarativa ScriptDeclarativa Script Dentro de cada etapa puede haber uno o más pasos (steps)
  • 37. 37 Pipeline node { def mvnHome stage('Preparation') { git 'https://github.com/jglick/...' mvnHome = tool 'M3' } stage('Build') { if (isUnix()) { sh "'${mvnHome}/bin/mvn' ..." } else { bat(/"${mvnHome}binmvn" ...) } } stage('Results') { junit '**/target/surefire-reports/...' archive 'target/*.jar' } } pipeline { tools { maven "M3" } agent any stages { stage("Preparation") { steps { git 'https://github.com/jglick/...' } } stage("Build") { steps { sh "mvn -Dmaven.test.failure.ignore ..." } } } post { always { junit "**/target/surefire-reports/..." } success { archive "target/*.jar" } } } Declarativa ScriptDeclarativa Script Existen diferentes tipos de steps
  • 38. 38 Pipeline node { def mvnHome stage('Preparation') { git 'https://github.com/jglick/...' mvnHome = tool 'M3' } stage('Build') { if (isUnix()) { sh "'${mvnHome}/bin/mvn' ..." } else { bat(/"${mvnHome}binmvn" ...) } } stage('Results') { junit '**/target/surefire-reports/...' archive 'target/*.jar' } } pipeline { tools { maven "M3" } agent any stages { stage("Preparation") { steps { git 'https://github.com/jglick/...' } } stage("Build") { steps { sh "mvn -Dmaven.test.failure.ignore ..." } } } post { always { junit "**/target/surefire-reports/..." } success { archive "target/*.jar" } } } Declarativa ScriptDeclarativa Script La forma de utilizar las herramientas configuradas es diferente
  • 39. 39 Pipeline ● Build steps... – Son funciones disponibles dentro del pipeline – Los plugins pueden contribuir nuevos steps – Se pueden utilizar en ambos tipos de sintaxis – En la mayoría de los casos requieren parámetros ● Los parámetros son pares clave-valor (parámetros nombrados) ● Si sólo hay uno, se puede obviar el nombre readFile ‘build.properties’ ● O no: readFile file: ‘build.properties’ ● Pero si hay varios hay que ponerlos (nótese la coma): readFile file: ‘build.properties’, encoding: ‘UTF-8’
  • 40. 40 Pipeline ● Build steps... – Hay tres sintaxis diferentes para invocar steps ● Cuando no hay colisión de nombres, y existe un alias para el step: archiveArtifacts ‘**.jar’ ● Cuando hay colisión de nombres o no hay alias para el step: step([$class: ‘ArtifactsArchiver’, artifacts: ‘**.jar’]) ● Siempre podemos utilizar Groovy plano: step(new ArtifactArchiver(‘**.jar’))
  • 41. 41 Pipeline Hay que desmarcar el sanbox (no se permite código)
  • 44. 44 Pipeline Seleccionamos el step que queremos Especificamos los parámetros Obtenemos el texto que hay que copiar en el pipeline
  • 46. 46 Notificaciones ● Podemos añadir acciones al final del job – Se ejecutarán al finalizar dependiendo del estado – Interesante para mandar correos o archivar artefactos – Podemos ejecutar unas acciones u otras en función del estado del job: ● Always: acciones que se ejecutarán siempre ● Success: acciones para ser ejecutadas si el job tiene éxito ● Failure: acciones para ser ejecutadas si el job falla ● Unstable: acciones que se ejecutarán si el job tiene test fallidos ● Changed: acciones que se ejecutarán sólo si el estado de la ejecución actual difiere del estado de la ejecución anterior ● Aborted: acciones que se ejecutarán si el job se para manualmente
  • 47. 47 Notificaciones ● Por ejemplo: – Enviar un correo cuando el job cambie de estado – Archivar artefactos cuando el job tenga éxito – Archivar logs cuando el job sea inestable
  • 48. 48 Notificaciones pipeline { agent any stages { stage('Prepara') { steps { writeFile encoding: 'utf-8', file: 'artifact.txt', text: 'Hello, world!' writeFile encoding: 'utf-8', file: 'logs.txt', text: 'Core dumped!' } } } post { changed { mail to:"me@example.com", subject:"OK: ${currentBuild.fullDisplayName}",body: "Success" } unstable { archiveArtifacts 'logs.txt' } success { archiveArtifacts 'artifact.txt' } } }
  • 49. 49 Builds ● Podemos lanzar otros jobs directamente desde el pipeline ● Nos permite definir flujos complejos ● Con Scripted pipeline tenemos control total sobre el flujo
  • 50. 50 Builds node { stage('First sample') { Build job: 'StepSyntaxArchiveArtifacts', propagate: false } stage('Second sample') { build 'DeclarativePipeline' } } Evita propagar el error si el job fallara (el segundo stage siempre se ejecutará)
  • 52. 52 Builds stage('Update ci environments') { steps { build job: 'Development/run_ansible', propagate: false build job: 'Development/kurento_ci_build', propagate: false, parameters: [string(name: 'GERRIT_REFSPEC', value: 'master')] } } Podemos pasar parámetros al job
  • 53. 53 Builds stage('Testing new environment') { steps { parallel ( "kurento_api_audit" : { build job: 'Development/kurento_api_audit', propagate: false, parameters: [string(name: 'GERRIT_REFSPEC', value: 'master')] }, "kurento_app_audit" : { build job: 'Development/kurento_app_audit', propagate: false, parameters: [string(name: 'GERRIT_REFSPEC', value: 'master')] }, "capability_functional_audit" : { build job: 'Development/capability_functional_audit', propagate: false, parameters: [string(name: 'GERRIT_REFSPEC', value: 'master')] }, "capability_stability_audit" : { build job: 'Development/capability_stability_audit', propagate: false, parameters: [string(name: 'GERRIT_REFSPEC', value: 'master')] }, "webrtc_audit" : { build job: 'Development/webrtc_audit', propagate: false, parameters: [string(name: 'GERRIT_REFSPEC', value: 'master')] } ) } } Ojo, que son paréntesis...
  • 55. 55 Reutilización ● Supongamos que tenemos varios jobs muy similares entre sí – Comparten stages – Comparten configuraciones específicas ● Supongamos que tenemos que cambiar algo de esa parte común – Refactorizar un stage compartido entre varios jobs – Cambiar algún parámetro – … ● Preferiría no tener que cambiar los jobs uno a uno – Incluso usando Jenkinsfile dentro de proyectos esto es un engorro cuando varios proyectos comparten una misma estructura de Jenkinsfile ● ¿Qué puedo hacer? ¿Estoy vendido? ¿Y si son 50 jobs (de verdad NO OS HA PASADO)?
  • 56. 56 Reutilización ● La solución se llama Shared Libraries – Librerías Groovy que puedo utilizar en los pipelines – Tienen que estar disponibles en un repositorio de código – Se dan de alta en la configuración global de Jenkins – Se importan en el pipeline y se utilizan
  • 57. 57 Reutilización ● Shared Libraries: estructura del proyecto (root) +- src # Groovy source files | +- org | +- foo | +- Bar.groovy # for org.foo.Bar class +- vars | +- foo.groovy # for global 'foo' variable | +- foo.txt # help for 'foo' variable +- resources # resource files (external libraries only) | +- org | +- foo | +- bar.json # static helper data for org.foo.Bar
  • 58. 58 Definimos nuestra clase con nuestros métodos
  • 59. 59 Reutilización ● Shared Libraries: estructura del proyecto
  • 60. 60 Reutilización Nos desplazamos a la sección Global Pipeline Libraries Indicamos el nombre y la versión a utilizar Indicamos cómo obtener la librería
  • 61. 61 Reutilización (scripted pipeline) Cargamos la librería e importamos el paquete Usamos la librería de forma normal
  • 62. 62 Reutilización (declarative pipeline) Cargamos la librería e importamos el paquete Usamos la librería dentro de un bloque script
  • 63. De lo sencillo a lo más molón Jenkins Pipeline Patxi Gortázar francisco.gortazar@urjc.es @fgortazar