The Pain That Is GitHub Actions

This page summarizes the projects mentioned and recommended in the original post on news.ycombinator.com

InfluxDB high-performance time series database
Collect, organize, and act on massive volumes of high-resolution data to power real-time intelligent systems.
influxdata.com
featured
CodeRabbit: AI Code Reviews for Developers
Revolutionize your code reviews with AI. CodeRabbit offers PR summaries, code walkthroughs, 1-click suggestions, and AST-based analysis. Boost productivity and code quality across all major languages with each PR.
coderabbit.ai
featured
  1. dagger

    An open-source runtime for composable workflows. Great for AI agents and CI/CD. (by dagger)

    mise (https://mise.jdx.dev/) and dagger (https://github.com/dagger/dagger) seem like nice candidates too!

    Mise can install all your deps, and run tasks

  2. InfluxDB

    InfluxDB high-performance time series database. Collect, organize, and act on massive volumes of high-resolution data to power real-time intelligent systems.

    InfluxDB logo
  3. runner

    The Runner for GitHub Actions :rocket:

    - If you use a CI system, gitlab, circle etc, use one which does not do stupid things with your containers (like Github: 4 years! old f** up: https://github.com/actions/runner/issues/863#issuecomment-25...)

    Thats why we built our own build tool which does that, or at least helps us doing the above things:

    https://github.com/sdsc-ordes/quitsh

  4. act

    Run your GitHub Actions locally 🚀

    > Why do I need a custom token? Because without it, the release completes, but doesn't trigger our post-release workflow.

    This is so frustrating. Having to inject a PAT into the workflow just so it will kick off another workflow is not only annoying but it just feels wrong. Also not lots of operations are tied to my user which I don't like.

    > It doesn't help that you can't really try any of this locally (I know of [act](https://github.com/nektos/act) but it only supports a small subset of the things you're trying to do in CI).

    This is the biggest issue with GH Actions (and most CIs), testing your flows locally is hard if not impossible

    All that said I think I prefer GH Actions over everything else I've used (Jenkins and GitLab), it just still has major shortcomings.

    I highly recommend you use custom runners. The speed increase and cost savings are significant. I use WarpBuild [0] and have been very happy with them. I always look at alternatives when they are mentioned but I don't think I've found another service that provides macOS runners.

    [0] https://www.warpbuild.com

  5. earthly

    Super simple build framework with fast, repeatable builds and an instantly familiar syntax – like Dockerfile and Makefile had a baby.

    There is at a tiny glimmer of life on the earthly front - yesterday, they merged their first changes in 6 months:

    [1] https://github.com/earthly/earthly/commit/6d7f6786ad9fa4392f...

  6. rcl

    A reasonable configuration language

    To make sure that you can test CI locally, the best way I've found so far is to make sure the checks can run with Nix, and then keep the CI config itself as simple as possible and just call Nix.

    As for reducing boilerplate in the CI configs, GitHub Actions is a programming language with support for functions! It's just that function calls can only appear in very limited places in the program (only inside `steps`), and to define a function, you have to create a Git repository. The function call syntax is also a bit unusual, it's written with the `uses` keyword. So there is a lot of boilerplate that you can't remove this way, though there are several other yaml eDSLs hidden in GitHub Actions that address some points of it. E.g. you can create loops with `matrix`, but again, not general-purpose loops, they can only appear in a very specific syntactic location.

    To really duplicate stuff, rather than copy-pasting blocks of yaml, without using a mix of these special yaml eDSLs, in the past I've used Nix and Python to generate json. Now I'm using RCL for this (https://rcl-lang.org). All of them are general-purpose yaml deduplicators, where you can put loops or function calls anywhere you want.

  7. cargo-vet

    supply-chain security for Rust

    Well but that’s the problem. You cannot fully automate this. You have to manually check the diff of each dependency and only accept the dependabot PR if the changes are safe.

    The only automation that I know of is cargo vet. Although it doesn’t work for GitHub Actions, the idea sounds useful. Basically, vet allows people who trust each other to vet updates. So one person verifies the diff and then approves the changes. Next, everyone who trusts this person can update the dependency automatically since it has been “vetted”.

    [1]: https://github.com/mozilla/cargo-vet

  8. cli

    🖥️ Depot CLI, build your Docker images in the cloud (by depot)

    This was an interesting read and highlighted some of the author's top-of-mind pain points and rough edges. However, in my experience, this is definitely not an exhaustive list, and there are actually many, many, many more.

    Things like 10 GB cache limits in GitHub, concurrency limits based on runner type, the expensive price tag for larger GitHub runners, and that's before you even get to the security ones.

    Having been building Depot[0] for the past 2.5 years, I can say there are so many foot guns in GitHub Actions that you don't realize until you start seeing how folks are bending YAML workflows to their will.

    We've been quite surprised by the `container` job. Namely, folks want to try to use it to create a reproducible CI sandbox for their build to happen in. But it's surprisingly difficult to work with. Permissions are wonky, Docker layer caching is slow and limited, and paths don't quite work as you thought they did.

    With Depot, we've been focusing on making GitHub Actions exponentially faster and removing as many of these rough edges as possible.

    We started by making Docker image builds exponentially faster, but we have now brought that architecture and performance to our own GHA runners [1]. Building up and optimizing the compute and processes around the runner to make jobs extremely fast, like making caching 2-10x faster without having to replace or use any special cache actions of ours. Our Docker image builders are right next door on dedicated compute with fast caching, making the `container` job a lot better because we can build the image quickly, and then you can use that image right from our registry in your build job.

    All in all, GHA is wildly popular. But, the sentiment around even it's biggest fans is that it could be a lot better.

    [0] https://depot.dev/

    [1] https://depot.dev/products/github-actions

  9. CodeRabbit

    CodeRabbit: AI Code Reviews for Developers. Revolutionize your code reviews with AI. CodeRabbit offers PR summaries, code walkthroughs, 1-click suggestions, and AST-based analysis. Boost productivity and code quality across all major languages with each PR.

    CodeRabbit logo
  10. action-debugger

    Debug your GitHub Actions via SSH to get access to the WARP runner system itself.

    There definitely are a ton of issues with GitHub actions. To add to the OP's list:

    - Self-hosting on your aws/gcp/azure account can get a little tricky. `actions-runner-controller` is nice but runs your workflows within a docker container in k8s, which leads to complex handling for isolation, cost controls because of NAT etc.

    - Multi-arch container builds require emulation and can be extremely slow by default.

    - The cache limits are absurd.

    - The macos runners are slow and overpriced (arguably, most of their runners are).

    Over the last year, we spent a good amount of time solving many of these issues with WarpBuild[1]. Having unlimited cache sizes, remote multi-arch docker builders with automatic caching, and ability to self-host runners in your aws/gcp/azure account are valuable to minimize cost and optimize performance.

    [1] https://warpbuild.com

  11. zizmor

    A static analysis tool for GitHub Actions

    This.

    I heavily invested in a local runner based CI/CD workflow. First I was using gogs and drone, now the forgejo and woodpecker CI forks.

    It runs with multiple redundancies because it's a pretty easy setup to replicate on decentralized hardware. The only thing that's a little painful is authentication and cross-system pull requests, so we still need our single point of failure to merge feature branches and do code reviews.

    To me, personally, the Github Actions CVE from August 2024 was the final nail in the coffin. I blogged about it in more technical detail [1] and guess what was the reason that the TJ actions have been compromised last week? Yep, you guessed right, the same attack surface that Github refuses to fix, a year later.

    The only tool, as far as I know, that somehow validates against these kind of vulnerabilities, is zizmor [2]. All other topls validate schemas, not vulnerabilities and weaknesses.

    [1] https://cookie.engineer/weblog/articles/malware-insights-git...

    [2] https://github.com/woodruffw/zizmor

  12. mise

    dev tools, env vars, task runner

    mise (https://mise.jdx.dev/) and dagger (https://github.com/dagger/dagger) seem like nice candidates too!

    Mise can install all your deps, and run tasks

  13. gitlab-ci-local

    Tired of pushing to test your .gitlab-ci.yml?

    If you are annoyed by gitlab-runner deprecating run command that I used to run pipelines locally, there is https://github.com/firecow/gitlab-ci-local . But it also opened my eyes to benefita of having runner invariant pipelines -- pipelines written in solution agnostic way. Use bash, make, just, doit or whatever.

    Nothing beats having a single script to bootstrap and run the whole pipeline e.g. `make ci`.

  14. hammerspoon

    Staggeringly powerful macOS desktop automation with Lua

    I don't have a makefile example, but I do functionally the same thing with shell scripts.

    I let GitHub actions do things like the initial environment configuration and the post-run formatting/annotation, but all of the actual work is done by my scripts:

    https://github.com/Hammerspoon/hammerspoon/blob/master/.gith...

  15. test-suite

    The way that gitlab shines is just fundamentally better than GitHub actions.

    It's really easy to extend and compose jobs, so it's simple to unit test your pipeline: https://gitlab.com/nunet/test-suite/-/tree/main/cicd/tests?r...

    This way I can code my pipeline and use the same infrastructure to isolate groups of jobs that compose a relevant functionality and test it in isolation to the rest of the pipeline.

  16. webdsl

    WebDSL – A fast C-based DSL for building web apps with SQL, Lua and jq

    It doesn't (perhaps yet?) install the dependencies from the Makefile, but it runs a number of commands from the Makefile, eg, make test-leaks:

    https://github.com/williamcotton/webdsl/blob/main/.github/wo...

  17. github-script

    Write workflows scripting the GitHub API in JavaScript

  18. upload-artifact

    I have a small gripe that I think exemplifies a bigger problem. actions/upload-artifact strips executable permissions from binaries (1). The fact they fucked this up in the first place, and six years later haven't fixed it, gives me zero confidence in the team managing their platform. And when I'm picking a CI/CD service, I want reliability and correctness. GH has neither.

    When it takes all of a day to self host your own task runner on a laptop in your office and have better uptime, lower cost, better performance, and more correct implementations, you have to ask why anyone chooses GHA. I guess the hello-world is convincing enough for some people.

    (1) https://github.com/actions/upload-artifact/issues/38

  19. create-pull-request

    A GitHub action to create a pull request for changes to your repository in the actions workspace

    Using machine/service accounts across an org can (relatively) easily hit rate limits, better way is to use a github app instead for generating the tokens: https://github.com/peter-evans/create-pull-request/blob/main...

  20. v

    Simple, fast, safe, compiled language for developing maintainable software. Compiles itself in <1s with zero library dependencies. Supports automatic C => V translation. https://vlang.io

    We recently migrated from YAML CI to VSH as well:

    https://github.com/vlang/v/blob/master/ci/linux_ci.vsh

  21. vmatch

    golangci-lint + Go version automation

  22. bashdb

    Bash debugger (code imported from sourceforge)

  23. just

    🤖 Just a command runner

    This is why I've become a huge fan of Just, which is just a command runner, not a build caching system or anything.

    It allows you to define a central interface into your project (largely what I find people justify using Make for), but smoothes out so many of the weird little bumps you run into from "using Make wrong."

    Plus, you can an any point just drop into running a script in a different language as your command, so it basically "supports bash scripts" too.

    https://github.com/casey/just

  24. python-starter-template

    Application template for a python backend and react router SPA frontend

    I very much agree here. I've had the best luck when there is as little as possible config in CI as possible:

    - mise for lang config

    - direnv for environment loading

    - op for secret injection

    - justfile for lint, build, etc

    Here's a template repo that I've been working on that has all of this implemented:

    https://github.com/iloveitaly/python-starter-template

    It's more complex than I would like it to be, but it's consistent and avoids having to deal with GHA too much.

    I've also found having a GHA playground is helpful:

    https://github.com/iloveitaly/github-action-playground

  25. github-action-playground

    GitHub Actions playground repository for testing and experimenting with workflows and actions

    I very much agree here. I've had the best luck when there is as little as possible config in CI as possible:

    - mise for lang config

    - direnv for environment loading

    - op for secret injection

    - justfile for lint, build, etc

    Here's a template repo that I've been working on that has all of this implemented:

    https://github.com/iloveitaly/python-starter-template

    It's more complex than I would like it to be, but it's consistent and avoids having to deal with GHA too much.

    I've also found having a GHA playground is helpful:

    https://github.com/iloveitaly/github-action-playground

  26. Ruby on Rails

    Ruby on Rails

    Once again, Rails is ahead of the curve on this:

    https://github.com/rails/rails/pull/54693

  27. kubernetes

    Production-Grade Container Scheduling and Management

  28. cloud-init

    Discontinued MOVED: now at https://opendev.org/x/cloud-init (by openstack-archive)

  29. gitlab

  30. Ansible

    Ansible is a radically simple IT automation platform that makes your applications and systems easier to deploy and maintain. Automate everything from code deployment to network configuration to cloud management, in a language that approaches plain English, using SSH, with no agents to install on remote systems. https://docs.ansible.com.

  31. awesome-nix

    😎 A curated list of the best resources in the Nix community [maintainer=@cyntheticfox]

    > Would Nix work well with GitHub Actions?

    You can use Nix with GitHub actions since there is a Nix GitHub action: https://github.com/marketplace/actions/install-nix. Every time the action is triggered, Nix rebuilds everything, but thanks to its caching (need to be configured), it only rebuilds targets that has changed.

    > How do you automate running tests and deploying to dev on every push

    Nix is a build tool and it's main purpose is not to deploy artifacts. There are however a lot of tools to deploy artifacts built by Nix: https://github.com/nix-community/awesome-nix?tab=readme-ov-f...

    Note there are also several Nix CI that can do a better job than a raw GitHub actions, because they are designed for Nix (Hydra, Garnix, Hercules, ...).

  32. fastlane

    🚀 The easiest way to automate building and releasing your iOS and Android apps

  33. pkl-gha

    A Pkl (https://pkl-lang.org/) template for writing GitHub Action workflows

    Did you consider Pkl instead of Yaml to write your GitHub actions?

    https://github.com/StefMa/pkl-gha

    It could save you already some time.

  34. quitsh

    A build-tooling CLI Go framework designed to replace duck-typed scripting languages. (supports Nix)

    - If you use a CI system, gitlab, circle etc, use one which does not do stupid things with your containers (like Github: 4 years! old f** up: https://github.com/actions/runner/issues/863#issuecomment-25...)

    Thats why we built our own build tool which does that, or at least helps us doing the above things:

    https://github.com/sdsc-ordes/quitsh

  35. SaaSHub

    SaaSHub - Software Alternatives and Reviews. SaaSHub helps you find the best software and product alternatives

    SaaSHub logo
NOTE: The number of mentions on this list indicates mentions on common posts plus user suggested alternatives. Hence, a higher number means a more popular project.

Suggest a related project

Related posts