From 8defc63a4503a4a50f854734054dc764c3cde519 Mon Sep 17 00:00:00 2001 From: Karolina Rakoczy Date: Mon, 8 Aug 2022 15:58:39 +0200 Subject: [PATCH] Automatically merge release PRs after cypress tests (#2211) * Automatically merge release PRs after cypress tests * Fix token * add package.json to workflows directory * revert package json to the state from main --- .github/workflows/approveAndMergeReleasePR.js | 77 +++++++++ .github/workflows/package-lock.json | 151 ++++++++++++++++++ .github/workflows/package.json | 9 ++ .github/workflows/tests-nightly.yml | 37 ++++- package-lock.json | 2 +- 5 files changed, 274 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/approveAndMergeReleasePR.js create mode 100644 .github/workflows/package-lock.json create mode 100644 .github/workflows/package.json diff --git a/.github/workflows/approveAndMergeReleasePR.js b/.github/workflows/approveAndMergeReleasePR.js new file mode 100644 index 000000000..c88659d85 --- /dev/null +++ b/.github/workflows/approveAndMergeReleasePR.js @@ -0,0 +1,77 @@ +const { Octokit } = require("@octokit/core"); +const { Command } = require("commander"); + +const program = new Command(); + +const repo = "saleor-cloud-deployments"; +const owner = "saleor"; + +program + .name("Approve PR") + .description("Approve and merge PR if patch release") + .option("--tests_status ", `tests status`) + .option("--version ", "version of a project") + .option("--pull_request_number ", "Pull Request number") + .action(async options => { + const octokit = new Octokit({ + auth: process.env.GITHUB_TOKEN, + }); + + const pullNumber = options.pull_request_number; + + const pullRequest = await octokit.request( + "GET /repos/{owner}/{repo}/pulls/{pull_number}", + { + owner, + repo, + pull_number: pullNumber, + }, + ); + + const commitId = pullRequest.data.merge_commit_sha; + const requestBody = + options.tests_status === "success" + ? "Cypress test passed" + : "Some tests failed, need manual approve"; + const event = options.tests_status === "success" ? "APPROVE" : "COMMENT"; + + try { + await octokit.request( + "POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews", + { + owner, + repo, + pull_number: pullNumber, + commit_id: commitId, + body: requestBody, + event, + comments: [], + }, + ); + } catch (e) { + error(e.message); + process.exit(2); + } + + if (isPatchRelease(options.version) && options.tests_status === "success") { + try { + await octokit.request( + "PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge", + { + owner, + repo, + pull_number: pullNumber, + }, + ); + } catch (e) { + error(e.message); + process.exit(2); + } + } + }) + .parse(); + +function isPatchRelease(version) { + const regex = /\d+\.\d+\.[1-9]/; + return version.match(regex) ? true : false; +} diff --git a/.github/workflows/package-lock.json b/.github/workflows/package-lock.json new file mode 100644 index 000000000..1eb8e2934 --- /dev/null +++ b/.github/workflows/package-lock.json @@ -0,0 +1,151 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@octokit/core": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.0.4.tgz", + "integrity": "sha512-sUpR/hc4Gc7K34o60bWC7WUH6Q7T6ftZ2dUmepSyJr9PRF76/qqkWjE2SOEzCqLA5W83SaISymwKtxks+96hPQ==", + "requires": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/auth-token": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.0.tgz", + "integrity": "sha512-MDNFUBcJIptB9At7HiV7VCvU3NcL4GnfCQaP8C5lrxWrRPMJBnemYtehaKSOlaM7AYxeRyj9etenu8LVpSpVaQ==", + "requires": { + "@octokit/types": "^6.0.3" + } + }, + "@octokit/endpoint": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.0.tgz", + "integrity": "sha512-Kz/mIkOTjs9rV50hf/JK9pIDl4aGwAtT8pry6Rpy+hVXkAPhXanNQRxMoq6AeRgDCZR6t/A1zKniY2V1YhrzlQ==", + "requires": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/graphql": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.0.tgz", + "integrity": "sha512-1ZZ8tX4lUEcLPvHagfIVu5S2xpHYXAmgN0+95eAOPoaVPzCfUXJtA5vASafcpWcO86ze0Pzn30TAx72aB2aguQ==", + "requires": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/openapi-types": { + "version": "12.11.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", + "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==" + }, + "@octokit/request": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.0.tgz", + "integrity": "sha512-7IAmHnaezZrgUqtRShMlByJK33MT9ZDnMRgZjnRrRV9a/jzzFwKGz0vxhFU6i7VMLraYcQ1qmcAOin37Kryq+Q==", + "requires": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/request-error": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.0.tgz", + "integrity": "sha512-WBtpzm9lR8z4IHIMtOqr6XwfkGvMOOILNLxsWvDwtzm/n7f5AWuqJTXQXdDtOvPfTDrH4TPhEvW2qMlR4JFA2w==", + "requires": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "requires": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "before-after-hook": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", + "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==" + }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } + }, + "commander": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", + "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==" + } + } +} diff --git a/.github/workflows/package.json b/.github/workflows/package.json new file mode 100644 index 000000000..0005c22b1 --- /dev/null +++ b/.github/workflows/package.json @@ -0,0 +1,9 @@ +{ + "engines": { + "node": ">=14" + }, + "dependencies": { + "@octokit/core": "^4.0.4", + "commander": "^9.4.0" + } +} diff --git a/.github/workflows/tests-nightly.yml b/.github/workflows/tests-nightly.yml index e9ef78d4a..291d38ce3 100644 --- a/.github/workflows/tests-nightly.yml +++ b/.github/workflows/tests-nightly.yml @@ -144,6 +144,8 @@ jobs: run-tests-on-release: if: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.environment != 'PROD' && github.event.client_payload.environment != 'ENTERPRISE'}} runs-on: ubuntu-latest + outputs: + status: ${{ job.status }} container: cypress/browsers:node14.16.0-chrome89-ff86 strategy: fail-fast: false @@ -192,4 +194,37 @@ jobs: parallel: true group: 'UI - Chrome' record: true - tag: ${{github.event.client_payload.project}}, ${{github.event.client_payload.environment}}, Critical, https://v${{ steps.version.outputs.formatted_version }}.staging.saleor.cloud \ No newline at end of file + tag: ${{github.event.client_payload.project}}, ${{github.event.client_payload.environment}}, Critical, https://v${{ steps.version.outputs.formatted_version }}.staging.saleor.cloud + + add-review-and-merge-patch: + runs-on: ubuntu-latest + needs: [run-tests-on-release] + steps: + + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node + uses: actions/setup-node@v1 + with: + node-version: 14 + + - name: Install dependencies + run: | + cd .github/workflows + npm ci + + - name: Add review and merge if patch + env: + tests_status: ${{ needs.run-tests-on-release.outputs.status}} + version: ${{github.event.client_payload.version}} + pull_request_number: ${{ github.event.client_payload.pullRequestNumber}} + run: | + export GITHUB_TOKEN=$( \ + curl --request GET --url ${{ secrets.VAULT_URL}} --header "Authorization: JWT ${{ secrets.VAULT_JWT }}" | jq -r .token \ + ) + + node .github/workflows/approveAndMergeReleasePR.js \ + --tests_status $tests_status \ + --version $version \ + --pull_request_number $pull_request_number \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2226f54d9..590594594 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32784,4 +32784,4 @@ } } } -} +} \ No newline at end of file