-
-
Save jodh-intel/8686dd0ad04c9526cb5ba93283805561 to your computer and use it in GitHub Desktop.
| name: Ensure all PRs have the required porting labels | |
| on: | |
| pull_request: | |
| types: | |
| - closed | |
| jobs: | |
| check-pr-porting-labels: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Install hub | |
| run: | | |
| HUB_ARCH="amd64" | |
| HUB_VER=$(curl -sL "https://api.github.com/repos/github/hub/releases/latest" |\ | |
| jq -r .tag_name | sed 's/^v//') | |
| curl -sL \ | |
| "https://github.com/github/hub/releases/download/v${HUB_VER}/hub-linux-${HUB_ARCH}-${HUB_VER}.tgz" |\ | |
| tar xz --strip-components=2 --wildcards '*/bin/hub' && \ | |
| sudo install hub /usr/local/bin | |
| - name: Stop PR being merged unless it has atleast one backport label and one forward port label | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.KATA_GITHUB_ACTIONS_TOKEN }} | |
| DEBUG: true | |
| run: | | |
| pr=${{ github.event.number }} | |
| # Every PR must have two porting labels before it can be merged. | |
| # This is to ensure it is clear that a reviewer has considered both | |
| # porting directions. | |
| backport_labels=("needs-backport" "no-backport-needed") | |
| forward_port_labels=("needs-forward-port" "no-forward-port-needed") | |
| pr_details=$(hub pr list -f '%I;%L%n' | grep "^${pr}" || true) | |
| [ -z "$pr_details" ] \ | |
| && echo "::error::Cannot determine details for PR $pr" \ | |
| && exit 1 | |
| labels=$(echo "$pr_details"|cut -d';' -f2|tr ',' ' ') | |
| [ -z "$labels" ] \ | |
| && echo "::error::PR $pr does not have required porting labels" \ | |
| && exit 1 | |
| backport_label="" | |
| for label in ${backport_labels[@]} | |
| do | |
| echo "$labels"|grep -qw "$label" \ | |
| && backport_label="$label" \ | |
| && break | |
| done | |
| [ -z "$backport_label" ] \ | |
| && echo "::error::PR $pr missing a backport label (${backport_labels[@]})" \ | |
| && exit 1 | |
| forward_port_label="" | |
| for label in ${forward_port_labels[@]} | |
| do | |
| echo "$labels"|grep -qw "$label" \ | |
| && forward_port_label="$label" \ | |
| && break | |
| done | |
| [ -z "$forward_port_label" ] \ | |
| && echo "::error::PR $pr missing a forward port label (${backport_labels[@]})" \ | |
| && exit 1 | |
| echo "::debug::PR $pr has required porting labels ($backport_label, $forward_port_label)" |
What about if the PR is a backport or a forward port?
What about if the PR is a backport or a forward port?
@c3d - If a PR is a backport / forward-port PR, with the current set of labels it would presumably be marked no-backport-needed / no-forward-port-needed (since the new labels apply to a future PR, not a current back/forward port PR). However, we could add more labels (backport-change and forward-port-change). That would be useful as we could filter by these labels too. What do we think? Too many labels already? Any other way to handle this scenario?
/cc @gnawux, @amshinde, @ariel-adam.
What about if the PR is a backport or a forward port?
@c3d - If a PR is a backport / forward-port PR, with the current set of labels it would presumably be marked
no-backport-needed/no-forward-port-needed(since the new labels apply to a future PR, not a current back/forward port PR).
It's the "presumably" that is not obvious. Even with your documentation.
However, we could add more labels (
backport-changeandforward-port-change). That would be useful as we could filter by these labels too. What do we think? Too many labels already? Any other way to handle this scenario?
I personally slightly favor having a dedicated label, less chance of being confused.
Another possibility is to add a specific tag, e.g. forward-port-of (similar to fixes) and check that, with the additional benefit that it gives us a pointer to what we are forward-porting. This seems particularly relevant for agent code, where the connexion will not be obvious between Rust and Go commits.
/cc @gnawux, @amshinde, @ariel-adam.
I personally prefer to have a specif i
I think that although we are trying to reduce the amount of labels, in this case since there is a script enforcing their existence it does make sense.
As long as the error messages are clear enough and it's document it should work.
I would however explain in the error message what is required from the developer to fix it (and not just read the XXXXXXX manual :-)).
So for example, in "PR $pr does not have required porting labels" I'd also point out what labels should be added for it to actually pass (backport / forward-port/no-backport-needed / no-forward-port-needed)
Nit: && on line 39 or 45 or 52 assumes that the line above executed successfully.