mheap / pin-github-action

Pin your GitHub actions to a specific hash
MIT License
75 stars 7 forks source link

feature request: look up a hash by version #83

Open lucasgonze opened 2 years ago

lucasgonze commented 2 years ago

Pinning by hash createst UI friction. With a tool like yarn a developer can use the CLI to look up the hash and upgrade the yaml in a terse command - yarn upgrade foopackage@1.2.3. With pin-github-action the developer has to find the repo, look up the tag of the version they want, copy the hash, and paste the hash into their yaml.

pin-github-action should either:

  1. Be able to upgrade a single dependency using a command similar to yarn
  2. Be able to look up the hash in the CLI, so they can upgrade the yaml by hand
lucasgonze commented 2 years ago

If you are in agreement with this feature, I am willing to submit a PR implementing it.

mheap commented 2 years ago

@lucasgonze I'm not sure what you're suggesting we implement here. Are you looking for a way to specify a specific version of a dependency, or to update the hash in a workflow for an existing pinned dependency?

lucasgonze commented 2 years ago

Let's say you have this:

uses: DoozyX/clang-format-lint-action@9ea72631b74e61ce337d0839a90e76180e997283 # pin@v0.13

and there exists a 0.14 with hash 1234567.

You issue this command:

node bin.js --update DoozyX/clang-format-lint-action@v0.14

Then the yaml file changes to:

uses: DoozyX/clang-format-lint-action@1234567 # pin@v0.14

As a simplification, the CLI might simply report on the hash at a given version, in order to save the work of looking up the tag on Github. So this command:

node bin.js --lookup DoozyX/clang-format-lint-action@v0.14

Would return this in the shell:

1234567

mheap commented 2 years ago

Thanks for the examples, it makes it much clearer.

What are the benefits of adding support for node bin.js --update DoozyX/clang-format-lint-action@v0.14 in addition to updating the YAML to uses: DoozyX/clang-format-lint-action@v0.14 then re-running bin.js? This would look up the hash for the new version provided (or you could update pin@v0.13 to pin@v0.14 and re-run bin.js and it would update the hash too

lucasgonze commented 2 years ago

My intention with this is to avoid modifying hashes apart from the one named in the parameter.

The reason I would want to only touch the one item is concern that other items might be iterated to a hash that hadn't been vetted, and this would reduce the security of pinning by hash to the same level as pinning by version.

Am I understanding this right?

mheap commented 2 years ago

Yep, that's how it would work today.

We currently have an --allow flag to ignore specific actions from being pinned. Would adding an --only flag enable your use case?

# Update a single action
./bin.js --only  DoozyX/clang-format-lint-action

# Or update everything by a user/org
./bin.js --only DoozyX/*

This would pull the latest hash for the version specified in the pin@main comment. If you wanted to manually update the version that you're pinning to, you'd have to update the YAML file.

lucasgonze commented 2 years ago

--only would do the job.

I also like the "everything by a user/org" idea, because it allows for very trusted orgs like actions/.

lucasgonze commented 2 years ago

FYI: my PR for this feature is not yet ready, but I have submitted a couple other trivial features that became useful during development.

zeisss commented 1 year ago

Slightly off-topic, but github's Dependabot can not update github actions pinned by SHA if there is an appropriately formatted comment. See https://github.blog/changelog/2022-10-31-dependabot-now-updates-comments-in-github-actions-workflows-referencing-action-versions/