Utilizando Bibliotecas Compartilhadas do Jenkins

Beginner

Introdução

As Bibliotecas Compartilhadas (Shared Libraries) do Jenkins permitem que as equipes reutilizem código de Pipeline em diversos jobs. Um layout comum de biblioteca coloca passos personalizados simples no diretório vars/. Um Pipeline pode então carregar a biblioteca e chamar esses passos como se fossem funções normais de Pipeline.

Neste laboratório, você preparará uma biblioteca compartilhada local com vars/sayHello.groovy, irá registrá-la como uma Global Pipeline Library no painel do Jenkins, criará um job de Pipeline que chama sayHello e verificará a saída no Jenkins.

Preparar um Repositório de Biblioteca Compartilhada

Neste passo, você preparará um repositório Git local para uma Biblioteca Compartilhada do Jenkins. O diretório vars/ é especial: cada arquivo .groovy nele se torna um passo de Pipeline com o mesmo nome.

Execute este comando para criar vars/sayHello.groovy dentro do container do Jenkins:

docker exec jenkins bash -lc '
set -e
rm -rf /var/jenkins_home/shared-lib-src /var/jenkins_home/shared-lib.git
mkdir -p /var/jenkins_home/shared-lib-src/vars
cd /var/jenkins_home/shared-lib-src
git init -b main
git config user.email "jenkins@example.com"
git config user.name "Jenkins Shared Library"
cat > vars/sayHello.groovy <<'"'"'EOF'"'"'
def call(String name = "LabEx") {
    echo "Shared library says hello to ${name}"
}
EOF
git add vars/sayHello.groovy
git commit -m "Add sayHello shared library step"
'

Agora, publique o repositório como um repositório Git bare local e exponha-o através de git://localhost/shared-lib.git:

docker exec jenkins bash -lc '
set -e
cd /var/jenkins_home/shared-lib-src
git init --bare --initial-branch=main /var/jenkins_home/shared-lib.git
git remote add origin /var/jenkins_home/shared-lib.git
git push origin main
touch /var/jenkins_home/shared-lib.git/git-daemon-export-ok
if [ -f /tmp/shared-lib-git-daemon.pid ]; then
  kill "$(cat /tmp/shared-lib-git-daemon.pid)" 2>/dev/null || true
  rm -f /tmp/shared-lib-git-daemon.pid
fi
git daemon --reuseaddr --base-path=/var/jenkins_home --export-all --detach --pid-file=/tmp/shared-lib-git-daemon.pid /var/jenkins_home
'

Registre o branch do repositório que o Jenkins utilizará:

docker exec jenkins git ls-remote git://localhost/shared-lib.git refs/heads/main | tee /home/labex/project/shared-library-repository.txt

A saída deve incluir refs/heads/main.

Registrar uma Global Pipeline Library

Neste passo, você registrará o repositório como uma Global Pipeline Library do Jenkins chamada labex-shared-lib. Um Pipeline pode carregar este nome com @Library.

Abra a interface Desktop. O Firefox abre o Jenkins automaticamente. Caso não abra, acesse http://localhost:8080.

No painel do Jenkins:

Clique em Manage Jenkins e, em seguida, clique em System.

Role até Global Trusted Pipeline Libraries ou Global Pipeline Libraries. Clique em Add.

Preencha a biblioteca com estes valores:

  • Name: labex-shared-lib
  • Default version: main
  • Marque Allow default version to be overridden
  • Deixe Load implicitly desmarcado
  • Retrieval method: Modern SCM
  • Source Code Management: Git
  • Project Repository: git://localhost/shared-lib.git
  • Credentials: - none -

Clique em Save.

Configuração da Global Pipeline Library do Jenkins

Execute este comando para registrar a configuração da biblioteca salva:

docker exec jenkins sh -lc "grep -n -E '<name>labex-shared-lib</name>|git://localhost/shared-lib.git|<defaultVersion>main</defaultVersion>' /var/jenkins_home/org.jenkinsci.plugins.workflow.libs.GlobalLibraries.xml" | tee /home/labex/project/shared-library-config-lines.txt

Criar um Pipeline que Carrega a Biblioteca

Neste passo, você criará um job de Pipeline chamado shared-library-demo. O Pipeline carrega a labex-shared-lib e chama o passo personalizado sayHello('LabEx') definido em vars/sayHello.groovy.

No painel do Jenkins:

Clique em New Item, digite shared-library-demo, selecione Pipeline e clique em OK.

Role até a seção Pipeline. Mantenha Definition como Pipeline script.

Insira este script:

@Library('labex-shared-lib@main') _

node {
    stage('Use Library') {
        sayHello('LabEx')
    }
}

Clique em Save.

Pipeline do Jenkins utilizando uma biblioteca compartilhada

Execute este comando para registrar o script do Pipeline salvo:

docker exec jenkins sh -lc "grep -n -E '@Library|sayHello' /var/jenkins_home/jobs/shared-library-demo/config.xml" | tee /home/labex/project/shared-library-job-config.txt

Executar o Pipeline da Biblioteca Compartilhada

Neste passo, você executará o job de Pipeline. O Jenkins buscará a biblioteca compartilhada no repositório Git local, carregará o arquivo vars/sayHello.groovy e executará o passo personalizado.

Na página do job shared-library-demo, clique em Build Now.

Quando o build #1 aparecer no histórico de builds, aguarde até que ele termine. Um build bem-sucedido significa que o Jenkins carregou a biblioteca e executou o script do Pipeline.

Resultado do build da biblioteca compartilhada do Jenkins

Execute este comando para salvar o resultado do build:

curl -fsS http://localhost:8080/job/shared-library-demo/1/api/json | tr ',' '\n' | grep '"result":"SUCCESS"' | tee /home/labex/project/shared-library-build-result.txt

Inspecionar a Saída da Biblioteca Compartilhada

Neste passo, você inspecionará a saída do console do Jenkins. A evidência principal é a linha impressa pelo sayHello.groovy.

Abra o build #1 e clique em Console Output.

O console deve mostrar o Jenkins carregando a labex-shared-lib e imprimindo:

Shared library says hello to LabEx

Saída do console da biblioteca compartilhada do Jenkins

Execute este comando para salvar a mesma evidência do console:

curl -fsS http://localhost:8080/job/shared-library-demo/1/consoleText | grep 'Shared library says hello to LabEx' | tee /home/labex/project/shared-library-console-lines.txt

Resumo

Você preparou um repositório de Biblioteca Compartilhada do Jenkins, registrou-o como uma Global Pipeline Library a partir do painel, criou um job de Pipeline que carregou a biblioteca e verificou que um passo personalizado em vars/ foi executado com sucesso na saída do console do Jenkins.