<p>I recently watched a YouTube video of someone working on their software.</p>
<p>Everything was working locally, but things were breaking in their CI pipeline.</p>
<p>The issue was their CI environment had different versions of the software than the one they were using locally.</p>
<p>To get the same results locally and in CI, you need your dependencies to be the same.</p>
<p>The same versions of languages, such as PHP and nodejs, and packages like PHPStan, PHPUnit, Jest or eslint.</p>
<p>Dependencies should be installed with a package manager that generates a lock file like composer.lock or package-lock.json, so use these versions instead of installing versions globally that may be different.</p>
<p>For PHP or nodejs, I'd suggest using Docker or Nix, <a href="/daily/2025/01/20/reproducible">which has its own lock file</a>, to make your environment as reproducible and consistent as possible.</p>
format:full_html
processed:|
<p>I recently watched a YouTube video of someone working on their software.</p>
<p>Everything was working locally, but things were breaking in their CI pipeline.</p>
<p>The issue was their CI environment had different versions of the software than the one they were using locally.</p>
<p>To get the same results locally and in CI, you need your dependencies to be the same.</p>
<p>The same versions of languages, such as PHP and nodejs, and packages like PHPStan, PHPUnit, Jest or eslint.</p>
<p>Dependencies should be installed with a package manager that generates a lock file like composer.lock or package-lock.json, so use these versions instead of installing versions globally that may be different.</p>
<p>For PHP or nodejs, I'd suggest using Docker or Nix, <a href="/daily/2025/01/20/reproducible">which has its own lock file</a>, to make your environment as reproducible and consistent as possible.</p>