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
This commit is contained in:
parent
5ce4a87515
commit
8defc63a45
5 changed files with 274 additions and 2 deletions
77
.github/workflows/approveAndMergeReleasePR.js
vendored
Normal file
77
.github/workflows/approveAndMergeReleasePR.js
vendored
Normal file
|
@ -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>", `tests status`)
|
||||
.option("--version <version>", "version of a project")
|
||||
.option("--pull_request_number <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;
|
||||
}
|
151
.github/workflows/package-lock.json
generated
vendored
Normal file
151
.github/workflows/package-lock.json
generated
vendored
Normal file
|
@ -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=="
|
||||
}
|
||||
}
|
||||
}
|
9
.github/workflows/package.json
vendored
Normal file
9
.github/workflows/package.json
vendored
Normal file
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
},
|
||||
"dependencies": {
|
||||
"@octokit/core": "^4.0.4",
|
||||
"commander": "^9.4.0"
|
||||
}
|
||||
}
|
37
.github/workflows/tests-nightly.yml
vendored
37
.github/workflows/tests-nightly.yml
vendored
|
@ -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
|
||||
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
|
2
package-lock.json
generated
2
package-lock.json
generated
|
@ -32784,4 +32784,4 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue