216 lines
8 KiB
YAML
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()
|