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()