Automatize build, empacotamento e push com pipelines como código no Jenkins
git push → servidor de CI (Jenkins) → Build → Testes → Imagem Docker → Push para o registry → Deploy
git push
Objetivo: um ciclo de desenvolvimento mais curto — a máquina faz os passos repetitivos, sempre do mesmo jeito.
Jenkinsfile
O jenkins/compose.yaml constrói uma imagem personalizada sobre jenkins/jenkins:jdk25:
jenkins/compose.yaml
jenkins/jenkins:jdk25
services: jenkins: container_name: jenkins build: dockerfile_inline: | FROM jenkins/jenkins:jdk25 # + maven, docker-ce, kubectl, AWS CLI RUN usermod -aG docker jenkins ports: - 9080:8080 volumes: - ${CONFIG:-./config}/jenkins:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock
docker compose up -d --build # then open http://localhost:9080/
Montar o /var/run/docker.sock dá ao container controle total do daemon Docker do hospedeiro. Localmente, tudo bem; em ambiente compartilhado, reforce (Docker rootless, daemon de build dedicado).
/var/run/docker.sock
Na primeira inicialização, o Jenkins pede uma senha inicial de administrador aleatória:
docker logs jenkins 2>&1 | grep -A 3 "initialAdminPassword" docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
Um executor é um slot que roda um job. Mais executors → vários microsserviços com build em paralelo. No Windows, abra o terminal como Administrador.
Manage Jenkins → Credentials → System → Global credentials → Add Credentials
dockerhub-credential
Use um token com escopo Read & Write, e não sua senha: um token vazado é revogado sem mexer na conta.
account
pipeline { agent any stages { stage('Build') { steps { sh 'mvn -B -DskipTests clean install' } } } }
-B
account-service
environment { SERVICE = 'account' NAME = "humbertosandmann/${env.SERVICE}" }
build job: 'account', wait: true
mvn -B -DskipTests clean package
NAME é o repositório no Docker Hub; troque o usuário pelo seu.
NAME
withCredentials([usernamePassword( credentialsId: 'dockerhub-credential', usernameVariable: 'USERNAME', passwordVariable: 'TOKEN')]) { sh 'echo $TOKEN | docker login -u $USERNAME --password-stdin' sh "docker buildx create --use --platform=linux/arm64,linux/amd64 ..." sh "docker buildx build --platform=linux/arm64,linux/amd64 --push \ --tag ${env.NAME}:latest --tag ${env.NAME}:${env.BUILD_ID} -f Dockerfile ." sh "docker buildx rm --force multi-platform-builder-${env.SERVICE}" }
withCredentials
$TOKEN
buildx
linux/arm64
linux/amd64
:latest
:<BUILD_ID>
credentialsId
build job: 'account'
-DskipTests
Test
mvn test
docker buildx
latest
BUILD_ID
Roteiro: (1) CI e CD; (2) o Jenkins em um container; (3) desbloqueio, executors, credenciais; (4) Jenkinsfile: só build e build-empacotamento-push; (5) armadilhas.
O ponto dos executors: o account-service ocupa um slot enquanto espera o account.