GitHub Actions is a seriously flawed CI system
I am just going to bullet point some of the shortcomings that make it practically unusable for any serious deployment:
* You cannot view logs of ongoing jobs. If you navigate to a job view after a task has already started, all you are going to see is a spinner. The job might be stuck in a loop, there might be an error, etc. You won't know until the job ends.
* You cannot define which jobs have to _always_ run, i.e. setup and teardown. Suppose you have a matrix of test runners. You need to setup the test environment before jobs start and teardown after they finish. You have the ability to do that on the happy path, but if one of the shards fails and it needs to be retried, there is no way to tell CI to "you must re-run the setup step before retrying this job"
* You cannot restrict when CI jobs should run, e.g. Let's say you want to NOT run jobs for Draft PRs. You may try to add `if: github.event.pull_request.draft == false` but that has two serious drawbacks: 1) check will be reported as passed even though it didn't run 2) updating PR from Draft -> Ready does not trigger
* You cannot reliably cancel jobs. Sometimes jobs just get stuck and no amount of "Cancel job" requests do anything. The only thing that eventually stops them is the timeout (tip: set timeout for every step exactly for this reason)
* There is no built-in mechanism for retries.
* You cannot manually retry a particular job until every job in the workflow has finished.
This is a non-exhaustive list.