pipeline { agent any parameters { string(name: 'PROJECT_NAME', defaultValue: 'portal-app', description: 'Nome do projeto') string(name: 'GIT_BRANCH', defaultValue: 'main', description: 'Branch') } environment { FORGEJO_HOST = '175.15.15.55' PODMAN_HOST = '175.15.15.12' BASE_DIR = '/usr/app' } stages { stage('Sync Código no Podman Host') { steps { sshagent(['root-ssh-key']) { sh """ ssh root@${PODMAN_HOST} ' set -e PROJECT_DIR=${BASE_DIR}/${params.PROJECT_NAME} mkdir -p \$PROJECT_DIR mkdir -p \$PROJECT_DIR/.deploy if [ ! -d "\$PROJECT_DIR/.git" ]; then git clone -b ${params.GIT_BRANCH} ssh://root@${FORGEJO_HOST}:/rayankonecny/portal-app.git \$PROJECT_DIR else cd \$PROJECT_DIR git fetch origin git reset --hard origin/${params.GIT_BRANCH} fi ' """ } } } stage('Detectar Mudanças') { steps { sshagent(['root-ssh-key']) { sh """ ssh root@${PODMAN_HOST} ' set -e cd ${BASE_DIR}/${params.PROJECT_NAME} LAST_FILE=.deploy/last_commit CURRENT=\$(git rev-parse HEAD) if [ -f \$LAST_FILE ]; then PREV=\$(cat \$LAST_FILE) else PREV="" fi echo "Commit anterior: \$PREV" echo "Commit atual: \$CURRENT" git diff --name-only \$PREV \$CURRENT > .deploy/changed_files || true cat .deploy/changed_files awk -F/ "/^services/ {print \\$2}" .deploy/changed_files | sort -u > .deploy/changed_services cat .deploy/changed_services ' """ } } } stage('Build Inteligente (somente serviços alterados)') { steps { sshagent(['root-ssh-key']) { sh """ ssh root@${PODMAN_HOST} ' set -e cd ${BASE_DIR}/${params.PROJECT_NAME} if [ ! -s .deploy/changed_services ]; then echo "Nenhum serviço alterado. Pulando build." exit 0 fi while read SERVICE; do echo "🔨 Buildando serviço: \$SERVICE" podman build -t ${params.PROJECT_NAME}-\$SERVICE:latest services/\$SERVICE done < .deploy/changed_services ' """ } } } stage('Deploy Seletivo via podman-compose') { steps { sshagent(['root-ssh-key']) { sh """ ssh root@${PODMAN_HOST} ' set -e cd ${BASE_DIR}/${params.PROJECT_NAME} if [ -s .deploy/changed_services ]; then while read SERVICE; do echo "🚀 Reiniciando serviço: \$SERVICE" podman-compose up -d --no-deps --build \$SERVICE done < .deploy/changed_services else echo "Nada para subir" fi git rev-parse HEAD > .deploy/last_commit ' """ } } } stage('Observabilidade') { steps { sshagent(['root-ssh-key']) { sh """ ssh root@${PODMAN_HOST} ' echo "Containers ativos:" podman ps ' """ } } } } post { success { echo "✅ Deploy inteligente concluído para ${params.PROJECT_NAME}" } failure { echo "❌ Falha no deploy" } } }