REPOSITORY CALLER
Trigger + declared inputs
Events, supported runtime values, environment intent and the minimum permissions granted to the called workflow.
ENGINEERING ARTICLE / DELIVERY ARCHITECTURE
A platform migration should not preserve every duplication simply because the old system made it familiar.
See the architecture01 / THE TRANSLATION TRAP
During the migration from Azure DevOps and TFS to GitHub, the pipelines had to move too. The fastest-looking approach was to translate each classic pipeline into its own GitHub Actions workflow: old pipeline in, equivalent YAML out.
That would have delivered a familiar shape on a new platform. It also would have preserved the one-to-one ratio—and every duplicated convention embedded inside it.
Moving technical debt to a newer platform does not make it less technical debt.
I chose to create reusable workflows and reduce the one-to-one pattern through common practices. The goal was not to make every repository identical. It was to stop asking every repository to independently solve the same delivery problems.
BEFORE / COPIED OWNERSHIP
Repeated validation, permissions, packaging and evidence behavior drift independently.
AFTER / SHARED CONTRACT
Common controls and evidence change in one reviewed boundary.
02 / FIND THE CONTRACT
| Classic-pipeline symptom | Platform question | Reusable boundary |
|---|---|---|
| The same validation is defined repeatedly. | Which checks must every participating repository execute? | Shared validation stages and a consistent required-check contract. |
| Packaging differs mostly by names and paths. | Which values are true variation, and which are copied implementation? | Typed inputs for supported variation; shared packaging and evidence behavior. |
| Deployment credentials are handled in each pipeline. | Can identity and permission boundaries be defined once and constrained per caller? | A shared authentication pattern with explicit caller permissions and environments. |
| Every failure produces different evidence. | What must an operator be able to inspect after any run? | Consistent summaries, artifacts, exit behavior and retention expectations. |
| Exceptions are hidden in copied steps. | Is the difference a real product need or accumulated drift? | A named input, a supported extension point or an explicitly separate workflow. |
03 / REFERENCE ARCHITECTURE
The repository owns when work runs and supplies approved variation. The shared workflow owns the common delivery mechanism. Its outputs give later promotion work something explicit to consume.
REPOSITORY CALLER
Events, supported runtime values, environment intent and the minimum permissions granted to the called workflow.
SHARED WORKFLOW
The versioned contract executes common checks, produces consistent evidence and exposes deliberate outputs.
CONTROLLED OUTPUT
A traceable result can move into an environment-specific approval, deployment or release process.
GitHub implements this boundary with reusable workflows declared through workflow_call. Inputs and secrets become part of the called workflow’s interface, while the caller invokes the workflow as a job. That mechanism matters; the architecture matters more.
A reusable workflow is useful when it represents a stable contract. A giant YAML file with dozens of switches is merely a different place to hide duplication.
04 / OWNERSHIP BOUNDARY
The boundary is a product decision. If the platform team centralizes application-specific behavior, it becomes a ticket queue. If every repository owns the delivery mechanism, standards decay back into copies. The useful middle is a constrained interface with clear ownership on both sides.
05 / SECURITY AS CONTRACT
Shared automation increases the importance of its trust boundary. Callers should grant explicit permissions rather than treating inherited secrets as a convenience layer. Cross-repository workflow references need deliberate versioning; GitHub identifies a full commit SHA as the safest reference for stability and security.
For cloud access, OpenID Connect is the reference pattern I would favor when the provider and organization support it: the workflow exchanges its GitHub identity for a short-lived cloud token instead of storing a long-lived cloud credential in GitHub. That is an architectural recommendation here, not a claim about the client implementation.
Reusable workflows also do not replace GHAS. CodeQL, secret scanning, dependency security, Dependabot, policy, remediation and developer education remain part of the wider developer platform. The workflow should make those controls consistent without pretending that enabling a scanner completes the security program.
06 / MIGRATION SEQUENCE
Capture triggers, agents, feeds, service connections, artifacts, approvals and dependencies. Unknowns stay visible.
Find repeated behavior and separate genuine application differences from historical drift.
Expose supported variation as deliberate inputs. Keep application-specific work outside the shared core.
Choose ordinary and difficult consumers. Compare observable outcomes and preserve a recovery path.
Adopt the shared workflow in controlled groups, keeping exceptions explicit rather than forking the entire implementation.
Confirm required checks, artifacts, permissions, promotion behavior and operator evidence before removing the previous pipeline.
07 / FAILURE MODES
One workflow attempts to serve every language, product and deployment model until nobody can reason about it.
Every exception becomes another switch. The interface grows, combinations multiply and the shared path becomes harder to test.
Secrets and permissions spread farther than the contract requires, turning reuse into a larger trust surface.
A shared workflow changes beneath every consumer at once. Adoption becomes accidental instead of reviewed.
08 / WHAT THE WORK SUPPORTS
The professional record supports a clear claim: while converting classic Azure DevOps pipelines to GitHub Actions, I created reusable workflows and moved away from a one-to-one pipeline ratio through common practices.
It does not preserve a defensible count of workflows before and after, a measured maintenance reduction or a quantified change-failure improvement. I will not invent those numbers for a cleaner headline.
LET’S TALK
I’m looking for Senior DevOps and Platform Engineering opportunities where I can improve cloud delivery, build useful automation and help teams do their best work.
bailey.n.fitchett@gmail.comAPPLY THE APPROACH TO YOUR ENVIRONMENT
Review one pipeline for fragile handoffs, duplicated logic and unclear release contracts.
Separate consulting assessment. The evidence and limitations above remain specific to the original project or demonstration.
Email WitchOps Explore the assessment ↗