Platform Help

CI/CD Overview

The Platform treats CI/CD as a first-class system, not a per-repository concern.

Instead of each application defining and maintaining its own pipelines, the Platform centralizes build, test, and release logic into versioned, reusable workflows that applications opt into. This shifts CI/CD from duplicated configuration to shared infrastructure.

The result is consistency without rigidity, and automation that scales with the number of products rather than against it.

Why Centralize CI/CD

Before the Platform, every repository owned its own CI/CD configuration. Over time, this led to:

  • duplicated pipelines with small, inconsistent variations

  • drift in tooling, Node versions, and release behavior

  • fragile scripts maintained in isolation

  • unclear ownership when builds failed

As the number of applications grew, CI/CD became an operational liability.

Centralizing workflows allows the Platform to own correctness, while applications retain control over when and how workflows are invoked.

Core Idea: Opt-In Workflows

Applications do not inherit CI/CD behavior implicitly.

Instead, they explicitly opt in by invoking Platform workflows from their local pipelines. This inversion of control is intentional.

Applications declare intent. The Platform owns execution.

This makes CI/CD behavior:

  • predictable

  • versioned

  • reviewable

  • shared across products

High-Level Workflow Model

The diagram below shows how an application delegates CI/CD responsibilities to the Platform.

"Platform (Writerside Build + Deploy)""App (Opt-in Workflow)"App RepositoryGitHub Actions ContextGitHub Actions RunnerDocumentation BuildersGitHub APIProvides repo metadata, ref, SHA,permissions, secrets, workflow inputsalt[Workflow Successful][Workflow Failed]Trigger local CI workflowTrigger Writerside Documentation WorkflowInstall DependenciesBuild Docs via Writerside Docker BuilderReturn Artifacts (site + report.json)Save + Unzip ArtifactConfigure GitHub PagesReport SuccessNext StepUpload Docs ArtifactDeploy to GitHub PagesMark as SuccessfulReport FailureMark with ErrorsApp RepositoryGitHub Actions ContextGitHub Actions RunnerDocumentation BuildersGitHub API

What Lives in the Platform

Platform-owned workflows encapsulate:

  • linting and type checking

  • test orchestration

  • semantic versioning and tagging

  • artifact generation

  • documentation builds

  • deployment logic

Applications do not reimplement these steps. They consume them as stable, versioned building blocks.

What Lives in Applications

Applications retain ownership of:

  • when workflows are triggered

  • which workflows are invoked

  • repository-specific inputs and secrets

  • environment-level decisions

This keeps application repositories thin while preserving autonomy.

GitHub Context as the Integration Layer

Reusable workflows rely on GitHub Actions Context rather than hardcoded configuration.

This allows the Platform to adapt behavior based on:

  • repository metadata

  • branch and tag information

  • commit SHA

  • permissions and secrets

By using context instead of static configuration, workflows remain generic while still behaving correctly for each application.

Failure Modes and Debugging

Centralizing CI/CD improves failure visibility:

  • failures occur in a single, known location

  • logs are consistent across repositories

  • fixes are applied once and propagate everywhere

This dramatically reduces time spent debugging pipeline issues across multiple products.

Why This Scales

This model scales because:

  • CI/CD logic is written once

  • changes are versioned and reviewed

  • adoption is explicit and reversible

  • complexity grows linearly, not exponentially

A single developer can operate multiple production systems without managing multiple bespoke pipelines.

Relationship to Architecture

CI/CD is intentionally decoupled from application runtime architecture.

It interacts with applications through contracts (workflow inputs and outputs), not through code-level dependencies. This mirrors the same boundary discipline used in domains and packages.

Last modified: 18 December 2025