mirror of https://github.com/grpc/grpc.git
The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#)
https://grpc.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
2.7 KiB
74 lines
2.7 KiB
name: Happy Pancakes |
|
on: |
|
pull_request: |
|
types: [opened, edited, labeled, unlabeled, synchronize, ready_for_review, auto_merge_enabled, auto_merge_disabled] |
|
jobs: |
|
check_status: |
|
name: Check Required Status or force-merge label |
|
runs-on: ubuntu-latest |
|
steps: |
|
# Cancel current runs if they're still running |
|
# (saves processing on fast pushes) |
|
- name: Cancel Previous Runs |
|
uses: styfle/cancel-workflow-action@0.9.1 |
|
with: |
|
access_token: ${{ github.token }} |
|
# Wait until our required statuses are ready or failed |
|
# Unless force-merge is present, and then just be good. |
|
- name: Check Status |
|
uses: actions/github-script@v4 |
|
with: |
|
script: | |
|
function sleep(ms) { |
|
return new Promise(resolve => setTimeout(resolve, ms)); |
|
} |
|
let pull = await github.pulls.get({ |
|
owner: "grpc", |
|
repo: "grpc", |
|
pull_number: ${{ github.event.pull_request.number }} |
|
}); |
|
for (var i = 0; i < pull.data.labels.length; i++) { |
|
let label = pull.data.labels[i]; |
|
if (label.name == "force-merge") { |
|
console.log("Saw force-merge label"); |
|
return; |
|
} |
|
} |
|
while (true) { |
|
var need = new Set(); |
|
need.add("Bazel Basic build for C/C++"); |
|
need.add("Portability Tests Linux [Build Only] (internal CI)"); |
|
for (var page=1;; page++) { |
|
console.log("***** page " + page); |
|
let statuses = await github.repos.listCommitStatusesForRef({ |
|
owner: "grpc", |
|
repo: "grpc", |
|
ref: "${{ github.event.pull_request.head.sha }}", |
|
per_page: 100, |
|
page: page |
|
}); |
|
for (var i = 0; i < statuses.data.length; i++) { |
|
let status = statuses.data[i]; |
|
console.log(status.context, status.state, need); |
|
if (need.has(status.context)) { |
|
if (status.state == "success") { |
|
need.delete(status.context); |
|
} else if (status.state == "pending") { |
|
// do nothing |
|
} else { |
|
core.setFailed("Required status failed: " + status.context); |
|
return; |
|
} |
|
} |
|
} |
|
if (statuses.data.length < 100) { |
|
break; |
|
} |
|
} |
|
if (need.size == 0) { |
|
return; |
|
} |
|
// Sleep 15 minutes between polls |
|
await sleep(15 * 60 * 1000); |
|
} |
|
|
|
|