sitewww/.forgejo/workflows/deploy.yml
Marcos A. Lucas be45bff4e2
Some checks failed
Deploy para Servidor de Produção / Determinar ambiente de destino (push) Successful in 1s
Deploy para Servidor de Produção / Deploy para (push) Failing after 7s
fix bug deploy.yml
2025-06-23 02:00:28 -03:00

216 lines
8 KiB
YAML

name: Deploy para Servidor de Produção
on:
push:
branches:
- main # Branch de produção
- dev # Branch de desenvolvimento
paths-ignore:
- 'README.md' # Ignora mudanças apenas no README
- '.gitignore'
- 'docs/**'
# Variáveis de ambiente globais do workflow
env:
# Definimos os caminhos base para cada ambiente
PROD_PATH: "/dados/sitewww/public.www"
DEV_PATH: "/dados/sitewww/public.dev"
jobs:
# Job que determina qual ambiente será deployado
prepare:
runs-on: docker
name: Determinar ambiente de destino
outputs:
environment: ${{ steps.detect-env.outputs.environment }}
deploy-path: ${{ steps.detect-env.outputs.deploy-path }}
should-deploy: ${{ steps.detect-env.outputs.should-deploy }}
steps:
- name: Detectar ambiente baseado na branch
id: detect-env
run: |
echo "Analisando branch: ${{ github.ref_name }}"
if [ "${{ github.ref_name }}" = "main" ]; then
# Se for a branch main, é ambiente de produção
echo "environment=production" >> $GITHUB_OUTPUT
echo "deploy-path=${{ env.PROD_PATH }}" >> $GITHUB_OUTPUT
echo "should-deploy=true" >> $GITHUB_OUTPUT
echo "Ambiente detectado: PRODUÇÃO"
echo "Destino: ${{ env.PROD_PATH }}"
elif [ "${{ github.ref_name }}" = "dev" ]; then
# Se for a branch dev, é ambiente de desenvolvimento
echo "environment=development" >> $GITHUB_OUTPUT
echo "deploy-path=${{ env.DEV_PATH }}" >> $GITHUB_OUTPUT
echo "should-deploy=true" >> $GITHUB_OUTPUT
echo "Ambiente detectado: DESENVOLVIMENTO"
echo "Destino: ${{ env.DEV_PATH }}"
else
# Se for qualquer outra branch, não faz deploy
echo "environment=unknown" >> $GITHUB_OUTPUT
echo "deploy-path=" >> $GITHUB_OUTPUT
echo "should-deploy=false" >> $GITHUB_OUTPUT
echo "Branch não reconhecida para deploy: ${{ github.ref_name }}"
fi
deploy:
needs: prepare
if: needs.prepare.outputs.should-deploy == 'true'
runs-on: docker
name: Deploy para ${{ needs.prepare.outputs.environment }}
# Condição adicional para evitar deploys em commits específicos
env:
# Variáveis vindas do job anterior
TARGET_ENV: ${{ needs.prepare.outputs.environment }}
TARGET_PATH: ${{ needs.prepare.outputs.deploy-path }}
# Sequência de passos do job
steps:
- name: Checkout do código
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Exibir informações do deploy
run: |
echo "INFORMAÇÕES DO DEPLOY"
echo "=========================="
echo "Branch: ${{ github.ref_name }}"
echo "Ambiente: ${{ env.TARGET_ENV }}"
echo "Destino: ${{ env.TARGET_PATH }}"
echo "Commit: ${{ github.sha }}"
echo "Autor: ${{ github.actor }}"
echo "Data: $(date)"
echo "=========================="
- name: Verificar estrutura do projeto
run: |
echo "Verificando estrutura do projeto..."
# Verifica se existe index.html
if [ ! -f "index.html" ]; then
echo "Erro: index.html não encontrado!"
exit 1
fi
# Lista arquivos principais
echo "Arquivos encontrados:"
find . -name "*.html" -o -name "*.css" -o -name "*.js"
if [ "${{ env.TARGET_ENV }}" = "production" ]; then
echo "Validações para PRODUÇÃO:"
# Aqui você pode adicionar validações específicas para produção
if grep -r "console.log" . --include="*.js"; then
echo "Aviso: Encontrados console.log no código (considere remover para produção)"
fi
else
echo "Validações para DESENVOLVIMENTO:"
# Validações menos rigorosas para desenvolvimento
echo "Ambiente de desenvolvimento - validações flexíveis aplicadas"
fi
echo "Estrutura validada com sucesso!"
- name: Configurar SSH
run: |
echo "Configurando conexão SSH..."
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "${{ secrets.DEPLOY_SSH_KEY }}" > ~/.ssh/deploy_key
chmod 600 ~/.ssh/deploy_key
ssh-keyscan -H ${{ secrets.DEPLOY_HOST }} >> ~/.ssh/known_hosts
echo "SSH configurado com sucesso!"
- name: Testar conexão com servidor
run: |
echo "Testando conexão SSH..."
ssh -i ~/.ssh/deploy_key \
-o StrictHostKeyChecking=no \
${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }} \
"echo 'Conexão SSH funcionando! Servidor:' && hostname && date"
- name: Preparar diretório no servidor
run: |
echo "Preparando diretório de destino: ${{ env.TARGET_PATH }}"
ssh -i ~/.ssh/deploy_key \
${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }} \
"mkdir -p ${{ env.TARGET_PATH }} && \
echo 'Diretório criado/verificado: ${{ env.TARGET_PATH }}' && \
ls -la $(dirname ${{ env.TARGET_PATH }})"
- name: Backup do site atual
run: |
echo "Criando backup do ambiente ${{ env.TARGET_ENV }}..."
BACKUP_NAME="backup-${{ env.TARGET_ENV }}-$(date +%Y%m%d-%H%M%S).tar.gz"
ssh -i ~/.ssh/deploy_key \
${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }} \
"cd $(dirname ${{ env.TARGET_PATH }}) && \
if [ -d ${{ env.TARGET_PATH }} ]; then \
tar -czf \$BACKUP_NAME $(basename ${{ env.TARGET_PATH }}) && \
echo 'Backup criado: \$BACKUP_NAME'; \
else \
echo 'Primeiro deploy para este ambiente - sem backup necessário'; \
fi && \
ls -lart backup-${{ env.TARGET_ENV }}-*.tar.gz 2>/dev/null | tail -5 || echo 'Nenhum backup anterior encontrado'" # Mostra os 5 backups mais recentes
- name: Deploy dos arquivos
run: |
echo "Iniciando deploy para ${{ env.TARGET_ENV }}..."
echo "Destino: ${{ env.TARGET_PATH }}"
rsync -avz \
--exclude='.git*' \
--exclude='.forgejo' \
--exclude='node_modules' \
--exclude='*.md' \
--exclude='backup-*' \
--exclude='*.log' \
--exclude='debug*' \
-e "ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no" \
./ \
${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}:${{ env.TARGET_PATH }}/
echo "Deploy concluído!"
- name: Verificar deploy
run: |
echo "Verificando se o deploy foi bem-sucedido..."
# Verificar se os arquivos foram copiados
ssh -i ~/.ssh/deploy_key \
${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }} \
"echo 'Conteúdo do diretório ${{ env.TARGET_PATH }}:' && \
ls -la ${{ env.TARGET_PATH }}/ && \
echo '' && \
echo 'Tamanho do index.html:' && \
wc -l ${{ env.TARGET_PATH }}/index.html && \
echo '' && \
echo 'Espaço utilizado:' && \
du -sh ${{ env.TARGET_PATH }}"
echo "Verificação concluída!"
- name: Finalizar deploy
run: |
echo "Finalizando processo..."
# Limpar chave SSH da memória
rm -f ~/.ssh/deploy_key
echo "Deploy realizado com sucesso!"
echo "Data: $(date)"
echo "Commit: ${{ github.sha }}"
echo "Autor: ${{ github.actor }}"
# Este step sempre executa, mesmo se houver falha anterior
if: always()