name: Build and Deploy PHP with Docker Compose
on:
push:
tags:
- 'v*' # Isso faz com que a pipeline dispare somente para commits com tags que comecem com 'v'
branches:
- main # Deploy para produção
- develop # Deploy para staging
jobs:
build:
runs-on: ubuntu-latest
steps:
# Verifica o código do repositório
- name: Check out the repository
uses: actions/checkout@v3
# Instala o ggshield para verificação de segredos
- name: Install ggshield
run: pip install --user ggshield
# Verifica o repositório por segredos expostos
- name: Scan repository for secrets with ggshield
run: ~/.local/bin/ggshield scan repo .
env:
GITGUARDIAN_API_KEY: ${{ secrets.GITGUARDIAN_API_KEY }}
# Configura o Docker no ambiente
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 8.3
extensions: mbstring, pdo, curl # Adicione outras extensões PHP que seu projeto precisa
# Configura o cache das dependências do Composer
- name: Cache Composer dependencies
uses: actions/cache@v3
with:
path: ~/.composer/cache
key: ${{ runner.os }}-composer-${{ hashFiles('composer.lock') }}
restore-keys: |
${{ runner.os }}-composer-
# Atualiza as dependências do Composer localmente
- name: Install dependencies locally
run: composer install --prefer-dist --no-progress
# Configura a chave SSH
- name: Setup SSH Key
uses: webfactory/
[email protected]
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
# Adiciona o servidor ao arquivo known_hosts
- name: Setup SSH Host
run: |
mkdir -p ~/.ssh
ssh-keyscan -H ${{ secrets.SERVER_IP }} >> ~/.ssh/known_hosts
# Cria um backup antes do deploy
- name: Backup current version
run: |
ssh root@${{ secrets.SERVER_IP }} << 'EOF'
ls -l ${{ secrets.DEPLOY_PATH }} # Listar o conteúdo do diretório
if [ -d "${{ secrets.DEPLOY_PATH }}" ] && [ "$(ls -A ${{ secrets.DEPLOY_PATH }})" ]; then
tar -czf ${{ secrets.BACKUP_PATH }}/php-$(date +%Y%m%d%H%M%S).tar.gz -C ${{ secrets.DEPLOY_PATH }} .
else
echo "Diretório não encontrado ou está vazio. Backup não realizado."
exit 1
fi
EOF
if: success()
# Envia os arquivos para o servidor via SSH
- name: Deploy Docker containers to server via SSH
run: |
ssh root@${{ secrets.SERVER_IP }} << 'EOF'
cd ${{ secrets.DEPLOY_PATH }}
git restore . # Desfaz alterações locais não comitadas
git pull origin main # Puxa as últimas atualizações do repositório
composer update --no-progress --prefer-dist
docker compose -f ${{ secrets.DOCKER_COMPOSE_FILE }} up -d --build
EOF
if: success()
# Limpar cache do Cloudflare (CDN + DNS)
- name: Clear Cloudflare Cache (CDN + DNS)
run: |
curl -X POST "https://api.cloudflare.com/client/v4/zones/${{ secrets.CLOUDFLARE_ZONE_ID }}/purge_cache" \
-H "Authorization: Bearer ${{ secrets.CLOUDFLARE_API_TOKEN }}" \
-H "Content-Type: application/json" \
-d '{"purge_everything":true}'
# Teste pós-deploy (Smoke Test)
- name: Post-deploy Smoke Test
run: |
curl -f http://${{ secrets.SERVER_IP }} || exit 1
if: success()
# Rollback em caso de falha
- name: Rollback to previous version
if: failure()
run: |
ssh root@${{ secrets.SERVER_IP }} << 'EOF'
latest_backup=$(ls -t ${{ secrets.BACKUP_PATH }}/php-*.tar.gz | head -n 1)
tar -xzf $latest_backup -C ${{ secrets.DEPLOY_PATH }}
EOF
# Envia notificação ao Discord (Sucesso)
- name: Notify success
if: success()
run: |
curl -X POST -H "Content-Type: application/json" \
-d '{"content": "? Deploy realizado com sucesso no servidor ${{ secrets.SERVER_IP }}!"}' \
${{ secrets.DISCORD_WEBHOOK_URL }}
# Envia notificação ao Discord (Falha)
- name: Notify failure
if: failure()
run: |
curl -X POST -H "Content-Type: application/json" \
-d "{\"content\": \"? Deploy falhou. Verifique os logs!\"}" \
${{ secrets.DISCORD_WEBHOOK_URL }}