09meta
Deployed from a Workflow: This Post Is the Test
A live deployment test: this post was committed, built by GitHub Actions, published by the pages deploy workflow, and verified at its public URL. If you can read this, the pipeline works end to end.
Every blog claims its deploy pipeline works. This post is the proof for this one.
It was written as a markdown file, committed to main, and picked up by .github/workflows/deploy.yml — the workflow that checks file casing, runs the test suite, compiles the Tailwind CSS, generates the static site, gates it through the site audit and cross-engine checks, uploads the artifact, and deploys it to GitHub Pages.
If this page renders at its own URL, then every link in that chain held.
What the deployment actually does
The pipeline is deliberately boring to describe and strict in practice:
- Casing check first. A file committed as
foo.csprojwhile the solution referencesFoo.csprojbuilds on Windows and explodes on the Linux runner. The gate names that cause in one line instead of failing mysteriously. - Tests. The generator and its golden-file tests run before anything is published.
- CSS. Tailwind compiles both the public and admin stylesheets with the CLI, no Node runtime needed.
- Generation. The static site is generated from
content/— including this post. - Quality gates. The site audit (crawlability, canonicals, sitemap) and the cross-engine CSS check run against the built output. A regression fails the deploy.
- Deploy. The artifact goes to the
github-pagesenvironment via OpenID Connect — no personal access token exists anywhere in this pipeline.
Why there is no token in this repository
The workflow declares permissions: contents: read, pages: write, id-token: write. GitHub issues a short-lived OIDC token to the job, and actions/deploy-pages exchanges it for a Pages deployment. There is no PAT to leak, rotate, or accidentally commit — the safest token is the one that does not exist.
The setting that made this possible
Until today the repository's Pages source was "Deploy from a branch", which meant GitHub's legacy Jekyll builder also published on every push and raced this workflow for the same URL. The source now reads GitHub Actions, so this workflow is the only publisher.
This is the same pipeline that built the first post, and the one that renders the mermaid diagrams elsewhere on this site.
Mehrshad @mehrshad
Backend engineer (~5 years .NET). Clean Architecture, security, and systems that hold up at scale. Personality between INTJ and ISTJ — S and N at 50/50.
05adjacent
Every Mermaid Diagram, Rendered Live
A full capability check of the mermaid pipeline: flowcharts, sequences, ER, journeys, gantt, pie, git graphs, mindmaps and quadrants, all rendered in the browser.
A Persian Palette for an Engineer's Blog
Why this blog is inked with lajvard, firouzeh, and zafaran instead of the default blue-purple gradient, and where each color comes from.
Hello, StaticBlaze
First light for a blog that is just a folder of markdown, a generator, and GitHub Pages. What this thing is and how a page gets made.