From 1aa7134c52bf5f61d686508aae84eab095805487 Mon Sep 17 00:00:00 2001 From: aliakbar-deriv Date: Tue, 7 Jan 2025 21:20:04 +0400 Subject: [PATCH 1/7] ci: add Octomind integration to GitHub Actions workflows --- .github/workflows/deploy.yml | 111 ++++++++++++++++++-- .github/workflows/preview-deploy.yml | 146 +++++++++++++++++++++++++++ 2 files changed, 249 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/preview-deploy.yml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 10e4139..bb475ee 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,41 +1,102 @@ -name: Deploy to GitHub Pages +name: Deploy to Production on: push: branches: ['main'] - workflow_dispatch: + inputs: + environment: + description: 'Environment to deploy to' + required: true + default: 'production' + type: choice + options: + - production + - staging permissions: contents: read pages: write id-token: write + deployments: write +# Prevent concurrent deployments concurrency: - group: 'pages' - cancel-in-progress: true + group: "pages" + cancel-in-progress: false # Don't cancel production deployments + +env: + NODE_ENV: production jobs: + validate: + name: Validate Production Build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: 'npm' + + - name: Install dependencies + run: | + npm ci + id: npm-cache + env: + cache-name: cache-node-modules + with: + path: node_modules + key: ${{ runner.os }}-prod-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-prod-${{ env.cache-name }}- + ${{ runner.os }}-prod- + ${{ runner.os }}- + + - name: Production Build Test + run: npm run build + env: + VITE_APP_ENV: production + + - name: Run Tests + run: npm test -- --coverage + + - name: Cache build validation + uses: actions/cache@v3 + with: + path: dist + key: ${{ runner.os }}-prod-build-${{ github.sha }} + deploy: + name: Deploy to Production + needs: validate environment: - name: github-pages + name: ${{ github.event.inputs.environment || 'production' }} url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - - name: Set up Node + - name: Setup Node.js uses: actions/setup-node@v3 with: node-version: 18 cache: 'npm' - name: Install dependencies - run: npm install + run: npm ci - name: Build run: npm run build + env: + VITE_APP_ENV: production + NODE_ENV: production - name: Setup Pages uses: actions/configure-pages@v3 @@ -47,5 +108,39 @@ jobs: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v2 + uses: actions/deploy-pages@v2 + - name: Create Deployment Status + if: always() + uses: actions/github-script@v6 + with: + script: | + const { owner, repo } = context.repo; + const environment = '${{ github.event.inputs.environment || 'production' }}'; + const run_url = `https://github.com/${owner}/${repo}/actions/runs/${context.runId}`; + const status = `šŸš€ Deployment to ${environment} ${steps.deployment.outcome}`; + + await github.rest.repos.createDeploymentStatus({ + owner: owner, + repo: repo, + deployment_id: context.payload.deployment?.id, + state: steps.deployment.outcome === 'success' ? 'success' : 'failure', + environment_url: '${{ steps.deployment.outputs.page_url }}', + log_url: run_url, + description: status + }); + + - name: Notify on Failure + if: failure() + uses: actions/github-script@v6 + with: + script: | + const { owner, repo } = context.repo; + const run_url = `https://github.com/${owner}/${repo}/actions/runs/${context.runId}`; + const issue = await github.rest.issues.create({ + owner: owner, + repo: repo, + title: 'āŒ Production Deployment Failed', + body: `Deployment to production failed.\n\n[View Details](${run_url})`, + labels: ['deployment', 'bug'] + }); diff --git a/.github/workflows/preview-deploy.yml b/.github/workflows/preview-deploy.yml new file mode 100644 index 0000000..5167c73 --- /dev/null +++ b/.github/workflows/preview-deploy.yml @@ -0,0 +1,146 @@ +name: Deploy PR Preview + +on: + pull_request: + types: [opened, synchronize, reopened] + branches: ['main'] + +permissions: + contents: read + pages: write + id-token: write + pull-requests: write + security-events: write + +# Cancel in-progress runs for PRs +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + quality: + name: Code Quality + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 # Fetch all history for all branches and tags + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: 'npm' + + - name: Install dependencies + run: | + npm ci + # Cache the node_modules directory + id: npm-cache + env: + cache-name: cache-node-modules + with: + path: node_modules + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + + - name: Lint + run: npm run lint + continue-on-error: true + + - name: Type check + run: | + npm run typecheck || echo "Type check failed but continuing" + continue-on-error: true + + - name: Run unit tests + run: npm test + + preview_and_test: + name: Preview Deploy & E2E + needs: quality + runs-on: ubuntu-latest + environment: + name: pr-preview + url: ${{ steps.deployment.outputs.page_url }} + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Build + run: npm run build + env: + VITE_APP_ENV: preview + + - name: Cache build output + uses: actions/cache@v3 + with: + path: dist + key: ${{ runner.os }}-build-${{ github.sha }} + + - name: Setup Pages + uses: actions/configure-pages@v3 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v2 + with: + path: './dist' + + - name: Deploy PR Preview + id: deployment + uses: actions/deploy-pages@v2 + with: + preview: true + + - name: Comment PR + uses: actions/github-script@v6 + with: + script: | + const url = `${{ steps.deployment.outputs.page_url }}`; + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: `šŸš€ Preview URL: ${url}` + }); + + - name: Run E2E tests + id: e2e + uses: OctoMind-dev/automagically-action-execute@v2 + with: + url: ${{ steps.deployment.outputs.page_url }} + token: ${{ secrets.AUTOMAGICALLY_TOKEN }} + testTargetId: ${{ secrets.AUTOMAGICALLY_TEST_TARGET_ID }} + blocking: true + + - name: Report Status + if: always() + uses: actions/github-script@v6 + with: + script: | + const { owner, repo } = context.repo; + const run_id = context.runId; + const run_url = `https://github.com/${owner}/${repo}/actions/runs/${run_id}`; + const status = `${process.env.GITHUB_WORKFLOW} workflow ${context.job} job status: ${steps.e2e.outcome}`; + const body = `### Workflow Status\n${status}\n[View Run Details](${run_url})`; + + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: owner, + repo: repo, + body: body + }); From eddb9fd14c598b4d0eae8d74b68d9f1ea54c997a Mon Sep 17 00:00:00 2001 From: aliakbar-deriv Date: Tue, 7 Jan 2025 21:28:37 +0400 Subject: [PATCH 2/7] feat: add secret validation checks before E2E tests --- .github/workflows/preview-deploy.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/preview-deploy.yml b/.github/workflows/preview-deploy.yml index 5167c73..673296d 100644 --- a/.github/workflows/preview-deploy.yml +++ b/.github/workflows/preview-deploy.yml @@ -118,6 +118,17 @@ jobs: body: `šŸš€ Preview URL: ${url}` }); + - name: Check required secrets + run: | + if [ -z "${{ secrets.AUTOMAGICALLY_TOKEN }}" ]; then + echo "::error::Missing required secret: AUTOMAGICALLY_TOKEN" + exit 1 + fi + if [ -z "${{ secrets.AUTOMAGICALLY_TEST_TARGET_ID }}" ]; then + echo "::error::Missing required secret: AUTOMAGICALLY_TEST_TARGET_ID" + exit 1 + fi + - name: Run E2E tests id: e2e uses: OctoMind-dev/automagically-action-execute@v2 From b7a15488a842d92dd1223413b2d4c41509959b04 Mon Sep 17 00:00:00 2001 From: aliakbar-deriv Date: Wed, 8 Jan 2025 12:06:07 +0400 Subject: [PATCH 3/7] fix: correct node_modules caching in preview-deploy workflow --- .github/workflows/preview-deploy.yml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/.github/workflows/preview-deploy.yml b/.github/workflows/preview-deploy.yml index 673296d..bdcc873 100644 --- a/.github/workflows/preview-deploy.yml +++ b/.github/workflows/preview-deploy.yml @@ -33,20 +33,18 @@ jobs: node-version: 18 cache: 'npm' - - name: Install dependencies - run: | - npm ci - # Cache the node_modules directory + - name: Cache node_modules + uses: actions/cache@v3 id: npm-cache - env: - cache-name: cache-node-modules with: path: node_modules - key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + key: ${{ runner.os }}-node-modules-${{ hashFiles('**/package-lock.json') }} restore-keys: | - ${{ runner.os }}-build-${{ env.cache-name }}- - ${{ runner.os }}-build- - ${{ runner.os }}- + ${{ runner.os }}-node-modules- + + - name: Install dependencies + if: steps.npm-cache.outputs.cache-hit != 'true' + run: npm ci - name: Lint run: npm run lint From f8703ac3ace1eba937308cb0d2b57dccd92fabbc Mon Sep 17 00:00:00 2001 From: aliakbar-deriv Date: Wed, 8 Jan 2025 12:49:55 +0400 Subject: [PATCH 4/7] fix: remove redundant caching, use setup-node npm cache --- .github/workflows/preview-deploy.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/workflows/preview-deploy.yml b/.github/workflows/preview-deploy.yml index bdcc873..10c7530 100644 --- a/.github/workflows/preview-deploy.yml +++ b/.github/workflows/preview-deploy.yml @@ -33,17 +33,7 @@ jobs: node-version: 18 cache: 'npm' - - name: Cache node_modules - uses: actions/cache@v3 - id: npm-cache - with: - path: node_modules - key: ${{ runner.os }}-node-modules-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node-modules- - - name: Install dependencies - if: steps.npm-cache.outputs.cache-hit != 'true' run: npm ci - name: Lint From 549e7ce92f570af5d541718355e25c13392e3022 Mon Sep 17 00:00:00 2001 From: aliakbar-deriv Date: Wed, 8 Jan 2025 15:47:45 +0400 Subject: [PATCH 5/7] fix: update preview deploy workflow --- .github/workflows/preview-deploy.yml | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/.github/workflows/preview-deploy.yml b/.github/workflows/preview-deploy.yml index 10c7530..98018de 100644 --- a/.github/workflows/preview-deploy.yml +++ b/.github/workflows/preview-deploy.yml @@ -94,6 +94,19 @@ jobs: with: preview: true + - name: Handle Deploy Failure + if: failure() && steps.deployment.outcome == 'failure' + uses: actions/github-script@v6 + with: + script: | + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: 'āŒ Preview deployment failed. Check the workflow logs for details.' + }); + core.setFailed('Preview deployment failed'); + - name: Comment PR uses: actions/github-script@v6 with: @@ -120,13 +133,14 @@ jobs: - name: Run E2E tests id: e2e uses: OctoMind-dev/automagically-action-execute@v2 + continue-on-error: true with: url: ${{ steps.deployment.outputs.page_url }} token: ${{ secrets.AUTOMAGICALLY_TOKEN }} testTargetId: ${{ secrets.AUTOMAGICALLY_TEST_TARGET_ID }} blocking: true - - name: Report Status + - name: Report Workflow Status if: always() uses: actions/github-script@v6 with: @@ -134,8 +148,11 @@ jobs: const { owner, repo } = context.repo; const run_id = context.runId; const run_url = `https://github.com/${owner}/${repo}/actions/runs/${run_id}`; - const status = `${process.env.GITHUB_WORKFLOW} workflow ${context.job} job status: ${steps.e2e.outcome}`; - const body = `### Workflow Status\n${status}\n[View Run Details](${run_url})`; + const status = '${{ steps.e2e.conclusion || steps.e2e.outcome || '' }}' === 'failure' + ? 'āŒ E2E tests failed' + : 'āœ… All checks completed'; + + const body = `### Workflow Status\n${status}\n\nFor detailed test results, check the OctoMind report in the PR.\n\nšŸ” [View Workflow Details](${run_url})`; github.rest.issues.createComment({ issue_number: context.issue.number, From c6e73afc5a9cd8f2c933b9fdd7cfacfc03b7aa1b Mon Sep 17 00:00:00 2001 From: aliakbar-deriv Date: Wed, 8 Jan 2025 17:07:30 +0400 Subject: [PATCH 6/7] refactor: optimize CI/CD workflows - Simplify artifact handling to fix upload issues - Add quality checks (lint and test) to both workflows - Make preview checks non-blocking for PRs - Enforce strict checks for production - Remove unnecessary complexity - Improve error handling and feedback --- .github/workflows/deploy.yml | 121 ++++++--------------------- .github/workflows/preview-deploy.yml | 75 ++++++----------- 2 files changed, 51 insertions(+), 145 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index bb475ee..eb4e127 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -4,87 +4,52 @@ on: push: branches: ['main'] workflow_dispatch: - inputs: - environment: - description: 'Environment to deploy to' - required: true - default: 'production' - type: choice - options: - - production - - staging permissions: contents: read pages: write id-token: write - deployments: write -# Prevent concurrent deployments concurrency: group: "pages" - cancel-in-progress: false # Don't cancel production deployments - -env: - NODE_ENV: production + cancel-in-progress: false jobs: - validate: - name: Validate Production Build + quality: + name: Code Quality runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 + uses: actions/checkout@v4 - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 cache: 'npm' - - - name: Install dependencies - run: | - npm ci - id: npm-cache - env: - cache-name: cache-node-modules - with: - path: node_modules - key: ${{ runner.os }}-prod-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-prod-${{ env.cache-name }}- - ${{ runner.os }}-prod- - ${{ runner.os }}- - - - name: Production Build Test - run: npm run build - env: - VITE_APP_ENV: production - - name: Run Tests - run: npm test -- --coverage + - name: Install dependencies + run: npm ci - - name: Cache build validation - uses: actions/cache@v3 - with: - path: dist - key: ${{ runner.os }}-prod-build-${{ github.sha }} + - name: Lint + run: npm run lint + + - name: Run tests + run: npm test deploy: - name: Deploy to Production - needs: validate + needs: quality + runs-on: ubuntu-latest environment: - name: ${{ github.event.inputs.environment || 'production' }} + name: github-pages url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest + steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 cache: 'npm' @@ -96,51 +61,17 @@ jobs: run: npm run build env: VITE_APP_ENV: production - NODE_ENV: production - + GITHUB_PAGES: true + BASE_URL: /copy-trading/ + - name: Setup Pages - uses: actions/configure-pages@v3 - + uses: actions/configure-pages@v4 + - name: Upload artifact - uses: actions/upload-pages-artifact@v2 + uses: actions/upload-pages-artifact@v3 with: - path: './dist' + path: dist - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v2 - - - name: Create Deployment Status - if: always() - uses: actions/github-script@v6 - with: - script: | - const { owner, repo } = context.repo; - const environment = '${{ github.event.inputs.environment || 'production' }}'; - const run_url = `https://github.com/${owner}/${repo}/actions/runs/${context.runId}`; - const status = `šŸš€ Deployment to ${environment} ${steps.deployment.outcome}`; - - await github.rest.repos.createDeploymentStatus({ - owner: owner, - repo: repo, - deployment_id: context.payload.deployment?.id, - state: steps.deployment.outcome === 'success' ? 'success' : 'failure', - environment_url: '${{ steps.deployment.outputs.page_url }}', - log_url: run_url, - description: status - }); - - - name: Notify on Failure - if: failure() - uses: actions/github-script@v6 - with: - script: | - const { owner, repo } = context.repo; - const run_url = `https://github.com/${owner}/${repo}/actions/runs/${context.runId}`; - const issue = await github.rest.issues.create({ - owner: owner, - repo: repo, - title: 'āŒ Production Deployment Failed', - body: `Deployment to production failed.\n\n[View Details](${run_url})`, - labels: ['deployment', 'bug'] - }); + uses: actions/deploy-pages@v3 diff --git a/.github/workflows/preview-deploy.yml b/.github/workflows/preview-deploy.yml index 98018de..8cb3274 100644 --- a/.github/workflows/preview-deploy.yml +++ b/.github/workflows/preview-deploy.yml @@ -10,11 +10,9 @@ permissions: pages: write id-token: write pull-requests: write - security-events: write -# Cancel in-progress runs for PRs concurrency: - group: ${{ github.workflow }}-${{ github.ref }} + group: "preview-${{ github.ref }}" cancel-in-progress: true jobs: @@ -23,45 +21,38 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 # Fetch all history for all branches and tags + uses: actions/checkout@v4 - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 cache: 'npm' - + - name: Install dependencies run: npm ci - + - name: Lint run: npm run lint continue-on-error: true - - name: Type check - run: | - npm run typecheck || echo "Type check failed but continuing" - continue-on-error: true - - - name: Run unit tests + - name: Run tests run: npm test + continue-on-error: true - preview_and_test: - name: Preview Deploy & E2E + deploy-preview: needs: quality runs-on: ubuntu-latest environment: - name: pr-preview + name: github-pages url: ${{ steps.deployment.outputs.page_url }} steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 cache: 'npm' @@ -73,42 +64,26 @@ jobs: run: npm run build env: VITE_APP_ENV: preview + GITHUB_PAGES: true + BASE_URL: /copy-trading/ - - name: Cache build output - uses: actions/cache@v3 - with: - path: dist - key: ${{ runner.os }}-build-${{ github.sha }} - - name: Setup Pages - uses: actions/configure-pages@v3 - + uses: actions/configure-pages@v4 + - name: Upload artifact - uses: actions/upload-pages-artifact@v2 + uses: actions/upload-pages-artifact@v3 with: - path: './dist' + path: dist - - name: Deploy PR Preview + - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v2 + uses: actions/deploy-pages@v3 with: preview: true - - - name: Handle Deploy Failure - if: failure() && steps.deployment.outcome == 'failure' - uses: actions/github-script@v6 - with: - script: | - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: 'āŒ Preview deployment failed. Check the workflow logs for details.' - }); - core.setFailed('Preview deployment failed'); - + - name: Comment PR - uses: actions/github-script@v6 + if: success() + uses: actions/github-script@v7 with: script: | const url = `${{ steps.deployment.outputs.page_url }}`; @@ -116,7 +91,7 @@ jobs: issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, - body: `šŸš€ Preview URL: ${url}` + body: `šŸš€ Preview deployed to: ${url}` }); - name: Check required secrets @@ -129,7 +104,6 @@ jobs: echo "::error::Missing required secret: AUTOMAGICALLY_TEST_TARGET_ID" exit 1 fi - - name: Run E2E tests id: e2e uses: OctoMind-dev/automagically-action-execute@v2 @@ -142,7 +116,7 @@ jobs: - name: Report Workflow Status if: always() - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const { owner, repo } = context.repo; @@ -160,3 +134,4 @@ jobs: repo: repo, body: body }); + \ No newline at end of file From 523d0f6d9fd607f3c46ee9ae755a2749b8c83df6 Mon Sep 17 00:00:00 2001 From: aliakbar-deriv Date: Wed, 8 Jan 2025 19:43:28 +0400 Subject: [PATCH 7/7] chore: optimize GitHub Actions workflows - Add consistent permissions and artifact naming - Improve concurrency settings - Configure proper preview deployments - Add deployment tracking and status updates --- .github/workflows/deploy.yml | 7 ++++++- .github/workflows/preview-deploy.yml | 11 +++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index eb4e127..ac27aa7 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -9,10 +9,12 @@ permissions: contents: read pages: write id-token: write + deployments: write + statuses: write concurrency: group: "pages" - cancel-in-progress: false + cancel-in-progress: true jobs: quality: @@ -71,7 +73,10 @@ jobs: uses: actions/upload-pages-artifact@v3 with: path: dist + name: github-pages - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v3 + with: + artifact_name: github-pages diff --git a/.github/workflows/preview-deploy.yml b/.github/workflows/preview-deploy.yml index 8cb3274..ab4161e 100644 --- a/.github/workflows/preview-deploy.yml +++ b/.github/workflows/preview-deploy.yml @@ -10,9 +10,11 @@ permissions: pages: write id-token: write pull-requests: write + deployments: write + statuses: write concurrency: - group: "preview-${{ github.ref }}" + group: "preview-${{ github.event.pull_request.number }}" cancel-in-progress: true jobs: @@ -44,7 +46,7 @@ jobs: needs: quality runs-on: ubuntu-latest environment: - name: github-pages + name: preview url: ${{ steps.deployment.outputs.page_url }} steps: @@ -74,12 +76,14 @@ jobs: uses: actions/upload-pages-artifact@v3 with: path: dist + name: github-pages - - name: Deploy to GitHub Pages + - name: Deploy Preview id: deployment uses: actions/deploy-pages@v3 with: preview: true + artifact_name: github-pages - name: Comment PR if: success() @@ -134,4 +138,3 @@ jobs: repo: repo, body: body }); - \ No newline at end of file