Verify GH action tag/SHA combinations#356
Conversation
|
This is in a very early stage and meant to just gather feedback and opinions about the approach. |
|
@raboof do you think it's worth tackling this one? |
|
This looks helpful to me. Does it actually share code with |
It does use the load_actions and a data class. But nothing that presents moving the code to a separate .py file. |
af91fe6 to
185416b
Compare
|
Made some progress on this one. Moved the code to a separate source file and added it to the The four remaining ones are because the The warnings are:
|
6a82461 to
a1796d0
Compare
|
I think it's a helpful check |
80da406 to
3ff4fee
Compare
|
I've rebased this PR. Two actions are a bit problematic:
|
I guess we should make it into 1.94.1 (different sha aad518f59d88bae90133242f9ddac7f8bbc5dddf) - can you update it @snazy ? This has been added here #620 -@kevinjqliu - are you ok with that? I guess you are the user of that action - so you will have to update it in your repo? Maybe also worth checking if others do not use it ?
This has been removed in main - they apparently changed "release" to "pre-release" and kept on moving it. |
looks like a bunch of repos are already using that commit hash https://grep.app/search?f.repo.pattern=apache%2F&q=dtolnay%2Frust-toolchain%4029eef336d9b2848a0b548edc03f92a220660cdb8 and some still using |
|
@snazy gentle nudge on this — still think the tag/SHA verification check is worth having. |
7890f4e to
06ed179
Compare
This change introduces a new function `verify_actions` to validate the contents against GitHub.
TL;DR
The function verifies that the SHAs specified in `actions.yml` exist in the GH repo.
Also ensures that the SHA exists on the Git tag, if the `tag` attribute is specified.
The rest of the (currently spaghetti code) function is a lot of output and error(failure) and warning collection.
Although it issues quite a few GH API requests, the rate limiter should not kick in (with an authenticated GH token).
I opted to rely on the HTTP/1.1 `urllib.request` stuff, which has no connection-reuse. The alternative would have been to add a dependency.
The algorithm roughly works like this, for each action specified in `actions.yml`:
* Issue a warning and stop, if the name is like `OWNER/*` ("wildcard" repository).
Can't verify Git SHAs in this case.
* Issue a warning and stop, if the name is like `docker:*` (not implemented)
* Issue an error and stop, if the name doesn't start with an `OWNER/REPO` pattern.
* Each expired entry is just skipped
* If there is a wildcard reference and a SHA reference, issue an error.
Then, for each reference for an action:
* If no `tag` is specified, let GH resolve the commit SHA.
Emit a warning to add the value of the `tag` attribute, if the SHA can be resolved.
Otherwise, emit an error.
* If `tag` is specified:
* Add the SHA to the set of requested-shas-by-tag
* Call GH's "matching-refs" endpoint for the 'tag' value
* Emit en error, if the object type is not a tag or commit.
* Also resolve 'tag' object types to 'commit' object types.
* Add each returned SHA to the set of valid-shas-by-tag.
* For each "requested tag" verify that the sets of valid and requested shas intersect. If not, emit an error.
1. `matlab-actions/run-tests`: the tag `v3.1.0` has been moved on Apr 14, 2026 (initially added on Apr 12 via apache#695) 2. `dtolnay/rust-toolchain`: `stable` is a branch and cannot be validated as a tag
06ed179 to
3b4c8ac
Compare
ddb5645 to
e39a9ba
Compare
e39a9ba to
e8ef2e7
Compare
e8ef2e7 to
832e95b
Compare
|
I've rebased the branch. The changes to I've made the |
|
Thanks for the rebase and scoping this down, @snazy — the approach is solid and the test coverage on the happy paths is nice. I think the check is worth having. Two things I'd want sorted before approving, plus a few smaller items: 🔴 Blockers
🟡 Non-blocking, worth a look
Nothing here is structural — happy to approve once the two blockers are addressed. |
|
Thanks for the review! Pushed another commit to address the comments. |

This change introduces a new function
verify_actionsto validate the contents against GitHub.TL;DR
The function verifies that the SHAs specified in
actions.ymlexist in the GH repo. Also ensures that the SHA exists on the Git tag, if thetagattribute is specified. The rest of the function is a lot of output and error(failure) and warning collection.Although it issues quite a few GH API requests, the rate limiter should not kick in (with an authenticated GH token, GH workflows have a limit of 15k requests). I opted to rely on the HTTP/1.1
urllib.requeststuff, which has no connection-reuse. The alternative would have been to add a dependency.The algorithm roughly works like this, for each action specified in
actions.yml:OWNER/*("wildcard" repository). Can't verify Git SHAs in this case.docker:*(not implemented)OWNER/REPOpattern.Then, for each reference for an action:
tagis specified, let GH resolve the commit SHA. Emit a warning to add the value of thetagattribute, if the SHA can be resolved. Otherwise, emit an error.tagis specified:Fixes #110