Top
Best
New

Posted by gslin 14 hours ago

Lock Your GitHub Actions(hugovk.dev)
274 points | 58 comments
woodruffw 14 hours ago|
The advice here is really great (as I'd expect from Hugo), but as the maintainer of zizmor I want to note some caveats with the current iteration of workflow lockfiles:

- They only lock normal action calls. If your workflows invoke other reusable workflows, you need to keep those hash-pinned manually for now.

- Composite actions are not themselves locked. Instead, they get locked transitively through their callsites i.e. the workflows that call them. This makes any individual caller that uses lockfiles safe, but it also makes the current `gh actions-lock` default unsafe (since it removes hash-pins from the composite action itself, meaning that any external caller that invokes the action loses their transitive pinning).

- Other forms of `uses:` clauses, like Docker images, are also not currently locked via the lockfile. And the same for forms of interior mutability (like an action running `npx ...` under the hood, although the latter is fully outside of GitHub's control to prevent. But these mean that you can't assume that a fully locked Actions setup is in fact 100% immutable.

I hope they address these gaps soon, because it's otherwise an excellent (and long-awaited) feature.

crote 3 hours ago|
And, the one often forgotten: `runs-on:` also refers to an image, but in practice a huge amount of people will just set it to `ubuntu-latest` and accept whatever GH happens to include that day. In fact, I don't think it is even possible to refer to a specific runner image revision by digest...
Already__Taken 14 hours ago||
Quoting someone else's blog I've forgotten but you're trading the trust in the repo owner not moving a tag for trusting whoever merges the commit hash to have checked that's a release in the repo you want and not _some_ forks commit. All forks on github are the same repo you can pin any commit, merged upstream or not.

IMO Github should make Immutable tags mandatory to publish on https://github.com/marketplace

woodruffw 14 hours ago||
Actions lockfiles prevent this. They won't allow you to lock an impostor commit, which is the right default.

(The previous way to provide general actions immutability, i.e. hash-pinning, had this issue and thus required additional checks.)

OptionOfT 13 hours ago|||
One could write an action that executes a shell script that does docker pull abc:latest.

As the consumer of an action that becomes really hard to find out unless I take the whole codebase apart.

eviks 5 hours ago|||
Why not make the marketplace published tags immutable instead like others do?
Bnjoroge 6 hours ago|||
That’s exactly what lockfiles are intended to avoid!
chrisweekly 13 hours ago|||
I almost forgot about that completely outrageous treatment of forks -- just bonkers.
klodolph 12 hours ago||
I think my main advice is to avoid GH actions at all, unless avoiding them is somehow painful. There is just a long bad history here.
jaggederest 12 hours ago||
These days setting up a proper system on your build orchestrator of choice is pretty easy, cheaper, and you basically only lose a tiny bit of UI niceness if they report to github anyway
ethin 10 hours ago||
Only if your not on GH free, which I use for my OSS projects for example.
dirtbag__dad 10 hours ago|||
What would you suggest instead?
klodolph 9 hours ago|||
Just about anything else, tbh. Jenkins is the option I would go for, but that’s a reflection of my personal preferences for self-hosting. Self-hosting has gotten way easier since LLMs can debug things so well, so I’m self-hosting more than ever before even though I have less time available.

You don’t have to go Jenkins, it’s just that GitHub Actions are uniquely bad and I would avoid them.

If you are relying on the free version of GitHub actions for small projects, I would consider just running something on a NUC or Pi at home.

cedws 5 hours ago|||
Jenkins over GHA is insane.
klodolph 5 hours ago||
GHA over Jenkins is insane. Every time I’ve touched GHA, I’ve just been shocked with how bad the ecosystem is.

It feels like, I don’t know. You go to somebody’s house and they have one plate, one cup, one spork. They’re living in a 30th floor walk-up, but one of the windows is missing so there’s a giant hole in the wall.

That’s kind of the subjective experience I get when I see people using GitHub actions.

cedws 5 hours ago||
I'm not saying GHA is much better, but Jenkins is literally swiss cheese, it has vulnerabilities every day of the week. Even just as an internal service not exposed to the internet it's dangerous.
pie_flavor 8 hours ago|||
A Pi is not going to make your Windows and macOS builds. It's also going to have a miserable time running the Rust compiler on your five hundred dependencies.
account42 49 minutes ago|||
A Pi can run MinGW or Clang with a Win32 target. Even running MSVC under Wine is technically possible.
klodolph 6 hours ago|||
Here’s my take: if you don’t personally have a Mac, you should not be making Mac builds of your software.

Same for Windows.

I may be a little old-school about this. That’s fine. I think most people out there who are trying to support multiple platforms with their code should be going one of three directions—(1) some kind of web app, (2) an open-source tool where end-users compile it or run it in their Python interpreter or Node.js or whatever, or (3) a pre-built binary for systems they personally run at home.

I also am not writing out, like, an essay on how to replace GitHub actions for every possible use case that people have GitHub actions for. I am just providing some suggestions for one possible direction. If you get off GitHub actions, you are going to end up with something that is missing some of the features that GitHub actions, maybe some features that you like. The same is true in the reverse—if you switch to GitHub actions, you will obviously lose features that were present in whatever other system you had before. GitHub actions is, after all, completely terrible and switching to it would just be a kind of disaster in a bunch of different ways.

I don’t like to put this kind of wall-of-text disclaimer in comments on HN, and hopefully y’all can figure this stuff out without the wall-of-text disclaimer. It would be kind of… absurd… perhaps, to expect some random commentator on Hacker News to give you exactly the answer that satisfies your needs, unless you put those needs in a question.

Instead I limited myself to two suggestions. If you don’t like them, then figure something else out yourself. You will not have trouble making something better than GitHub actions.

pjc50 1 hour ago|||
> if you don’t personally have a Mac, you should not be making Mac builds of your software

Apple seem to believe this extremely strongly and keep finding new ways to prevent you doing it.

I basically agree, and at work we have a Jenkins master + cluster of build machines. But this does incur substantial sysadmin overhead even if we're using Ansible and all the Windows ones are VMs. (Mac, again, hates being either virtualized or stuck in a rack, and will occasionally insist on someone using the physical display and keyboard on the actual machine to perform updates)

sampullman 5 hours ago|||
GitHub actions is bad, but if you keep things mostly in locally verifiable scripts it's really not that bad.

And yes, you should have a Mac for local testing of you target OSX, but it's still useful to have an easy way to run a matrix of platforms in CI.

Jenkins is fine but hard to call it better than GH actions, subjectively.

spoaceman7777 2 hours ago|||
cron and bash
mitxela 5 hours ago||
The whole system is just bad. Even Jenkins is better. Or a shell script in a one minute cronjob.
gbraad 13 hours ago||
I undrrstand this looks cleaner and more intuitive, but you still have the risk of running a workflow with malicious/compromised actions, like manually, or locally with act, if you do not verify the lockfile as part of the workflow or preceded by an extra workflow step. This should be something that the runner ideally should handle (as part of the platform). This still is a workaround, just like the sha pinning. I only use vendor upstream actions, like github's or forks in our own org.
Bnjoroge 6 hours ago|
say more about how you would envision the runner handling this? An allowlist of actions?
computerfriend 3 hours ago||
The runner should execute gh actions-lock --verify automatically.
SchemaLoad 14 hours ago||
Are people finding a real need for importing and updating git actions? Aren't they usually just running a one line bash command? I'd just copy paste the action in to your config so it's fully locked and under your control rather than importing some opaque script from a no name github user.
comradesmith 11 hours ago||
Github actions are not that simple. Not even close
knocte 8 hours ago||
Still, I prefer to copy their action.yml into my repo.

(I simply put a comment with the upstream URL in my repo in case I want to update in the future.)

Pxtl 8 hours ago||
A lot of things that should be one bash command turn out to be dozens of lines of incantations and handling edge cases. Microsoft I'm looking in your direction.

For those things an action helps.

lukasschwab 13 hours ago||
Are there clear reasons to prefer this over just pinning a commit SHA?
Arbortheus 13 hours ago||
Presumably it’s for the transitive dependencies. You pin action X, but that (third party) action doesn’t correctly pin the SHA of action Y, so you still get owned if the mutable tag gets moved to a compromised commit.

But with a lockfile, direct and indirect dependencies both get pinned. (I presume, and haven’t checked yet, but otherwise this feature would be useless)

esafak 11 hours ago||

     Use the gh actions-lock extension for the GitHub CLI to generate .github/workflows/actions.lock for actions and their transitive dependencies.
https://github.blog/changelog/2026-10-28-github-actions-work...
ygouzerh 6 hours ago||
You can keep the information provided by the version number, and if the maintainer is using real SemVer, it's easier to upgrade.
akoboldfrying 21 minutes ago||
> You can keep the information provided by the version number

The old way of just writing this in a comment on the same line seems fine to me -- intuitive and much more concise.

> if the maintainer is using real SemVer, it's easier to upgrade

Could you elaborate on this? I didn't see how yet.

rurban 3 hours ago||
No, I'm still keep using 'pinact run -u', and some dependabot actions to remind me on updates.
ezekg 14 hours ago||
Does this prevent one of the locked dependencies not locking their own dependencies and pulling in a malicious and replaced tag?
eddythompson80 14 hours ago|
It does not. Obviously if you lock a “foo/setup-latest-go” action, it’s still going to (and you’d probably expect it to) pull in the latest go. Actions are expected to start running though. Like GitHub isn’t gonna do an `npm install` for you, it’ll just run the entry point of the action, and the entry point can do whatever it was written to do.
computerfriend 12 hours ago||
I think they mean specifically sub-actions as dependencies.
transitivebs 10 hours ago|
big fan of actions-up for doing this: https://github.com/azat-io/actions-up
More comments...