Skip to content
steelabs

CI/CD & tooling

GitHub Actions

CI that lives in the repository it builds.

GitHub Actions in practice

What it is

A continuous integration service configured by YAML files committed alongside the code. Workflows respond to repository events — a push, a pull request, a schedule, a manual trigger — and run jobs on hosted or self-hosted machines. Its distinguishing property is proximity: the pipeline definition is versioned with the code it builds, reviewed in the same pull request, and branches with it, so a change to the build and the change that required it arrive together rather than in two systems that have to be kept in step by hand.

Where we use it

It is where most of the test automation we hand over actually runs. A typical arrangement executes unit and API tests on every pull request, a browser suite against a deployed preview, dependency and accessibility checks in the same job graph, and a scheduled longer run overnight. It is also the mechanism behind the gating conversation that every automation engagement eventually has — which failures should block a merge and which should be reported without stopping anybody.

Limitations

  • YAML at scale becomes its own maintenance problem. Composite actions and reusable workflows help, but there is no type system and no compiler, so a mistake surfaces as a failed run rather than as an error while editing.

  • Debugging is slow by construction. The feedback loop for a pipeline change is commit, push, wait, read the log, and local runners reproduce the environment only approximately.

  • Hosted runners are modest machines. A browser suite with meaningful parallelism outgrows them, and the answer is either paying for larger instances or maintaining self-hosted runners, which is infrastructure work somebody now owns.

  • Third-party actions are dependencies with write access to your pipeline. Pinning to a commit rather than a moving tag is not optional, and reviewing what a popular action actually does is work most teams skip.

  • Billing surprises teams that leave matrix builds unbounded. Minutes are consumed per job per platform, and a matrix that seemed reasonable at three entries behaves differently at thirty.

FAQ

GitHub Actions questions we hear often

Should every test run on every pull request?

No, and trying is the most common way a pipeline becomes something people route around. Fast, deterministic checks belong on every pull request because they are cheap and their verdict is trustworthy. Long browser suites, load runs and full cross-browser matrices belong on merges to the main branch or on a schedule. The deciding question is whether a failure should stop a merge; if it should not, it does not belong in the blocking set.

Hosted or self-hosted runners?

Start hosted and move only when a specific constraint forces it — sustained parallelism, an unusual hardware requirement, or network access to something private. Self-hosted runners are servers, with the patching, isolation and capacity planning that implies, and a runner reused between jobs without a clean environment reintroduces exactly the shared-state flakiness the pipeline was meant to eliminate.

How do secrets work for test environments?

Repository or environment secrets injected at run time, never values committed to the workflow file. The detail teams miss is that secrets are not exposed to workflows triggered by pull requests from forks, which is deliberate and which is why an external contribution cannot run the suite that needs credentials. Plan for that rather than discovering it during a contribution.

Contact

Wondering if this is the right tool?

Describe what you are trying to verify and we will tell you which instrument fits, including when the answer is one we do not use.