Update Jenkinsfile
This commit is contained in:
parent
7e25ef034c
commit
a438aa08df
1 changed files with 97 additions and 100 deletions
183
Jenkinsfile
vendored
183
Jenkinsfile
vendored
|
|
@ -1,144 +1,141 @@
|
||||||
pipeline {
|
pipeline {
|
||||||
agent any
|
agent any
|
||||||
|
|
||||||
|
parameters {
|
||||||
|
string(name: 'PROJECT_NAME', defaultValue: 'portal-app', description: 'Nome do projeto')
|
||||||
|
string(name: 'GIT_BRANCH', defaultValue: 'main', description: 'Branch')
|
||||||
|
}
|
||||||
|
|
||||||
environment {
|
environment {
|
||||||
DEPLOY_USER = "jenkins"
|
FORGEJO_HOST = '175.15.15.55'
|
||||||
DEPLOY_SERVER = "192.168.1.81"
|
PODMAN_HOST = '175.15.15.12'
|
||||||
IMAGE_NAME = "portal-app"
|
BASE_DIR = '/usr/app'
|
||||||
CONTAINER_NAME = "portal-app"
|
|
||||||
REMOTE_PATH = "/home/jenkins/app"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
stages {
|
stages {
|
||||||
|
|
||||||
stage('Testar Conexão SSH') {
|
stage('Sync Código no Podman Host') {
|
||||||
steps {
|
steps {
|
||||||
sshagent(credentials: ['chave-ssh-id']) {
|
sshagent(['root-ssh-key']) {
|
||||||
sh "ssh -o StrictHostKeyChecking=no ${DEPLOY_USER}@${DEPLOY_SERVER} 'echo Conexão SSH bem-sucedida!'"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stage('Ver chave pública usada') {
|
|
||||||
steps {
|
|
||||||
sshagent(credentials: ['chave-ssh-id']) {
|
|
||||||
sh 'ssh-add -L'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stage('Checkout Código (local, só para pegar commit hash)') {
|
|
||||||
steps {
|
|
||||||
git branch: 'main', url: 'https://forgeo-olymp.duckdns.org/rayankonecny/portal-app.git' // usando IP local por confiabilidade
|
|
||||||
script {
|
|
||||||
env.GIT_COMMIT = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim()
|
|
||||||
env.BUILD_TAG = "${env.BUILD_NUMBER}-${env.GIT_COMMIT}"
|
|
||||||
echo "BUILD_TAG definido como: ${env.BUILD_TAG}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stage('Clonar Projeto e Criar Dockerfile no Servidor') {
|
|
||||||
steps {
|
|
||||||
sshagent(credentials: ['chave-ssh-id']) {
|
|
||||||
script {
|
|
||||||
sh """
|
sh """
|
||||||
ssh -o StrictHostKeyChecking=no ${DEPLOY_USER}@${DEPLOY_SERVER} '
|
ssh root@${PODMAN_HOST} '
|
||||||
set -e
|
set -e
|
||||||
|
PROJECT_DIR=${BASE_DIR}/${params.PROJECT_NAME}
|
||||||
|
|
||||||
mkdir -p ${REMOTE_PATH}
|
mkdir -p \$PROJECT_DIR
|
||||||
git config --global --add safe.directory ${REMOTE_PATH}
|
mkdir -p \$PROJECT_DIR/.deploy
|
||||||
rm -rf ${REMOTE_PATH}
|
|
||||||
|
|
||||||
git clone https://forgeo-olymp.duckdns.org/rayankonecny/portal-app.git ${REMOTE_PATH}
|
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
|
||||||
|
'
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if [ -f ${REMOTE_PATH}/.env ]; then
|
stage('Detectar Mudanças') {
|
||||||
echo "[INFO] Removendo NODE_ENV do .env para evitar erro com Vite"
|
steps {
|
||||||
sed -i "/NODE_ENV/d" ${REMOTE_PATH}/.env
|
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
|
fi
|
||||||
|
|
||||||
cat <<EOF > ${REMOTE_PATH}/Dockerfile
|
echo "Commit anterior: \$PREV"
|
||||||
FROM node:18-alpine
|
echo "Commit atual: \$CURRENT"
|
||||||
|
|
||||||
WORKDIR /app
|
git diff --name-only \$PREV \$CURRENT > .deploy/changed_files || true
|
||||||
|
cat .deploy/changed_files
|
||||||
|
|
||||||
COPY package*.json ./
|
awk -F/ "/^services/ {print \\$2}" .deploy/changed_files | sort -u > .deploy/changed_services
|
||||||
|
cat .deploy/changed_services
|
||||||
RUN npm install
|
|
||||||
|
|
||||||
COPY . .
|
|
||||||
|
|
||||||
EXPOSE 5173
|
|
||||||
|
|
||||||
CMD ["npm", "run", "dev"]
|
|
||||||
EOF
|
|
||||||
'
|
'
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
stage('Build da Imagem Podman') {
|
stage('Build Inteligente (somente serviços alterados)') {
|
||||||
steps {
|
steps {
|
||||||
sshagent(credentials: ['chave-ssh-id']) {
|
sshagent(['root-ssh-key']) {
|
||||||
sh """
|
sh """
|
||||||
ssh -o StrictHostKeyChecking=no ${DEPLOY_USER}@${DEPLOY_SERVER} '
|
ssh root@${PODMAN_HOST} '
|
||||||
cd ${REMOTE_PATH} &&
|
set -e
|
||||||
podman build -t ${IMAGE_NAME}:${BUILD_TAG} -t ${IMAGE_NAME}:latest .
|
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('Parar e Remover Container Antigo') {
|
stage('Deploy Seletivo via podman-compose') {
|
||||||
steps {
|
steps {
|
||||||
sshagent(credentials: ['chave-ssh-id']) {
|
sshagent(['root-ssh-key']) {
|
||||||
sh """
|
sh """
|
||||||
ssh ${DEPLOY_USER}@${DEPLOY_SERVER} '
|
ssh root@${PODMAN_HOST} '
|
||||||
podman stop ${CONTAINER_NAME} || true &&
|
set -e
|
||||||
podman rm ${CONTAINER_NAME} || true
|
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('Deploy no Servidor') {
|
stage('Observabilidade') {
|
||||||
steps {
|
steps {
|
||||||
sshagent(credentials: ['chave-ssh-id']) {
|
sshagent(['root-ssh-key']) {
|
||||||
sh """
|
sh """
|
||||||
ssh ${DEPLOY_USER}@${DEPLOY_SERVER} '
|
ssh root@${PODMAN_HOST} '
|
||||||
podman run -d --network host --name ${CONTAINER_NAME} ${IMAGE_NAME}:${BUILD_TAG}
|
echo "Containers ativos:"
|
||||||
|
podman ps
|
||||||
'
|
'
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
stage('Verificar Status do Container') {
|
post {
|
||||||
steps {
|
success {
|
||||||
sshagent(credentials: ['chave-ssh-id']) {
|
echo "✅ Deploy inteligente concluído para ${params.PROJECT_NAME}"
|
||||||
sh """
|
}
|
||||||
ssh ${DEPLOY_USER}@${DEPLOY_SERVER} '
|
failure {
|
||||||
podman ps | grep ${CONTAINER_NAME} || echo "Container não encontrado"
|
echo "❌ Falha no deploy"
|
||||||
'
|
|
||||||
"""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stage('Limpeza de Imagens Antigas') {
|
|
||||||
steps {
|
|
||||||
sshagent(credentials: ['chave-ssh-id']) {
|
|
||||||
sh """
|
|
||||||
ssh ${DEPLOY_USER}@${DEPLOY_SERVER} '
|
|
||||||
podman image prune -f
|
|
||||||
'
|
|
||||||
"""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue