Olá, sou William Líder de squad na InnSpire.dev, quero começar a escrever sobre minhas experiencias no mundo da tecnologia, já que são mais de 20 anos trabalhando nessa area, quero compartilhar meus conhecimentos, sim, um pouco tarde para isso, mas como dizem: antes tarde do que mais tarde ainda.
E escolhi começar com uma das ferramentas que mais me deu dor de cabeça — e também as maiores vitórias: Jenkins.
Já perdi dados, já quebrei pipelines, já fiquei até de madrugada resolvendo build travado… mas hoje tenho uma infraestrutura estável, barata e eficiente rodando na AWS.
Neste artigo, quero mostrar como estruturamos Jenkins + Docker + AWS e talvez te dar alguns insights para montar algo parecido.
Bom vamos lá, atualmente nosso servidor está dentro da AWS, na região da Virginia, é uma instancia do tipo t3a.medium com 2vCPU e 4GB de memória, e dentro dela tenho uma instalação do Ubuntu 24.04 Server, gosto muito de trabalhar com essa distro em servidores, é muito versátil, mas isso pode ser um assunto para outro artigo quem sabe.
Como podem notar no print do servidor, já está rodando a algum tempo sem nenhuma interrupção, mas apesar da memória estar bem usada, todos os serviços que estão rodando dentro da maquina rodam bem, e está tudo dentro de containers, temos atualmente 21 containers rodando dentro deste servidor.
Dentro dos 21 containers que temos, 2 são para instalações do Jenkins, só que com jobs diferentes, propósitos diferentes, 2 para agentes de build do Jenkins (1 para cada instalação), e outros dois containers muito importantes para auxiliar nesse fluxo todo, Nginx para gerenciar o roteamento, e o Portainer para verificar a saude de todos os containers que estão no servidor.
A idéia de separar em dois containers diferentes, foi mais para dois times distintos conseguirem atuar de forma totalmente separada e poder destruir seu ambiente sem afetar o outro time, e com docker isso é muito mais simples.
Agora de fato sobre a configuração do Jenkins, no docker-compose eu tenho mapeado os diretórios que serão acessados pelo Jenkins e o agente, e uma peculiaridade é o mapeamento do arquivo docker.sock, isso foi necessário pois dentro de alguns jobs eu precisava fazer o restart de algum container, e sem isso não era possível acessar os containers 🫠
# docker-compose.yml
services:
jenkins:
build: .
container_name: jenkins-innova
restart: always
privileged: true
ports:
- "3001:8080"
- "50000:50000"
volumes:
- jenkins_home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
networks:
- innova-network
jenkins-innova-agent:
image: jenkins/inbound-agent
container_name: jenkins-innova-agent
networks:
- innova-network
volumes:
- /srv/jenkins-innova:/home/jenkins/agent-workspace
- /var/run/docker.sock:/var/run/docker.sock
environment:
JENKINS_URL: "http://jenkins-innova:8080"
JENKINS_AGENT_NAME: "agent"
JENKINS_SECRET: "chave"
restart: unless-stopped
volumes:
jenkins_home:
networks:
innova-network:
external: true
# Dockerfile
FROM jenkins/jenkins:alpine3.21-jdk21
USER root
# Instalar dependências sem modificar o Java existente
RUN apk add --no-cache \
sudo \
docker-cli \
git \
bash \
curl \
ttf-dejavu
# Adicionar usuário Jenkins ao grupo Docker
RUN addgroup -S docker && adduser jenkins docker \
&& echo "jenkins ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/jenkins
USER jenkins
E daqui para frente é só sucesso, configurar e sair usando, se quiser que eu comente mais como são configurados os jobs que temos, comenta ai!


Top comments (0)