ci-cd

  • .NET Core 3.0 publishes a single executable file

    3.0 arrived in September and can produce one file containing the application, its dependencies and the runtime — which changes what deployment means compared with a PHP release…

  • A pipeline that fails fast is a pipeline people trust

    A twelve-minute pipeline that reports a lint failure at minute eleven trains people to push and switch tasks, which is the opposite of what CI is for. Ordering…

  • Caching composer and node_modules in CI, correctly

    Caching the installed directories means a stale cache silently ships the wrong dependency versions; caching the package manager’s download cache does not. Keying on the lock files means…

  • PHPUnit 8 and the deprecations with a deadline

    void return types on setUp, and a fatal error rather than a warning. The mechanical pass, the one it cannot do, and the assertion split that is not…

  • BuildKit is the default in 19.03, and it is faster for a reason

    The old builder executes every instruction in order on one goroutine. BuildKit builds a graph, runs independent branches concurrently, and skips stages nothing depends on. The concurrency is…

  • The lock file is the artefact, not the manifest

    composer.json describes what is acceptable; composer.lock describes what was tested. Deploys that run update rather than install are resolving fresh on every release and shipping something no one…

  • COPY the lock file before the source, always

    Docker caches per instruction, and the cache is invalidated by the first changed file. Copying the whole source before installing dependencies means every code change reinstalls everything. The…

  • A content security policy that does not break the site

    The header is one line. The work is finding out what it will break — which means report-only for weeks, and reading violations that are mostly not your…

  • Bitbucket Pipelines caching, and the build minutes it saves

    A pipeline that downloads the same eighty packages on every push is spending most of its allowance on the network, and the fix is four lines. The named…

  • Testing what the database actually does

    The repository test passed against a mock and failed against MySQL. A mock asserts what you believe the database does, which is the thing in question.