name: PR Deployment cleanup on: pull_request_target: types: [opened, synchronize, reopened, closed] permissions: contents: read env: SERVER_IP: ${{ secrets.VPS_IP }} # Add this to your GitHub secrets CLEANUP_PERFORMED: "false" # Add flag to track if cleanup occurred jobs: cleanup: if: github.event.action == 'closed' runs-on: ubuntu-latest permissions: pull-requests: write issues: write steps: - name: Harden Runner uses: step-security/harden-runner@6c439dc8bdf85cadbbce9ed30d1c7b959517bc49 # v2.12.2 with: egress-policy: audit - name: Checkout PR uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup GitHub App Bot if: github.actor != 'dependabot[bot]' id: setup-bot uses: ./.github/actions/setup-bot continue-on-error: true with: app-id: ${{ secrets.GH_APP_ID }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} - name: Remove 'pr-deployed' label if present id: remove-label-comment uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: github-token: ${{ steps.setup-bot.outputs.token }} script: | const prNumber = ${{ github.event.pull_request.number }}; const owner = context.repo.owner; const repo = context.repo.repo; // Hole alle Labels auf dem PR const { data: labels } = await github.rest.issues.listLabelsOnIssue({ owner, repo, issue_number: prNumber }); const hasLabel = labels.some(label => label.name === 'pr-deployed'); if (hasLabel) { console.log("Label 'pr-deployed' found. Removing..."); await github.rest.issues.removeLabel({ owner, repo, issue_number: prNumber, name: 'pr-deployed' }); } else { console.log("Label 'pr-deployed' not found. Nothing to do."); } // Find existing comment const comments = await github.rest.issues.listComments({ owner, repo, issue_number: prNumber }); const deploymentComments = comments.data.filter(c => c.body?.includes("## 🚀 PR Test Deployment") && c.user?.type === "Bot" ); if (deploymentComments.length > 0) { for (const comment of deploymentComments) { await github.rest.issues.deleteComment({ owner, repo, comment_id: comment.id }); console.log(`Deleted deployment comment (ID: ${comment.id})`); } } else { console.log("No matching deployment comments found."); } core.setOutput('present', hasLabel || deploymentComment ? 'true' : 'false'); - name: Set up SSH if: steps.remove-label-comment.outputs.present == 'true' run: | mkdir -p ~/.ssh/ echo "${{ secrets.VPS_SSH_KEY }}" > ../private.key sudo chmod 600 ../private.key - name: Cleanup PR deployment if: steps.remove-label-comment.outputs.present == 'true' id: cleanup run: | ssh -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -T ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_HOST }} << 'ENDSSH' if [ -d "/stirling/PR-${{ github.event.pull_request.number }}" ]; then echo "Found PR directory, proceeding with cleanup..." # Stop and remove containers cd /stirling/PR-${{ github.event.pull_request.number }} docker-compose down || true # Go back to root before removal cd / # Remove PR-specific directories rm -rf /stirling/PR-${{ github.event.pull_request.number }} # Remove the Docker image docker rmi --no-prune ${{ secrets.DOCKER_HUB_USERNAME }}/test:pr-${{ github.event.pull_request.number }} || true echo "PERFORMED_CLEANUP" else echo "PR directory not found, nothing to clean up" echo "NO_CLEANUP_NEEDED" fi ENDSSH - name: Cleanup temporary files if: always() run: | echo "Cleaning up temporary files..." rm -f ../private.key echo "Cleanup complete." continue-on-error: true