# .gitea/workflows/deploy.yml name: Build and Deploy JobMaker on: push: branches: [ main ] pull_request: branches: [ main ] env: REGISTRY: registry.redecarneir.us IMAGE_NAME: jobmaker-website DEPLOY_HOST: 92.246.130.58 DEPLOY_USER: root CONTAINER_NAME: jobmaker-web jobs: build: runs-on: ubuntu-latest steps: - name: πŸ“₯ Checkout code uses: actions/checkout@v4 - name: 🐳 Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: 🏷️ Generate tags id: meta run: | echo "VERSION=v$(date +%Y%m%d)-${GITHUB_SHA::8}" >> $GITHUB_OUTPUT echo "LATEST_TAG=${REGISTRY}/${IMAGE_NAME}:latest" >> $GITHUB_OUTPUT echo "VERSION_TAG=${REGISTRY}/${IMAGE_NAME}:v$(date +%Y%m%d)-${GITHUB_SHA::8}" >> $GITHUB_OUTPUT - name: πŸ”¨ Build Docker image run: | echo "πŸ”¨ Building Docker image..." docker build \ -t ${{ steps.meta.outputs.LATEST_TAG }} \ -t ${{ steps.meta.outputs.VERSION_TAG }} \ . - name: πŸ§ͺ Test container run: | echo "πŸ§ͺ Testing container..." # Verificar se porta 8083 estΓ‘ livre echo "πŸ” Checking port 8083..." if ss -tulpn | grep :8083; then echo "⚠️ Port 8083 is in use, stopping conflicting containers..." docker ps --filter "publish=8083" -q | xargs -r docker stop docker ps -a --filter "publish=8083" -q | xargs -r docker rm sleep 2 fi # Usar nome ΓΊnico CONTAINER_NAME="test-container-$(date +%s)" echo "πŸš€ Starting test container: $CONTAINER_NAME on port 8083" # Iniciar container de teste docker run -d --name $CONTAINER_NAME -p 8083:80 ${{ steps.meta.outputs.LATEST_TAG }} # Aguardar inicializaΓ§Γ£o echo "⏳ Waiting for container..." sleep 15 # Verificar se container estΓ‘ rodando if ! docker ps | grep $CONTAINER_NAME; then echo "❌ Container not running" docker logs $CONTAINER_NAME 2>/dev/null || true docker stop $CONTAINER_NAME 2>/dev/null || true docker rm $CONTAINER_NAME 2>/dev/null || true exit 1 fi # Teste interno echo "πŸ” Testing nginx internally..." if docker exec $CONTAINER_NAME wget -q --spider http://localhost/; then echo "βœ… Internal test passed" else echo "❌ Internal test failed" docker logs $CONTAINER_NAME docker stop $CONTAINER_NAME 2>/dev/null || true docker rm $CONTAINER_NAME 2>/dev/null || true exit 1 fi # Teste externo echo "πŸ” Testing external connectivity on port 8083..." if curl -f http://localhost:8083/ --max-time 10; then echo "βœ… External test passed" else echo "⚠️ External test failed (but internal passed)" fi # Limpeza echo "🧹 Cleaning up test container..." docker stop $CONTAINER_NAME docker rm $CONTAINER_NAME echo "βœ… Container tests passed!" - name: πŸ“€ Push to registry run: | echo "πŸ“€ Pushing to registry..." docker push ${{ steps.meta.outputs.LATEST_TAG }} docker push ${{ steps.meta.outputs.VERSION_TAG }} echo "βœ… Images pushed successfully!" deploy: needs: build runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' steps: - name: πŸ”‘ Setup SSH run: | mkdir -p ~/.ssh echo "${{ secrets.DEPLOY_SSH_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ssh-keyscan -H ${{ env.DEPLOY_HOST }} >> ~/.ssh/known_hosts - name: πŸš€ Deploy to server run: | echo "πŸš€ Starting deployment..." ssh ${{ env.DEPLOY_USER }}@${{ env.DEPLOY_HOST }} << 'EOF' set -e echo "πŸ“₯ Pulling latest image..." docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest echo "πŸ›‘ Stopping current container..." docker stop ${{ env.CONTAINER_NAME }} || true docker rm ${{ env.CONTAINER_NAME }} || true echo "πŸš€ Starting new container on port 8083..." docker run -d \ --name ${{ env.CONTAINER_NAME }} \ --restart unless-stopped \ -p 8083:80 \ ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest echo "πŸ§ͺ Testing deployment..." sleep 5 # Testar se estΓ‘ respondendo na porta 8083 curl -f http://localhost:8083/ || exit 1 echo "🧹 Cleaning up old images..." docker image prune -f echo "βœ… Deployment completed successfully!" EOF - name: πŸ“Š Deployment status run: | echo "πŸ“Š Checking deployment status..." ssh ${{ env.DEPLOY_USER }}@${{ env.DEPLOY_HOST }} << 'EOF' echo "=== Container Status ===" docker ps | grep ${{ env.CONTAINER_NAME }} echo "=== Container Logs (last 20 lines) ===" docker logs --tail 20 ${{ env.CONTAINER_NAME }} echo "=== Disk Usage ===" df -h echo "=== Docker Images ===" docker images | grep ${{ env.IMAGE_NAME }} EOF notify: needs: [build, deploy] runs-on: ubuntu-latest if: always() steps: - name: πŸ“’ Notify deployment result run: | if [[ "${{ needs.deploy.result }}" == "success" ]]; then echo "πŸŽ‰ Deployment successful!" echo "βœ… JobMaker is live at: http://${{ env.DEPLOY_HOST }}" echo "βœ… English version: http://${{ env.DEPLOY_HOST }}/en/" else echo "❌ Deployment failed!" echo "Check the logs above for details." exit 1 fi