Criando Pipelines Multibranch

Beginner

Introdução

Um Pipeline Multibranch do Jenkins analisa um repositório de controle de versão, identifica os branches que contêm um Jenkinsfile e cria um job de Pipeline para cada um deles. Isso permite que o branch main e os branches de funcionalidade (feature branches) utilizem suas próprias definições de Pipeline, mantendo-se sob um único projeto pai.

Neste laboratório, você preparará um pequeno repositório Git local com dois branches, criará um Pipeline Multibranch a partir do painel do Jenkins, analisará o repositório e comparará a saída do console de cada branch descoberto.

Preparar um repositório Git com dois branches

Nesta etapa, você preparará um pequeno repositório Git que o Jenkins possa analisar. O repositório reside dentro do contêiner do Jenkins, para que o controlador do Jenkins possa acessá-lo sem depender do GitHub ou de outro serviço externo.

Execute este comando no terminal para criar o branch main com um Jenkinsfile:

docker exec jenkins bash -lc '
set -e
rm -rf /var/jenkins_home/multibranch-src /var/jenkins_home/multibranch-demo.git
mkdir -p /var/jenkins_home/multibranch-src
cd /var/jenkins_home/multibranch-src
git init -b main
git config user.email "jenkins@example.com"
git config user.name "Jenkins Multibranch"
cat > Jenkinsfile <<'"'"'EOF'"'"'
pipeline {
    agent any
    stages {
        stage("Branch Info") {
            steps {
                echo "Running main branch pipeline"
                sh "echo BRANCH_NAME=${BRANCH_NAME}"
            }
        }
    }
}
EOF
git add Jenkinsfile
git commit -m "Add main branch Jenkinsfile"
'

Agora, crie um branch feature/demo com uma mensagem de Pipeline diferente e publique ambos os branches em um repositório bare:

docker exec jenkins bash -lc '
set -e
cd /var/jenkins_home/multibranch-src
git checkout -b feature/demo
sed -i "s/Running main branch pipeline/Running feature demo pipeline/" Jenkinsfile
git add Jenkinsfile
git commit -m "Customize feature branch Jenkinsfile"
git init --bare --initial-branch=main /var/jenkins_home/multibranch-demo.git
git remote add origin /var/jenkins_home/multibranch-demo.git
git push origin main
git push origin feature/demo
touch /var/jenkins_home/multibranch-demo.git/git-daemon-export-ok
if [ -f /tmp/multibranch-git-daemon.pid ]; then
  kill "$(cat /tmp/multibranch-git-daemon.pid)" 2>/dev/null || true
  rm -f /tmp/multibranch-git-daemon.pid
fi
git daemon --reuseaddr --base-path=/var/jenkins_home --export-all --detach --pid-file=/tmp/multibranch-git-daemon.pid /var/jenkins_home
'

Registre os branches que o Jenkins irá analisar:

docker exec jenkins git --git-dir=/var/jenkins_home/multibranch-demo.git branch -a | tee /home/labex/project/multibranch-branches.txt

Você deverá ver ambos os branches:

  feature/demo
* main

Criar um projeto de Pipeline Multibranch

Nesta etapa, você criará um projeto de Pipeline Multibranch a partir do painel do Jenkins. O projeto analisará git://localhost/multibranch-demo.git e buscará um arquivo chamado Jenkinsfile em cada branch.

Abra a interface da área de trabalho. O Firefox abre o Jenkins automaticamente. Se não abrir, acesse http://localhost:8080.

No painel do Jenkins:

Clique em New Item, digite multibranch-demo, selecione Multibranch Pipeline e clique em OK.

Na página de configuração:

Em Branch Sources, clique em Add source e selecione Git.

Preencha a fonte Git com estes valores:

  • Project Repository: git://localhost/multibranch-demo.git
  • Credentials: - none -

Mantenha Behaviors com o comportamento padrão de descoberta de branches. Em Build Configuration, mantenha Mode como by Jenkinsfile e Script Path como Jenkinsfile.

Clique em Save.

Jenkins Multibranch Pipeline Git source

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

docker exec jenkins sh -lc "grep -n -E 'WorkflowMultiBranchProject|git://localhost/multibranch-demo.git|<scriptPath>Jenkinsfile</scriptPath>' /var/jenkins_home/jobs/multibranch-demo/config.xml" | tee /home/labex/project/multibranch-config-lines.txt

Analisar os branches do repositório

Nesta etapa, você executará a indexação de branches a partir do painel do Jenkins. A indexação de branches analisa o repositório Git, encontra os branches com um Jenkinsfile e cria jobs filhos para esses branches.

Na página do projeto multibranch-demo, clique em Scan Multibranch Pipeline Now.

Aguarde até que a página exiba os jobs filhos para main e feature/demo. O Jenkins também pode iniciar automaticamente a primeira compilação para cada branch descoberto.

Jenkins discovered Multibranch jobs

Execute este comando para registrar os jobs filhos descobertos:

curl -fsS http://localhost:8080/job/multibranch-demo/api/json | grep -o '"name":"[^"]*"' | tee /home/labex/project/multibranch-discovered-jobs.txt

A saída deve incluir ambos os jobs de branch:

"name":"main"
"name":"feature%2Fdemo"

Verificar as compilações dos branches

Nesta etapa, você confirmará que o Jenkins consegue compilar cada branch descoberto. Um Pipeline Multibranch mantém cada branch como seu próprio job de Pipeline filho.

Abra o job do branch main a partir da página multibranch-demo. Se uma compilação já estiver em execução, aguarde a conclusão. Se ainda não houver uma compilação, clique em Build Now.

Retorne ao multibranch-demo, abra o job do branch feature/demo e faça o mesmo.

Ambos os jobs de branch devem ter uma última compilação bem-sucedida.

Jenkins successful branch builds

Execute este comando para registrar a última compilação bem-sucedida de cada branch:

python3 - <<'PY' | tee /home/labex/project/multibranch-build-results.txt
import json
import urllib.request

for url_name, display in [('main', 'main'), ('feature%252Fdemo', 'feature/demo')]:
    with urllib.request.urlopen(f'http://localhost:8080/job/multibranch-demo/job/{url_name}/lastBuild/api/json') as response:
        data = json.load(response)
    print(f'{display}: {data["result"]}')
PY

Você deverá ver:

main: SUCCESS
feature/demo: SUCCESS

Comparar a saída do Pipeline dos branches

Nesta etapa, você comparará a saída do console das compilações dos dois branches. O branch main e o branch feature/demo usam mensagens diferentes em seus Jenkinsfiles, portanto, os logs provam que o Jenkins executou o Pipeline específico de cada branch corretamente.

Abra a última compilação do branch main e clique em Console Output. Ela deve exibir Running main branch pipeline.

Em seguida, abra a última compilação do branch feature/demo e clique em Console Output. Ela deve exibir Running feature demo pipeline.

Jenkins Multibranch Pipeline console output

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

curl -fsS http://localhost:8080/job/multibranch-demo/job/main/lastBuild/consoleText | grep 'Running main branch pipeline' | tee /home/labex/project/multibranch-console-lines.txt
curl -fsS http://localhost:8080/job/multibranch-demo/job/feature%252Fdemo/lastBuild/consoleText | grep 'Running feature demo pipeline' | tee -a /home/labex/project/multibranch-console-lines.txt

Resumo

Você preparou um repositório Git local com dois branches, criou um Pipeline Multibranch do Jenkins a partir do painel, analisou o repositório, confirmou que ambos os jobs de branch foram compilados com sucesso e comparou a saída do Pipeline específica de cada branch.