Columbia Games · CCM v2 / August 2026 26.
We moved deployment logic out of GitHub YAML so it could finally be tested properly
The production workflow had accumulated too much inline shell logic. Deployment decisions moved into a versioned, self-tested server script, leaving the GitHub workflow as a thin SSH orchestration layer.
Situation
It is easy to add shell commands to CI YAML, but beyond a certain point the workflow becomes orchestration, business rules and deployment program all at once. It is difficult to execute locally, difficult to cover with regression tests, and quoting problems often appear only on a GitHub runner. The CCM production pipeline had reached that point.
Approach
I moved server-side change detection, migration ordering, build and restart decisions, and verification into a dedicated script. The GitHub workflow kept responsibility for credentials, artifacts and SSH orchestration. The server script then received its own shell regressions and self-tests, allowing flag parsing and fail-safe behaviour to be exercised in CI without performing a real production deployment.
Outcome
The YAML became shorter and easier to review, while the dangerous part of the deployment logic became ordinary version-controlled code. A parser bug or a new flag could be tested in a pull request instead of using a production run as the experiment.