Implementação de Microserviços Multi-módulos com Jenkins e Docker Compose

Estruturação do Ambiente de Build

Para gerenciar a implantação de uma arquitetura de microserviços baseada em Maven com múltiplos módulos, é essencial configurar o Jenkins para interagir diretamente com o daemon do Docker do host. Isso permite que o pipeline construa imagens e gerencie cotnainers de forma eficiente.

Configuração do Dockerfile

O arquivo Dockerfile abaixo foi proejtado para ser genérico, aceitando argumentos em tempo de build para definir o artefato JAR e a porta de exposição.

FROM openjdk:21-slim

# Argumentos para customização em tempo de build
ARG APP_FILE
ARG APP_PORT

# Definição do diretório de trabalho
WORKDIR /deploy

# Cópia do artefato gerado pelo Maven
COPY ${APP_FILE}.jar service-app.jar

# Exposição da porta dinâmica
EXPOSE ${APP_PORT}

# Inicialização da aplicação com parâmetros de ambiente
ENTRYPOINT ["java", "-jar", "-Duser.timezone=America/Sao_Paulo", "-Dfile.encoding=UTF-8", "service-app.jar", "--spring.profiles.active=prod"]

Orquestração com Docker Compose

O docker-compose.yml centraliza a rede e a definição dos serviços. No exemplo abaixo, utilizamos uma rede externa para garantir a comunicação entre diferentes stacks.

networks:
  backend_mesh:
    external: true

services:
  gateway-service:
    image: cloud-gateway:latest
    container_name: ms-gateway
    restart: unless-stopped
    ports:
      - "9301:9301"
    networks:
      backend_mesh:
        ipv4_address: 172.19.8.71

  auth-core:
    image: cloud-auth-core:latest
    container_name: ms-auth
    restart: unless-stopped
    ports:
      - "9304:9304"
    networks:
      backend_mesh:
        ipv4_address: 172.19.8.74

Configuração do Pipeline no Jenkins

Para tornar o processo flexível, utiliza-se a Construção Parametrizada. Isso permite que o operador escolha quais módulos deseja compilar e implantar individualmente.

Parâmetros de Build

Defina uma variável do tipo "Extended Choice Parameter" ou similar para listar os módulos (ex: base-modules/service-auth:9304). O Jenkins usará esses valores para processar o build via Shell Script.

Agendamento de Builds (Cron)

O Jenkins utiliza uma sintaxe baseada em Cron com a adição do símbolo H (Hash) para distribuir a carga no servidor.

  • H/15 * * * *: Executa a cada 15 minutos.
  • H 22 * * 1-5: Executa todas as noites de segunda a sexta às 22h.
  • H 0 1 * *: Executa mensalmente no dia primeiro.

Comanods de Compilação Maven

Dependendo da necessidade, o comando de build pode variar entre o projeto completo ou módulos específicos:

# Build de módulos específicos selecionados via parâmetro
clean package -U -pl ${SELECTED_MODULES} -am -Dmaven.test.skip=true

# Build de toda a estrutura
clean package -U -Dmaven.test.skip=true

Automação via Shell Script

O script abaixo processa os parâmetros, remove containers antigos, constrói novas imagens e reinicia os serviços via Docker Compose.

#!/bin/bash
set -e

APP_PREFIX="my-project"

# Função para limpeza de recursos Docker
clear_docker_resource() {
    local target_name=$1
    if [ "$(docker ps -a -q -f name=${target_name})" ]; then
        echo "### Removendo container: ${target_name} ###"
        docker rm -f ${target_name}
    fi
}

# Processamento da lista de módulos
IFS=',' read -ra MODULE_LIST <<< "${base_modules}"

for entry in "${MODULE_LIST[@]}"; do
    # Extração de metadados do parâmetro
    module_path=$(echo "${entry%%:*}" | xargs)
    module_name=${module_path##*/}
    short_name=${module_path##*-}
    target_port=${entry##*:}
    
    container_id="${APP_PREFIX}-${short_name}"
    image_tag="${APP_PREFIX}-${module_name}"

    clear_docker_resource "$container_id"

    echo "### Iniciando Build da Imagem: ${image_tag} ###"
    docker build -t ${image_tag}:latest \
        --build-arg APP_FILE=./${module_path}/target/${module_name} \
        --build-arg APP_PORT=${target_port} .
done

echo "### Atualizando stack de containers ###"
docker-compose up -d
echo "### Deploy finalizado com sucesso ###"

Verificação

Após a execução do job no Jenkins, valide o status dos containers através do comando docker ps ou via logs do Docker Compose para garantir que todos os microserviços subiram corretamente na rede configurada.

Tags: Docker Jenkins microservices maven docker-compose

Publicado em 7-3 02:04