Checkout, set up PHP, restore the Composer cache, install — repeated in nine jobs across four workflows, with three of them a version behind. The shell key on…
A fresh runner has an empty build cache, so every pipeline run rebuilds every layer unless the cache is exported somewhere the next run can reach. mode=max exports…
A manually triggered workflow with typed inputs replaces a shell script that lives on one person’s laptop. Defaulting the destructive flag to the safe value is the detail…
October brought configurable runner sizes, which turns a slow pipeline into a pricing question rather than an engineering one. Measuring what a job actually uses before upgrading is…
A workflow with a path filter does not run when nothing matched, and a required status check that never runs blocks the pull request forever. The duplicate-workflow trick…
The default token has write access to most of the repository, and declaring a permissions block switches the job to exactly what is listed. Declaring it at the…