Explicando passo a passo um arquivo Jenkinsfile

Há uns meses atrás fiz uma publicação sobre criação de uma esteira CI/CD para Python usando o Jenkins (link abaixo), mas não foi explicado como escrever um como código. Nesta publicação tentarei explicar as diferenças entre (vs e os blocos, seções e diretivas mais usuais.

Scripted vs Declarative

O do tipo foi o primeiro a ser implementado como código pelo Jenkins, escrito em e tem como propósito ser uma estrutura de fácil adaptação pelo usuário, sendo de responsabilidade do desenvolvedor criar a estrutura lógica do .

Para simplificar a vida do engenheiro DevOps, foi criado posteriormente o do tipo também escrito em mas com uma estrutura definida, e é justamente esse tipo que iremos desbravar aqui.

Outras diferenças entre estes tipos de escrita são bem descritas no link abaixo.

Desmembrando o Pipeline

Caso queira estudar a fundo todas as partes de um , recomendo a leitura da documentação oficial do Jenkins.

TODOS os do tipo começam com um bloco chamado , como dito no tópico anterior, é necessário seguir com uma estrutura.

pipeline {
/* insert Declarative Pipeline here */
}

Sections

Agent

O (computador) nada mais é onde será executado o seu , no caso descrito abaixo, configuramos o como any, ou seja, qualquer disponível será escolhido. Caso passe como parâmetro um , escolhemos assim onde será realizada a execução do .

Temos dois tipos de , o e o, a diferença é que se declarado no começo do , fora dos , as opções são carregadas depois de entrar no , já se declarado no , as opção serão carregadas antes do , verificando qualquer condição quando existentes.

pipeline {
agent any
}

Parâmetros do : any, none, label, docker, dockerfile e kubernetes.

Post

O bloco define uma ou mais ações a serem executadas no final do ou do dependendo de onde estiver declarado. O bloco aceita qualquer uma das seguintes : always, changed, fixed, regression, aborted, failure, success, unstable, unsuccessful, e cleanup.

Stages

Contém uma sequência de diretivas do tipo sÉ recomendado ter pelo menos uma diretrizSimples assim.

Steps

A seção define um ou mais a serem executados em um .

Script

Aqui é onde temos a liberdade de realizar um trecho de um do tipo dentro do do tipo . Isso dá um poder enorme ao desenvolvedor DevOps. No exemplo abaixo utilizamos condicional para tomar uma ação.

Directives

environment

Assim como o , o pode ocorrer como uma diretiva global, se for escrito fora do , ou dentro do , seguem abaixo as duas condições.

Global:

environment { 
PATH="/home/bitnami/miniconda3/bin:$PATH"
}

Local:

stages {
stage('Load Parameters') {
environment {
PATH="/home/bitnami/miniconda3/bin:$PATH")
}
}
}

options

A diretiva permite configurar opções específicas do de dentro do próprio . Não entraremos a fundo aqui.

parameters

Provê uma lista de parâmetros consumíveis pelo que o usuário deve prover ao iniciar a execução do . Não entraremos a fundo aqui.

triggers

Como seu receberá o , pode-se configurar recorrência temporal, mas para projetos configurados com um a partir do SCM, não é necessário configurá-lo.

stage

Uma das diretivas mais importantes, aqui é configurado a etapa do seu , e está sempre contida dentro do bloco .

input

Ao utilizar essa diretiva, o irá aguardar a devolutiva do usuário. Importante caso necessite de aprovação para seguir com o . Não entraremos a fundo aqui.

when

Esta diretiva permite ao selecionar qual deve ser executado, baseado em condições. No exemplo abaixo vemos que existe uma validação por expressão regular no nome da , além de uma condição aninhada ().

stage('Example Deploy') {
when {
expression { BRANCH_NAME ==~ /(production|staging)/ }
anyOf {
environment name: 'DEPLOY_TO', value: 'production'
environment name: 'DEPLOY_TO', value: 'staging'
}
}

Parallel

Os sno podem ter uma seção paralela contendo uma lista de aninhados a serem executados em paralelo. Observe que um deve ter uma e apenas uma das seguintes opções: stages, steps, parallel ou matrix.

Pronto! Passamos brevemente pelas estruturas mais utilizadas de um pipeline Jenkins. Nos vemos até a próxima publicação.

Data scientist and devops enthusiast.

Data scientist and devops enthusiast.