From 1bad00e25723ef0721263ee1306ddbc7b8dfb6a3 Mon Sep 17 00:00:00 2001 From: Eric Cabrel TIOGO Date: Sat, 22 Jun 2024 15:44:41 +0200 Subject: [PATCH] build: comment diff in the pull request --- .github/workflows/deploy-migration.yml | 174 ++++++++++++++++++++++++- 1 file changed, 170 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy-migration.yml b/.github/workflows/deploy-migration.yml index 96548a08..33a8cb30 100644 --- a/.github/workflows/deploy-migration.yml +++ b/.github/workflows/deploy-migration.yml @@ -13,7 +13,102 @@ on: - 'packages/domain/prisma/migrations/**' jobs: + migration-detail: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup pscale + uses: planetscale/setup-pscale-action@v1 + + - name: Set database branch name + run: echo "PSCALE_BRANCH_NAME=$(echo ${{ github.head_ref }} | tr -cd '[:alnum:]-'| tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV + + - name: Create deploy request on development branch + env: + PLANETSCALE_SERVICE_TOKEN_ID: ${{ secrets.PLANETSCALE_SERVICE_TOKEN_ID }} + PLANETSCALE_SERVICE_TOKEN: ${{ secrets.PLANETSCALE_SERVICE_TOKEN }} + run: | + pscale deploy-request create ${{ secrets.PLANETSCALE_DATABASE_NAME }} ${{ env.PSCALE_BRANCH_NAME }} \ + --org ${{ secrets.PLANETSCALE_ORG_NAME }} \ + --into dev \ + --notes "Apply changes to the dev branch" + + - name: Get deploy request number + env: + PLANETSCALE_SERVICE_TOKEN_ID: ${{ secrets.PLANETSCALE_SERVICE_TOKEN_ID }} + PLANETSCALE_SERVICE_TOKEN: ${{ secrets.PLANETSCALE_SERVICE_TOKEN }} + run: | + DEPLOY_REQUEST_NUMBER=$(pscale deploy-request show ${{ secrets.PLANETSCALE_DATABASE_NAME }} ${{ env.PSCALE_BRANCH_NAME }} --org ${{ secrets.PLANETSCALE_ORG_NAME }} -f json | jq -r '.number') + echo "DEPLOY_REQUEST_NUMBER=$DEPLOY_REQUEST_NUMBER" >> $GITHUB_ENV + + - name: Check deployment state + continue-on-error: false + env: + PLANETSCALE_SERVICE_TOKEN_ID: ${{ secrets.PLANETSCALE_SERVICE_TOKEN_ID }} + PLANETSCALE_SERVICE_TOKEN: ${{ secrets.PLANETSCALE_SERVICE_TOKEN }} + run: | + for i in {1..10}; do + DEPLOYMENT_STATE=$(pscale deploy-request show ${{ secrets.PLANETSCALE_ORG_NAME }} ${{ env.DEPLOY_REQUEST_NUMBER }} --org ${{ secrets.PLANETSCALE_ORG_NAME }} --format json | jq -r '.deployment_state') + echo "Deployment State: $DEPLOYMENT_STATE" + + if [ "$DEPLOYMENT_STATE" = "ready" ]; then + echo "Deployment state is ready. Continuing." + echo "DEPLOY_REQUEST_OPENED=true" >> $GITHUB_ENV + break + fi + + echo "Deployment state is not ready. Waiting 2 seconds before checking again." + sleep 2 + done + + - name: Collect the migration diff + continue-on-error: false + if: ${{ env.DEPLOY_REQUEST_OPENED }} + env: + PLANETSCALE_SERVICE_TOKEN_ID: ${{ secrets.PLANETSCALE_SERVICE_TOKEN_ID }} + PLANETSCALE_SERVICE_TOKEN: ${{ secrets.PLANETSCALE_SERVICE_TOKEN }} + run: | + deploy_data=$(pscale api organizations/${{ secrets.PLANETSCALE_ORG_NAME }}/databases/${{ secrets.PLANETSCALE_DATABASE_NAME }}/deploy-requests/${{ env.DEPLOY_REQUEST_NUMBER }}/deployment --org planetscale) + can_drop_data=$(echo "$deploy_data" | jq -r '.deploy_operations[] | select(.can_drop_data == true) | .can_drop_data') + + + echo "Deploy request opened: https://app.planetscale.com/${{ secrets.PLANETSCALE_ORG_NAME }}/${{ secrets.PLANETSCALE_DATABASE_NAME }}/deploy-requests/${{ env.DEPLOY_REQUEST_NUMBER }}" >> migration-message.txt + echo "" >> migration-message.txt + + + if [ "$can_drop_data" = "true" ]; then + echo ":rotating_light: You are dropping a column. Before running the migration make sure to do the following:" >> migration-message.txt + echo "" >> migration-message.txt + + + echo "1. [ ] Deploy app changes to ensure the column is no longer being used." >> migration-message.txt + echo "2. [ ] Once you've verified it's no used, run the deploy request." >> migration-message.txt + echo "" >> migration-message.txt + else + echo "When adding to the schema, the Deploy Request must be run **before** the code is deployed." >> migration-message.txt + echo "Please ensure your schema changes are compatible with the application code currently running in production." >> migration-message.txt + echo "" >> migration-message.txt + + + echo "1. [ ] Successfully run the Deploy Request" >> migration-message.txt + echo "2. [ ] Deploy this PR" >> migration-message.txt + echo "" >> migration-message.txt + fi + + + echo "\`\`\`diff" >> migration-message.txt + pscale deploy-request diff ${{ secrets.PLANETSCALE_ORG_NAME }} ${{ env.DEPLOY_REQUEST_NUMBER }} -f json | jq -r '.[].raw' >> migration-message.txt + echo "\`\`\`" >> migration-message.txt + + - name: Comment pull request with the migration diff + uses: thollander/actions-comment-pull-request@v2 + if: ${{ env.DEPLOY_REQUEST_OPENED }} + with: + filePath: migration-message.txt + apply-migration: + if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -24,12 +119,83 @@ jobs: - name: Set database branch name run: echo "PSCALE_BRANCH_NAME=$(echo ${{ github.head_ref }} | tr -cd '[:alnum:]-'| tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV - - name: Apply migration + - name: Apply migration in Production + env: + PLANETSCALE_SERVICE_TOKEN_ID: ${{ secrets.PLANETSCALE_SERVICE_TOKEN_ID }} + PLANETSCALE_SERVICE_TOKEN: ${{ secrets.PLANETSCALE_SERVICE_TOKEN }} + run: | + pscale deploy-request create ${{ secrets.PLANETSCALE_DATABASE_NAME }} ${{ env.PSCALE_BRANCH_NAME }} \ + --into main \ + --notes "Deploy migration to production branch" + + - name: Get the deploy request number env: PLANETSCALE_SERVICE_TOKEN_ID: ${{ secrets.PLANETSCALE_SERVICE_TOKEN_ID }} PLANETSCALE_SERVICE_TOKEN: ${{ secrets.PLANETSCALE_SERVICE_TOKEN }} run: | - echo "$PSCALE_BRANCH_NAME" - echo "what is this" - echo "${{ env.PSCALE_BRANCH_NAME }}" + DEPLOY_REQUEST_NUMBER=$(pscale deploy-request show ${{ secrets.PLANETSCALE_DATABASE_NAME }} ${{ env.PSCALE_BRANCH_NAME }} --org ${{ secrets.PLANETSCALE_ORG_NAME }} -f json | jq -r '.number') + echo "DEPLOY_REQUEST_NUMBER=$DEPLOY_REQUEST_NUMBER" >> $GITHUB_ENV + - name: Check deployment state + id: check-state + env: + PLANETSCALE_SERVICE_TOKEN_ID: ${{ secrets.PLANETSCALE_SERVICE_TOKEN_ID }} + PLANETSCALE_SERVICE_TOKEN: ${{ secrets.PLANETSCALE_SERVICE_TOKEN }} + run: | + for i in {1..10}; do + DEPLOYMENT_STATE=$(pscale deploy-request show ${{ secrets.PLANETSCALE_ORG_NAME }} ${{ env.DEPLOY_REQUEST_NUMBER }} --org ${{ secrets.PLANETSCALE_ORG_NAME }} --format json | jq -r '.deployment_state') + echo "Deployment State: $DEPLOYMENT_STATE" + + if [ "$DEPLOYMENT_STATE" = "ready" ]; then + echo "Deployment state is ready. Continuing." + echo "DEPLOY_REQUEST_OPENED=true" >> $GITHUB_ENV + break + fi + + echo "Deployment state is not ready. Waiting 2 seconds before checking again." + sleep 2 + done + + - name: Deploy schema migrations + continue-on-error: false + env: + PLANETSCALE_SERVICE_TOKEN_ID: ${{ secrets.PLANETSCALE_SERVICE_TOKEN_ID }} + PLANETSCALE_SERVICE_TOKEN: ${{ secrets.PLANETSCALE_SERVICE_TOKEN }} + run: | + pscale deploy-request deploy ${{ secrets.PLANETSCALE_DATABASE_NAME }} ${{ env.DEPLOY_REQUEST_NUMBER }} --org ${{ secrets.PLANETSCALE_ORG_NAME }} --wait + + - name: Apply migration in Development + continue-on-error: false + env: + PLANETSCALE_SERVICE_TOKEN_ID: ${{ secrets.PLANETSCALE_SERVICE_TOKEN_ID }} + PLANETSCALE_SERVICE_TOKEN: ${{ secrets.PLANETSCALE_SERVICE_TOKEN }} + run: | + pscale deploy-request create ${{ secrets.PLANETSCALE_DATABASE_NAME }} ${{ env.PSCALE_BRANCH_NAME }} \ + --into dev \ + --notes "Deploy migration to development branch" + + DEV_DEPLOY_REQUEST_NUMBER=$(pscale deploy-request show ${{ secrets.PLANETSCALE_DATABASE_NAME }} ${{ env.PSCALE_BRANCH_NAME }} --org ${{ secrets.PLANETSCALE_ORG_NAME }} -f json | jq -r '.number') + + for i in {1..10}; do + DEPLOYMENT_STATE=$(pscale deploy-request show ${{ secrets.PLANETSCALE_ORG_NAME }} $DEV_DEPLOY_REQUEST_NUMBER --org ${{ secrets.PLANETSCALE_ORG_NAME }} --format json | jq -r '.deployment_state') + echo "Deployment State: $DEPLOYMENT_STATE" + + if [ "$DEPLOYMENT_STATE" = "ready" ]; then + echo "Deployment state is ready. Continuing." + + break + fi + + echo "Deployment state is not ready. Waiting 2 seconds before checking again." + sleep 2 + done + + pscale deploy-request deploy ${{ secrets.PLANETSCALE_DATABASE_NAME }} $DEV_DEPLOY_REQUEST_NUMBER --org ${{ secrets.PLANETSCALE_ORG_NAME }} --wait + + - name: Delete the database branch + env: + PLANETSCALE_SERVICE_TOKEN_ID: ${{ secrets.PLANETSCALE_SERVICE_TOKEN_ID }} + PLANETSCALE_SERVICE_TOKEN: ${{ secrets.PLANETSCALE_SERVICE_TOKEN }} + run: | + pscale branch delete ${{ secrets.PLANETSCALE_DATABASE_NAME }} ${{ env.PSCALE_BRANCH_NAME }} --org ${{ secrets.PLANETSCALE_ORG_NAME }} --force + echo "The branch \"${{ env.PSCALE_BRANCH_NAME }}\" has been successfully."