diff --git a/lib/modules/manager/composer/__snapshots__/artifacts.spec.ts.snap b/lib/modules/manager/composer/__snapshots__/artifacts.spec.ts.snap
deleted file mode 100644
index 65edb586d3be05d819028d8328edabda4fe3fe4e..0000000000000000000000000000000000000000
--- a/lib/modules/manager/composer/__snapshots__/artifacts.spec.ts.snap
+++ /dev/null
@@ -1,387 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`modules/manager/composer/artifacts adds all ignorePlatformReq items 1`] = `
-[
-  {
-    "cmd": "composer update --with-dependencies --ignore-platform-req ext-posix --ignore-platform-req ext-sodium --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "COMPOSER_CACHE_DIR": "/tmp/renovate/cache/others/composer",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/composer/artifacts catches errors 1`] = `
-[
-  {
-    "artifactError": {
-      "lockFile": "composer.lock",
-      "stderr": "not found",
-    },
-  },
-]
-`;
-
-exports[`modules/manager/composer/artifacts catches unmet requirements errors 1`] = `
-[
-  {
-    "artifactError": {
-      "lockFile": "composer.lock",
-      "stderr": "fooYour requirements could not be resolved to an installable set of packages.bar",
-    },
-  },
-]
-`;
-
-exports[`modules/manager/composer/artifacts disable plugins when configured locally 1`] = `
-[
-  {
-    "cmd": "composer update foo bar --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "COMPOSER_CACHE_DIR": "/tmp/renovate/cache/others/composer",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/composer/artifacts disables ignorePlatformReqs 1`] = `
-[
-  {
-    "cmd": "composer update --with-dependencies --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "COMPOSER_CACHE_DIR": "/tmp/renovate/cache/others/composer",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/composer/artifacts does not disable plugins when configured globally 1`] = `
-[
-  {
-    "cmd": "composer update foo bar --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "COMPOSER_CACHE_DIR": "/tmp/renovate/cache/others/composer",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/composer/artifacts installs before running the update when symfony flex is installed 1`] = `
-[
-  {
-    "cmd": "composer install --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "COMPOSER_CACHE_DIR": "/tmp/renovate/cache/others/composer",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "COMPOSER_CACHE_DIR": "/tmp/renovate/cache/others/composer",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/composer/artifacts installs before running the update when symfony flex is installed as dev 1`] = `
-[
-  {
-    "cmd": "composer install --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "COMPOSER_CACHE_DIR": "/tmp/renovate/cache/others/composer",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "COMPOSER_CACHE_DIR": "/tmp/renovate/cache/others/composer",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/composer/artifacts performs lockFileMaintenance 1`] = `
-[
-  {
-    "cmd": "composer update --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "COMPOSER_CACHE_DIR": "/tmp/renovate/cache/others/composer",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/composer/artifacts returns null if unchanged 1`] = `
-[
-  {
-    "cmd": "composer update foo bar --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "COMPOSER_CACHE_DIR": "/tmp/renovate/cache/others/composer",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/composer/artifacts returns updated composer.lock 1`] = `
-[
-  {
-    "cmd": "composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "COMPOSER_CACHE_DIR": "/tmp/renovate/cache/others/composer",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/composer/artifacts supports docker mode 1`] = `
-[
-  {
-    "cmd": "docker pull renovate/php:7.3",
-    "options": {
-      "encoding": "utf-8",
-    },
-  },
-  {
-    "cmd": "docker ps --filter name=renovate_php -aq",
-    "options": {
-      "encoding": "utf-8",
-    },
-  },
-  {
-    "cmd": "docker run --rm --name=renovate_php --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e COMPOSER_CACHE_DIR -e BUILDPACK_CACHE_DIR -w "/tmp/github/some/repo" renovate/php:7.3 bash -l -c "install-tool composer 1.10.17 && composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins"",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "BUILDPACK_CACHE_DIR": "/tmp/renovate/cache/buildpack",
-        "COMPOSER_CACHE_DIR": "/tmp/renovate/cache/others/composer",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/composer/artifacts supports global mode 1`] = `
-[
-  {
-    "cmd": "composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "COMPOSER_CACHE_DIR": "/tmp/renovate/cache/others/composer",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/composer/artifacts supports vendor directory update 1`] = `
-[
-  {
-    "cmd": "composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "COMPOSER_CACHE_DIR": "/tmp/renovate/cache/others/composer",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/composer/artifacts uses hostRules to set COMPOSER_AUTH 1`] = `
-[
-  {
-    "cmd": "composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "COMPOSER_AUTH": "{"github-oauth":{"github.com":"github-token"},"gitlab-token":{"gitlab.com":"gitlab-token"},"gitlab-domains":["gitlab.com"],"http-basic":{"packagist.renovatebot.com":{"username":"some-username","password":"some-password"},"artifactory.yyyyyyy.com":{"username":"some-other-username","password":"some-other-password"}},"bearer":{"packages-bearer.example.com":"abcdef0123456789"}}",
-        "COMPOSER_CACHE_DIR": "/tmp/renovate/cache/others/composer",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
diff --git a/lib/modules/manager/composer/artifacts.spec.ts b/lib/modules/manager/composer/artifacts.spec.ts
index 283d9e6dc2e206eb38602be8e4e84b57bcf3700c..b0ebaf7832019b129318bf9ea30f585a2aa5e2a3 100644
--- a/lib/modules/manager/composer/artifacts.spec.ts
+++ b/lib/modules/manager/composer/artifacts.spec.ts
@@ -17,6 +17,8 @@ jest.mock('../../datasource');
 jest.mock('../../../util/fs');
 jest.mock('../../../util/git');
 
+process.env.BUILDPACK = 'true';
+
 const datasource = mocked(_datasource);
 
 const config: UpdateArtifactsConfig = {
@@ -93,7 +95,17 @@ describe('modules/manager/composer/artifacts', () => {
         config,
       })
     ).toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'composer update foo bar --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction',
+        options: {
+          cwd: '/tmp/github/some/repo',
+          env: {
+            COMPOSER_CACHE_DIR: '/tmp/renovate/cache/others/composer',
+          },
+        },
+      },
+    ]);
   });
 
   it('uses hostRules to set COMPOSER_AUTH', async () => {
@@ -145,7 +157,19 @@ describe('modules/manager/composer/artifacts', () => {
         config: authConfig,
       })
     ).toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins',
+        options: {
+          cwd: '/tmp/github/some/repo',
+          env: {
+            COMPOSER_AUTH:
+              '{"github-oauth":{"github.com":"github-token"},"gitlab-token":{"gitlab.com":"gitlab-token"},"gitlab-domains":["gitlab.com"],"http-basic":{"packagist.renovatebot.com":{"username":"some-username","password":"some-password"},"artifactory.yyyyyyy.com":{"username":"some-other-username","password":"some-other-password"}},"bearer":{"packages-bearer.example.com":"abcdef0123456789"}}',
+            COMPOSER_CACHE_DIR: '/tmp/renovate/cache/others/composer',
+          },
+        },
+      },
+    ]);
   });
 
   it('returns updated composer.lock', async () => {
@@ -163,8 +187,21 @@ describe('modules/manager/composer/artifacts', () => {
         newPackageFileContent: '{}',
         config,
       })
-    ).not.toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
+    ).toEqual([
+      {
+        file: {
+          contents: '{}',
+          path: 'composer.lock',
+          type: 'addition',
+        },
+      },
+    ]);
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
   });
 
   it('supports vendor directory update', async () => {
@@ -190,14 +227,42 @@ describe('modules/manager/composer/artifacts', () => {
       newPackageFileContent: '{}',
       config,
     });
-    expect(res).not.toBeNull();
-    expect(res?.map(({ file }) => file)).toEqual([
-      { type: 'addition', path: 'composer.lock', contents: '{  }' },
-      { type: 'addition', path: foo, contents: 'Foo' },
-      { type: 'addition', path: bar, contents: 'Bar' },
-      { type: 'deletion', path: baz },
+    expect(res).toEqual([
+      {
+        file: {
+          contents: '{  }',
+          path: 'composer.lock',
+          type: 'addition',
+        },
+      },
+      {
+        file: {
+          contents: 'Foo',
+          path: 'vendor/foo/Foo.php',
+          type: 'addition',
+        },
+      },
+      {
+        file: {
+          contents: 'Bar',
+          path: 'vendor/bar/Bar.php',
+          type: 'addition',
+        },
+      },
+      {
+        file: {
+          path: 'vendor/baz/Baz.php',
+          type: 'deletion',
+        },
+      },
+    ]);
+
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
     ]);
-    expect(execSnapshots).toMatchSnapshot();
   });
 
   it('performs lockFileMaintenance', async () => {
@@ -218,8 +283,21 @@ describe('modules/manager/composer/artifacts', () => {
           isLockFileMaintenance: true,
         },
       })
-    ).not.toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
+    ).toEqual([
+      {
+        file: {
+          contents: '{  }',
+          path: 'composer.lock',
+          type: 'addition',
+        },
+      },
+    ]);
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'composer update --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins',
+        options: { cwd: '/tmp/github/some/repo', encoding: 'utf-8' },
+      },
+    ]);
   });
 
   it('supports docker mode', async () => {
@@ -252,9 +330,107 @@ describe('modules/manager/composer/artifacts', () => {
         newPackageFileContent: '{}',
         config: { ...config, constraints: { composer: '^1.10.0', php: '7.3' } },
       })
-    ).not.toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
-    expect(execSnapshots).toHaveLength(3);
+    ).toEqual([
+      {
+        file: {
+          contents: '{  }',
+          path: 'composer.lock',
+          type: 'addition',
+        },
+      },
+    ]);
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'docker pull renovate/php:7.3',
+        options: {
+          encoding: 'utf-8',
+        },
+      },
+      {
+        cmd: 'docker ps --filter name=renovate_php -aq',
+        options: {
+          encoding: 'utf-8',
+        },
+      },
+      {
+        cmd:
+          'docker run --rm --name=renovate_php --label=renovate_child ' +
+          '-v "/tmp/github/some/repo":"/tmp/github/some/repo" ' +
+          '-v "/tmp/renovate/cache":"/tmp/renovate/cache" ' +
+          '-e COMPOSER_CACHE_DIR ' +
+          '-e BUILDPACK_CACHE_DIR ' +
+          '-w "/tmp/github/some/repo" ' +
+          'renovate/php:7.3' +
+          ' bash -l -c "' +
+          'install-tool composer 1.10.17' +
+          ' && ' +
+          'composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins' +
+          '"',
+        options: {
+          cwd: '/tmp/github/some/repo',
+          env: {
+            BUILDPACK_CACHE_DIR: '/tmp/renovate/cache/buildpack',
+            COMPOSER_CACHE_DIR: '/tmp/renovate/cache/others/composer',
+          },
+        },
+      },
+    ]);
+  });
+
+  it('supports install mode', async () => {
+    GlobalConfig.set({ ...adminConfig, binarySource: 'install' });
+    fs.readLocalFile.mockResolvedValueOnce('{}');
+
+    const execSnapshots = mockExecAll();
+
+    fs.readLocalFile.mockResolvedValueOnce('{  }');
+
+    datasource.getPkgReleases.mockResolvedValueOnce({
+      releases: [
+        { version: '7.2.34' },
+        { version: '7.3' }, // composer versioning bug
+        { version: '7.3.29' },
+        { version: '7.4.22' },
+        { version: '8.0.6' },
+      ],
+    });
+
+    git.getRepoStatus.mockResolvedValueOnce({
+      ...repoStatus,
+      modified: ['composer.lock'],
+    });
+
+    expect(
+      await composer.updateArtifacts({
+        packageFileName: 'composer.json',
+        updatedDeps: [],
+        newPackageFileContent: '{}',
+        config: { ...config, constraints: { composer: '^1.10.0', php: '7.3' } },
+      })
+    ).toEqual([
+      {
+        file: {
+          contents: '{  }',
+          path: 'composer.lock',
+          type: 'addition',
+        },
+      },
+    ]);
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'install-tool composer 1.10.17',
+      },
+      {
+        cmd: 'composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins',
+        options: {
+          cwd: '/tmp/github/some/repo',
+          env: {
+            BUILDPACK_CACHE_DIR: '/tmp/renovate/cache/buildpack',
+            COMPOSER_CACHE_DIR: '/tmp/renovate/cache/others/composer',
+          },
+        },
+      },
+    ]);
   });
 
   it('supports global mode', async () => {
@@ -273,11 +449,25 @@ describe('modules/manager/composer/artifacts', () => {
         newPackageFileContent: '{}',
         config,
       })
-    ).not.toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
+    ).toEqual([
+      {
+        file: {
+          contents: '{ }',
+          path: 'composer.lock',
+          type: 'addition',
+        },
+      },
+    ]);
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
   });
 
   it('catches errors', async () => {
+    const execSnapshots = mockExecAll();
     fs.readLocalFile.mockResolvedValueOnce('{}');
     fs.writeLocalFile.mockImplementationOnce(() => {
       throw new Error('not found');
@@ -289,10 +479,19 @@ describe('modules/manager/composer/artifacts', () => {
         newPackageFileContent: '{}',
         config,
       })
-    ).toMatchSnapshot([{ artifactError: { lockFile: 'composer.lock' } }]);
+    ).toEqual([
+      {
+        artifactError: {
+          lockFile: 'composer.lock',
+          stderr: 'not found',
+        },
+      },
+    ]);
+    expect(execSnapshots).toBeEmptyArray();
   });
 
   it('catches unmet requirements errors', async () => {
+    const execSnapshots = mockExecAll();
     const stderr =
       'fooYour requirements could not be resolved to an installable set of packages.bar';
     fs.readLocalFile.mockResolvedValueOnce('{}');
@@ -306,12 +505,12 @@ describe('modules/manager/composer/artifacts', () => {
         newPackageFileContent: '{}',
         config,
       })
-    ).toMatchSnapshot([
-      { artifactError: { lockFile: 'composer.lock', stderr } },
-    ]);
+    ).toEqual([{ artifactError: { lockFile: 'composer.lock', stderr } }]);
+    expect(execSnapshots).toBeEmptyArray();
   });
 
   it('throws for disk space', async () => {
+    const execSnapshots = mockExecAll();
     fs.readLocalFile.mockResolvedValueOnce('{}');
     fs.writeLocalFile.mockImplementationOnce(() => {
       throw new Error(
@@ -326,6 +525,7 @@ describe('modules/manager/composer/artifacts', () => {
         config,
       })
     ).rejects.toThrow();
+    expect(execSnapshots).toBeEmptyArray();
   });
 
   it('disables ignorePlatformReqs', async () => {
@@ -346,8 +546,21 @@ describe('modules/manager/composer/artifacts', () => {
           composerIgnorePlatformReqs: undefined,
         },
       })
-    ).not.toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
+    ).toEqual([
+      {
+        file: {
+          contents: '{ }',
+          path: 'composer.lock',
+          type: 'addition',
+        },
+      },
+    ]);
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'composer update --with-dependencies --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
   });
 
   it('adds all ignorePlatformReq items', async () => {
@@ -368,8 +581,21 @@ describe('modules/manager/composer/artifacts', () => {
           composerIgnorePlatformReqs: ['ext-posix', 'ext-sodium'],
         },
       })
-    ).not.toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
+    ).toEqual([
+      {
+        file: {
+          contents: '{ }',
+          path: 'composer.lock',
+          type: 'addition',
+        },
+      },
+    ]);
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'composer update --with-dependencies --ignore-platform-req ext-posix --ignore-platform-req ext-sodium --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
   });
 
   it('installs before running the update when symfony flex is installed', async () => {
@@ -391,9 +617,25 @@ describe('modules/manager/composer/artifacts', () => {
           ...config,
         },
       })
-    ).not.toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
-    expect(execSnapshots).toHaveLength(2);
+    ).toEqual([
+      {
+        file: {
+          contents: '{ }',
+          path: 'composer.lock',
+          type: 'addition',
+        },
+      },
+    ]);
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'composer install --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
   });
 
   it('installs before running the update when symfony flex is installed as dev', async () => {
@@ -415,9 +657,25 @@ describe('modules/manager/composer/artifacts', () => {
           ...config,
         },
       })
-    ).not.toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
-    expect(execSnapshots).toHaveLength(2);
+    ).toEqual([
+      {
+        file: {
+          contents: '{ }',
+          path: 'composer.lock',
+          type: 'addition',
+        },
+      },
+    ]);
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'composer install --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins',
+        options: { cwd: '/tmp/github/some/repo', encoding: 'utf-8' },
+      },
+      {
+        cmd: 'composer update --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins',
+        options: { cwd: '/tmp/github/some/repo', encoding: 'utf-8' },
+      },
+    ]);
   });
 
   it('does not disable plugins when configured globally', async () => {
@@ -434,7 +692,12 @@ describe('modules/manager/composer/artifacts', () => {
         config,
       })
     ).toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'composer update foo bar --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
   });
 
   it('disable plugins when configured locally', async () => {
@@ -454,6 +717,11 @@ describe('modules/manager/composer/artifacts', () => {
         },
       })
     ).toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'composer update foo bar --with-dependencies --ignore-platform-reqs --no-ansi --no-interaction --no-scripts --no-autoloader --no-plugins',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
   });
 });
diff --git a/lib/modules/manager/gomod/__snapshots__/artifacts.spec.ts.snap b/lib/modules/manager/gomod/__snapshots__/artifacts.spec.ts.snap
deleted file mode 100644
index 5cd82d506de5166ac993172700d7cce83a185ec5..0000000000000000000000000000000000000000
--- a/lib/modules/manager/gomod/__snapshots__/artifacts.spec.ts.snap
+++ /dev/null
@@ -1,1008 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`modules/manager/gomod/artifacts catches errors 1`] = `[]`;
-
-exports[`modules/manager/gomod/artifacts does not execute go mod tidy when none of gomodTidy and gomodUpdateImportPaths are set 1`] = `
-[
-  {
-    "file": {
-      "contents": "New go.sum",
-      "path": "go.sum",
-      "type": "addition",
-    },
-  },
-  {
-    "file": {
-      "contents": "New main.go",
-      "path": "go.mod",
-      "type": "addition",
-    },
-  },
-]
-`;
-
-exports[`modules/manager/gomod/artifacts does not execute go mod tidy when none of gomodTidy and gomodUpdateImportPaths are set 2`] = `
-[
-  {
-    "cmd": "go get -d -t ./...",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/gomod/artifacts returns if no go.sum found 1`] = `[]`;
-
-exports[`modules/manager/gomod/artifacts returns null if unchanged 1`] = `
-[
-  {
-    "cmd": "go get -d -t ./...",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/gomod/artifacts returns updated go.sum 1`] = `
-[
-  {
-    "cmd": "go get -d -t ./...",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/gomod/artifacts skips gomodTidy without gomodUpdateImportPaths on major update 1`] = `
-[
-  {
-    "file": {
-      "contents": "New go.sum",
-      "path": "go.sum",
-      "type": "addition",
-    },
-  },
-  {
-    "file": {
-      "contents": "New main.go",
-      "path": "go.mod",
-      "type": "addition",
-    },
-  },
-]
-`;
-
-exports[`modules/manager/gomod/artifacts skips gomodTidy without gomodUpdateImportPaths on major update 2`] = `
-[
-  {
-    "cmd": "go get -d -t ./...",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/gomod/artifacts skips updating import paths for gopkg.in dependencies 1`] = `
-[
-  {
-    "cmd": "go get -d -t ./...",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "go mod tidy",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "go mod tidy",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/gomod/artifacts skips updating import paths with gomodUpdateImportPaths on v0 to v1 1`] = `
-[
-  {
-    "cmd": "go get -d -t ./...",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/gomod/artifacts supports docker mode with credentials 1`] = `
-[
-  {
-    "cmd": "docker pull renovate/go:latest",
-    "options": {
-      "encoding": "utf-8",
-    },
-  },
-  {
-    "cmd": "docker ps --filter name=renovate_go -aq",
-    "options": {
-      "encoding": "utf-8",
-    },
-  },
-  {
-    "cmd": "docker run --rm --name=renovate_go --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e GOPROXY -e GOPRIVATE -e GONOPROXY -e GONOSUMDB -e GOINSECURE -e GOFLAGS -e CGO_ENABLED -e GIT_CONFIG_KEY_0 -e GIT_CONFIG_VALUE_0 -e GIT_CONFIG_KEY_1 -e GIT_CONFIG_VALUE_1 -e GIT_CONFIG_KEY_2 -e GIT_CONFIG_VALUE_2 -e GIT_CONFIG_COUNT -e GIT_CONFIG_KEY_3 -e GIT_CONFIG_VALUE_3 -e GIT_CONFIG_KEY_4 -e GIT_CONFIG_VALUE_4 -e GIT_CONFIG_KEY_5 -e GIT_CONFIG_VALUE_5 -e BUILDPACK_CACHE_DIR -w "/tmp/github/some/repo" renovate/go:latest bash -l -c "go get -d -t ./..."",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "BUILDPACK_CACHE_DIR": "/tmp/renovate/cache/buildpack",
-        "CGO_ENABLED": "1",
-        "GIT_CONFIG_COUNT": "6",
-        "GIT_CONFIG_KEY_0": "url.https://ssh:some-token@github.com/.insteadOf",
-        "GIT_CONFIG_KEY_1": "url.https://git:some-token@github.com/.insteadOf",
-        "GIT_CONFIG_KEY_2": "url.https://some-token@github.com/.insteadOf",
-        "GIT_CONFIG_KEY_3": "url.https://ssh:some-other-token@gitea.com/.insteadOf",
-        "GIT_CONFIG_KEY_4": "url.https://git:some-other-token@gitea.com/.insteadOf",
-        "GIT_CONFIG_KEY_5": "url.https://some-other-token@gitea.com/.insteadOf",
-        "GIT_CONFIG_VALUE_0": "ssh://git@github.com/",
-        "GIT_CONFIG_VALUE_1": "git@github.com:",
-        "GIT_CONFIG_VALUE_2": "https://github.com/",
-        "GIT_CONFIG_VALUE_3": "ssh://git@gitea.com/",
-        "GIT_CONFIG_VALUE_4": "git@gitea.com:",
-        "GIT_CONFIG_VALUE_5": "https://gitea.com/",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/gomod/artifacts supports docker mode with goModTidy 1`] = `
-[
-  {
-    "cmd": "docker pull renovate/go:latest",
-    "options": {
-      "encoding": "utf-8",
-    },
-  },
-  {
-    "cmd": "docker ps --filter name=renovate_go -aq",
-    "options": {
-      "encoding": "utf-8",
-    },
-  },
-  {
-    "cmd": "docker run --rm --name=renovate_go --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e GOPROXY -e GOPRIVATE -e GONOPROXY -e GONOSUMDB -e GOINSECURE -e GOFLAGS -e CGO_ENABLED -e BUILDPACK_CACHE_DIR -w "/tmp/github/some/repo" renovate/go:latest bash -l -c "go get -d -t ./... && go mod tidy && go mod tidy"",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "BUILDPACK_CACHE_DIR": "/tmp/renovate/cache/buildpack",
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/gomod/artifacts supports docker mode with gomodTidy1.17 1`] = `
-[
-  {
-    "cmd": "docker pull renovate/go:latest",
-    "options": {
-      "encoding": "utf-8",
-    },
-  },
-  {
-    "cmd": "docker ps --filter name=renovate_go -aq",
-    "options": {
-      "encoding": "utf-8",
-    },
-  },
-  {
-    "cmd": "docker run --rm --name=renovate_go --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e GOPROXY -e GOPRIVATE -e GONOPROXY -e GONOSUMDB -e GOINSECURE -e GOFLAGS -e CGO_ENABLED -e BUILDPACK_CACHE_DIR -w "/tmp/github/some/repo" renovate/go:latest bash -l -c "go get -d -t ./... && go mod tidy -compat=1.17 && go mod tidy -compat=1.17"",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "BUILDPACK_CACHE_DIR": "/tmp/renovate/cache/buildpack",
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/gomod/artifacts supports docker mode without credentials 1`] = `
-[
-  {
-    "cmd": "docker pull renovate/go:latest",
-    "options": {
-      "encoding": "utf-8",
-    },
-  },
-  {
-    "cmd": "docker ps --filter name=renovate_go -aq",
-    "options": {
-      "encoding": "utf-8",
-    },
-  },
-  {
-    "cmd": "docker run --rm --name=renovate_go --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e GOPROXY -e GOPRIVATE -e GONOPROXY -e GONOSUMDB -e GOINSECURE -e GOFLAGS -e CGO_ENABLED -e BUILDPACK_CACHE_DIR -w "/tmp/github/some/repo" renovate/go:latest bash -l -c "go get -d -t ./..."",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "BUILDPACK_CACHE_DIR": "/tmp/renovate/cache/buildpack",
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/gomod/artifacts supports global mode 1`] = `
-[
-  {
-    "cmd": "go get -d -t ./...",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/gomod/artifacts supports vendor directory update 1`] = `
-[
-  {
-    "cmd": "go get -d -t ./...",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "go mod tidy",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "go mod vendor",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "go mod tidy",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "go mod tidy",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/gomod/artifacts updates import paths with gomodUpdateImportPaths 1`] = `
-[
-  {
-    "cmd": "go get -d -t ./...",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "go install github.com/marwan-at-work/mod/cmd/mod@latest",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "mod upgrade --mod-name=github.com/google/go-github/v24 -t=28",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "go mod tidy",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "go mod tidy",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/gomod/artifacts updates import paths with latest tool version on invalid version constraint 1`] = `
-[
-  {
-    "cmd": "go get -d -t ./...",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "go install github.com/marwan-at-work/mod/cmd/mod@latest",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "mod upgrade --mod-name=github.com/google/go-github/v24 -t=28",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "go mod tidy",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "go mod tidy",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
-
-exports[`modules/manager/gomod/artifacts updates import paths with specific tool version from constraint 1`] = `
-[
-  {
-    "cmd": "go get -d -t ./...",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "go install github.com/marwan-at-work/mod/cmd/mod@v1.2.3",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "mod upgrade --mod-name=github.com/google/go-github/v24 -t=28",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "go mod tidy",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-  {
-    "cmd": "go mod tidy",
-    "options": {
-      "cwd": "/tmp/github/some/repo",
-      "encoding": "utf-8",
-      "env": {
-        "CGO_ENABLED": "1",
-        "GOFLAGS": "-modcacherw",
-        "GOINSECURE": "insecure.example.com/*",
-        "GONOPROXY": "noproxy.example.com/*",
-        "GONOSUMDB": "1",
-        "GOPRIVATE": "private.example.com/*",
-        "GOPROXY": "proxy.example.com",
-        "HOME": "/home/user",
-        "HTTPS_PROXY": "https://example.com",
-        "HTTP_PROXY": "http://example.com",
-        "LANG": "en_US.UTF-8",
-        "LC_ALL": "en_US",
-        "NO_PROXY": "localhost",
-        "PATH": "/tmp/path",
-      },
-      "maxBuffer": 10485760,
-      "timeout": 900000,
-    },
-  },
-]
-`;
diff --git a/lib/modules/manager/gomod/artifacts.spec.ts b/lib/modules/manager/gomod/artifacts.spec.ts
index db9317fa75164384d1f099896c1237198165262b..4dcee367a55d84449e07a2d309d91269bf411080 100644
--- a/lib/modules/manager/gomod/artifacts.spec.ts
+++ b/lib/modules/manager/gomod/artifacts.spec.ts
@@ -16,6 +16,8 @@ jest.mock('../../../util/host-rules');
 jest.mock('../../../util/http');
 jest.mock('../../../util/fs');
 
+process.env.BUILDPACK = 'true';
+
 const hostRules = mocked(_hostRules);
 
 const gomod1 = `module github.com/renovate-tests/gomod1
@@ -85,13 +87,12 @@ describe('modules/manager/gomod/artifacts', () => {
         config,
       })
     ).toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
+    expect(execSnapshots).toBeEmptyArray();
   });
 
   it('returns null if unchanged', async () => {
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: [] as string[],
@@ -105,18 +106,34 @@ describe('modules/manager/gomod/artifacts', () => {
         config,
       })
     ).toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'go get -d -t ./...',
+        options: {
+          cwd: '/tmp/github/some/repo',
+          env: {
+            CGO_ENABLED: '1',
+            GOFLAGS: '-modcacherw',
+            GOINSECURE: 'insecure.example.com/*',
+            GONOPROXY: 'noproxy.example.com/*',
+            GONOSUMDB: '1',
+            GOPRIVATE: 'private.example.com/*',
+            GOPROXY: 'proxy.example.com',
+          },
+        },
+      },
+    ]);
   });
 
   it('returns updated go.sum', async () => {
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readLocalFile.mockResolvedValueOnce('New go.sum');
+    fs.readLocalFile.mockResolvedValueOnce(gomod1);
     expect(
       await gomod.updateArtifacts({
         packageFileName: 'go.mod',
@@ -124,8 +141,32 @@ describe('modules/manager/gomod/artifacts', () => {
         newPackageFileContent: gomod1,
         config,
       })
-    ).not.toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
+    ).toEqual([
+      {
+        file: {
+          contents: 'New go.sum',
+          path: 'go.sum',
+          type: 'addition',
+        },
+      },
+    ]);
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'go get -d -t ./...',
+        options: {
+          cwd: '/tmp/github/some/repo',
+          env: {
+            CGO_ENABLED: '1',
+            GOFLAGS: '-modcacherw',
+            GOINSECURE: 'insecure.example.com/*',
+            GONOPROXY: 'noproxy.example.com/*',
+            GONOSUMDB: '1',
+            GOPRIVATE: 'private.example.com/*',
+            GOPROXY: 'proxy.example.com',
+          },
+        },
+      },
+    ]);
   });
 
   it('supports vendor directory update', async () => {
@@ -154,27 +195,134 @@ describe('modules/manager/gomod/artifacts', () => {
         postUpdateOptions: ['gomodTidy'],
       },
     });
-    expect(res).not.toBeNull();
-    expect(res?.map(({ file }) => file)).toEqual([
-      { type: 'addition', path: 'go.sum', contents: 'New go.sum' },
-      { type: 'addition', path: foo, contents: 'Foo go.sum' },
-      { type: 'addition', path: bar, contents: 'Bar go.sum' },
-      { type: 'deletion', path: baz },
-      { type: 'addition', path: 'go.mod', contents: 'New go.mod' },
-    ]);
-    expect(execSnapshots).toMatchSnapshot();
+    expect(res).toEqual([
+      {
+        file: {
+          contents: 'New go.sum',
+          path: 'go.sum',
+          type: 'addition',
+        },
+      },
+      {
+        file: {
+          contents: 'Foo go.sum',
+          path: 'vendor/github.com/foo/foo/go.mod',
+          type: 'addition',
+        },
+      },
+      {
+        file: {
+          contents: 'Bar go.sum',
+          path: 'vendor/github.com/bar/bar/go.mod',
+          type: 'addition',
+        },
+      },
+      {
+        file: {
+          path: 'vendor/github.com/baz/baz/go.mod',
+          type: 'deletion',
+        },
+      },
+      {
+        file: {
+          contents: 'New go.mod',
+          path: 'go.mod',
+          type: 'addition',
+        },
+      },
+    ]);
+
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'go get -d -t ./...',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'go mod tidy',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'go mod vendor',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'go mod tidy',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'go mod tidy',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
   });
 
   it('supports docker mode without credentials', async () => {
     GlobalConfig.set({ ...adminConfig, binarySource: 'docker' });
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
+    const execSnapshots = mockExecAll();
+    git.getRepoStatus.mockResolvedValueOnce({
+      modified: ['go.sum'],
+    } as StatusResult);
+    fs.readLocalFile.mockResolvedValueOnce('New go.sum');
+    fs.readLocalFile.mockResolvedValueOnce(gomod1);
+    expect(
+      await gomod.updateArtifacts({
+        packageFileName: 'go.mod',
+        updatedDeps: [],
+        newPackageFileContent: gomod1,
+        config,
+      })
+    ).toEqual([
+      {
+        file: {
+          contents: 'New go.sum',
+          path: 'go.sum',
+          type: 'addition',
+        },
+      },
+    ]);
+    expect(execSnapshots).toMatchObject([
+      { cmd: 'docker pull renovate/go:latest' },
+      { cmd: 'docker ps --filter name=renovate_go -aq' },
+      {
+        cmd:
+          'docker run --rm --name=renovate_go --label=renovate_child ' +
+          '-v "/tmp/github/some/repo":"/tmp/github/some/repo" ' +
+          '-v "/tmp/renovate/cache":"/tmp/renovate/cache" ' +
+          '-e GOPROXY ' +
+          '-e GOPRIVATE ' +
+          '-e GONOPROXY ' +
+          '-e GONOSUMDB ' +
+          '-e GOINSECURE ' +
+          '-e GOFLAGS ' +
+          '-e CGO_ENABLED ' +
+          '-e BUILDPACK_CACHE_DIR ' +
+          '-w "/tmp/github/some/repo" ' +
+          'renovate/go:latest' +
+          ' bash -l -c "' +
+          'go get -d -t ./...' +
+          '"',
+        options: {
+          cwd: '/tmp/github/some/repo',
+          env: {
+            BUILDPACK_CACHE_DIR: '/tmp/renovate/cache/buildpack',
+          },
+        },
+      },
+    ]);
+  });
+
+  it('supports install mode without credentials', async () => {
+    GlobalConfig.set({ ...adminConfig, binarySource: 'install' });
+    fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readLocalFile.mockResolvedValueOnce('New go.sum');
+    fs.readLocalFile.mockResolvedValueOnce(gomod1);
     expect(
       await gomod.updateArtifacts({
         packageFileName: 'go.mod',
@@ -182,20 +330,38 @@ describe('modules/manager/gomod/artifacts', () => {
         newPackageFileContent: gomod1,
         config,
       })
-    ).not.toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
+    ).toEqual([
+      {
+        file: {
+          contents: 'New go.sum',
+          path: 'go.sum',
+          type: 'addition',
+        },
+      },
+    ]);
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'go get -d -t ./...',
+        options: {
+          cwd: '/tmp/github/some/repo',
+          env: {
+            BUILDPACK_CACHE_DIR: '/tmp/renovate/cache/buildpack',
+          },
+        },
+      },
+    ]);
   });
 
   it('supports global mode', async () => {
     GlobalConfig.set({ ...adminConfig, binarySource: 'global' });
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readLocalFile.mockResolvedValueOnce('New go.sum');
+    fs.readLocalFile.mockResolvedValueOnce(gomod1);
     expect(
       await gomod.updateArtifacts({
         packageFileName: 'go.mod',
@@ -203,8 +369,21 @@ describe('modules/manager/gomod/artifacts', () => {
         newPackageFileContent: gomod1,
         config,
       })
-    ).not.toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
+    ).toEqual([
+      {
+        file: {
+          contents: 'New go.sum',
+          path: 'go.sum',
+          type: 'addition',
+        },
+      },
+    ]);
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'go get -d -t ./...',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
   });
 
   it('supports docker mode with credentials', async () => {
@@ -221,13 +400,13 @@ describe('modules/manager/gomod/artifacts', () => {
       { token: 'some-other-token', matchHost: 'https://gitea.com' },
     ]);
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readLocalFile.mockResolvedValueOnce('New go.sum');
+    fs.readLocalFile.mockResolvedValueOnce(gomod1);
     expect(
       await gomod.updateArtifacts({
         packageFileName: 'go.mod',
@@ -235,8 +414,75 @@ describe('modules/manager/gomod/artifacts', () => {
         newPackageFileContent: gomod1,
         config,
       })
-    ).not.toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
+    ).toEqual([
+      {
+        file: {
+          contents: 'New go.sum',
+          path: 'go.sum',
+          type: 'addition',
+        },
+      },
+    ]);
+    expect(execSnapshots).toMatchObject([
+      { cmd: 'docker pull renovate/go:latest' },
+      { cmd: 'docker ps --filter name=renovate_go -aq' },
+      {
+        cmd:
+          'docker run --rm --name=renovate_go --label=renovate_child ' +
+          '-v "/tmp/github/some/repo":"/tmp/github/some/repo" ' +
+          '-v "/tmp/renovate/cache":"/tmp/renovate/cache" ' +
+          '-e GOPROXY ' +
+          '-e GOPRIVATE ' +
+          '-e GONOPROXY ' +
+          '-e GONOSUMDB ' +
+          '-e GOINSECURE ' +
+          '-e GOFLAGS ' +
+          '-e CGO_ENABLED ' +
+          '-e GIT_CONFIG_KEY_0 ' +
+          '-e GIT_CONFIG_VALUE_0 ' +
+          '-e GIT_CONFIG_KEY_1 ' +
+          '-e GIT_CONFIG_VALUE_1 ' +
+          '-e GIT_CONFIG_KEY_2 ' +
+          '-e GIT_CONFIG_VALUE_2 ' +
+          '-e GIT_CONFIG_COUNT ' +
+          '-e GIT_CONFIG_KEY_3 ' +
+          '-e GIT_CONFIG_VALUE_3 ' +
+          '-e GIT_CONFIG_KEY_4 ' +
+          '-e GIT_CONFIG_VALUE_4 ' +
+          '-e GIT_CONFIG_KEY_5 ' +
+          '-e GIT_CONFIG_VALUE_5 ' +
+          '-e BUILDPACK_CACHE_DIR ' +
+          '-w "/tmp/github/some/repo" ' +
+          'renovate/go:latest' +
+          ' bash -l -c "' +
+          'go get -d -t ./...' +
+          '"',
+        options: {
+          cwd: '/tmp/github/some/repo',
+          env: {
+            BUILDPACK_CACHE_DIR: '/tmp/renovate/cache/buildpack',
+            GIT_CONFIG_COUNT: '6',
+            GIT_CONFIG_KEY_0:
+              'url.https://ssh:some-token@github.com/.insteadOf',
+            GIT_CONFIG_KEY_1:
+              'url.https://git:some-token@github.com/.insteadOf',
+            GIT_CONFIG_KEY_2: 'url.https://some-token@github.com/.insteadOf',
+            GIT_CONFIG_KEY_3:
+              'url.https://ssh:some-other-token@gitea.com/.insteadOf',
+            GIT_CONFIG_KEY_4:
+              'url.https://git:some-other-token@gitea.com/.insteadOf',
+            GIT_CONFIG_KEY_5:
+              'url.https://some-other-token@gitea.com/.insteadOf',
+            GIT_CONFIG_VALUE_0: 'ssh://git@github.com/',
+            GIT_CONFIG_VALUE_1: 'git@github.com:',
+            GIT_CONFIG_VALUE_2: 'https://github.com/',
+            GIT_CONFIG_VALUE_3: 'ssh://git@gitea.com/',
+            GIT_CONFIG_VALUE_4: 'git@gitea.com:',
+            GIT_CONFIG_VALUE_5: 'https://gitea.com/',
+          },
+        },
+      },
+    ]);
   });
 
   it('supports docker mode with 2 credentials', async () => {
@@ -257,13 +503,13 @@ describe('modules/manager/gomod/artifacts', () => {
       },
     ]);
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readLocalFile.mockResolvedValueOnce('New go.sum');
+    fs.readLocalFile.mockResolvedValueOnce(gomod1);
     expect(
       await gomod.updateArtifacts({
         packageFileName: 'go.mod',
@@ -271,7 +517,15 @@ describe('modules/manager/gomod/artifacts', () => {
         newPackageFileContent: gomod1,
         config,
       })
-    ).not.toBeNull();
+    ).toEqual([
+      {
+        file: {
+          contents: 'New go.sum',
+          path: 'go.sum',
+          type: 'addition',
+        },
+      },
+    ]);
     expect(execSnapshots).toMatchObject([
       { cmd: 'docker pull renovate/go:latest' },
       { cmd: 'docker ps --filter name=renovate_go -aq' },
@@ -312,13 +566,13 @@ describe('modules/manager/gomod/artifacts', () => {
       },
     ]);
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readLocalFile.mockResolvedValueOnce('New go.sum');
+    fs.readLocalFile.mockResolvedValueOnce(gomod1);
     expect(
       await gomod.updateArtifacts({
         packageFileName: 'go.mod',
@@ -326,7 +580,15 @@ describe('modules/manager/gomod/artifacts', () => {
         newPackageFileContent: gomod1,
         config,
       })
-    ).not.toBeNull();
+    ).toEqual([
+      {
+        file: {
+          contents: 'New go.sum',
+          path: 'go.sum',
+          type: 'addition',
+        },
+      },
+    ]);
     expect(execSnapshots).toEqual(
       expect.arrayContaining([
         expect.objectContaining({
@@ -364,13 +626,13 @@ describe('modules/manager/gomod/artifacts', () => {
       },
     ]);
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readLocalFile.mockResolvedValueOnce('New go.sum');
+    fs.readLocalFile.mockResolvedValueOnce(gomod1);
     expect(
       await gomod.updateArtifacts({
         packageFileName: 'go.mod',
@@ -378,7 +640,15 @@ describe('modules/manager/gomod/artifacts', () => {
         newPackageFileContent: gomod1,
         config,
       })
-    ).not.toBeNull();
+    ).toEqual([
+      {
+        file: {
+          contents: 'New go.sum',
+          path: 'go.sum',
+          type: 'addition',
+        },
+      },
+    ]);
     expect(execSnapshots).toEqual(
       expect.arrayContaining([
         expect.objectContaining({
@@ -425,13 +695,13 @@ describe('modules/manager/gomod/artifacts', () => {
       },
     ]);
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readLocalFile.mockResolvedValueOnce('New go.sum');
+    fs.readLocalFile.mockResolvedValueOnce(gomod1);
     expect(
       await gomod.updateArtifacts({
         packageFileName: 'go.mod',
@@ -439,7 +709,15 @@ describe('modules/manager/gomod/artifacts', () => {
         newPackageFileContent: gomod1,
         config,
       })
-    ).not.toBeNull();
+    ).toEqual([
+      {
+        file: {
+          contents: 'New go.sum',
+          path: 'go.sum',
+          type: 'addition',
+        },
+      },
+    ]);
     expect(execSnapshots).toEqual(
       expect.arrayContaining([
         expect.objectContaining({
@@ -485,13 +763,13 @@ describe('modules/manager/gomod/artifacts', () => {
       },
     ]);
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readLocalFile.mockResolvedValueOnce('New go.sum');
+    fs.readLocalFile.mockResolvedValueOnce(gomod1);
     expect(
       await gomod.updateArtifacts({
         packageFileName: 'go.mod',
@@ -499,7 +777,15 @@ describe('modules/manager/gomod/artifacts', () => {
         newPackageFileContent: gomod1,
         config,
       })
-    ).not.toBeNull();
+    ).toEqual([
+      {
+        file: {
+          contents: 'New go.sum',
+          path: 'go.sum',
+          type: 'addition',
+        },
+      },
+    ]);
     expect(execSnapshots).toEqual(
       expect.arrayContaining([
         expect.objectContaining({
@@ -553,12 +839,13 @@ describe('modules/manager/gomod/artifacts', () => {
     ]);
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
     // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readLocalFile.mockResolvedValueOnce('New go.sum');
+    fs.readLocalFile.mockResolvedValueOnce(gomod1);
     expect(
       await gomod.updateArtifacts({
         packageFileName: 'go.mod',
@@ -566,7 +853,15 @@ describe('modules/manager/gomod/artifacts', () => {
         newPackageFileContent: gomod1,
         config,
       })
-    ).not.toBeNull();
+    ).toEqual([
+      {
+        file: {
+          contents: 'New go.sum',
+          path: 'go.sum',
+          type: 'addition',
+        },
+      },
+    ]);
     expect(execSnapshots).toEqual(
       expect.arrayContaining([
         expect.objectContaining({
@@ -592,8 +887,7 @@ describe('modules/manager/gomod/artifacts', () => {
     GlobalConfig.set({ ...adminConfig, binarySource: 'docker' });
     hostRules.find.mockReturnValueOnce({});
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
@@ -612,16 +906,25 @@ describe('modules/manager/gomod/artifacts', () => {
           postUpdateOptions: ['gomodTidy'],
         },
       })
-    ).not.toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
+    ).toEqual([
+      { file: { contents: 'New go.sum 1', path: 'go.sum', type: 'addition' } },
+      { file: { contents: 'New go.sum 2', path: 'go.mod', type: 'addition' } },
+    ]);
+    expect(execSnapshots).toMatchObject([
+      { cmd: 'docker pull renovate/go:latest' },
+      { cmd: 'docker ps --filter name=renovate_go -aq' },
+      {
+        cmd: 'docker run --rm --name=renovate_go --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e GOPROXY -e GOPRIVATE -e GONOPROXY -e GONOSUMDB -e GOINSECURE -e GOFLAGS -e CGO_ENABLED -e BUILDPACK_CACHE_DIR -w "/tmp/github/some/repo" renovate/go:latest bash -l -c "go get -d -t ./... && go mod tidy && go mod tidy"',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
   });
 
   it('supports docker mode with gomodTidy1.17', async () => {
     GlobalConfig.set({ ...adminConfig, binarySource: 'docker' });
     hostRules.find.mockReturnValueOnce({});
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
@@ -640,15 +943,24 @@ describe('modules/manager/gomod/artifacts', () => {
           postUpdateOptions: ['gomodTidy1.17'],
         },
       })
-    ).not.toBeNull();
-    expect(execSnapshots).toMatchSnapshot();
+    ).toEqual([
+      { file: { contents: 'New go.sum 1', path: 'go.sum', type: 'addition' } },
+      { file: { contents: 'New go.sum 2', path: 'go.mod', type: 'addition' } },
+    ]);
+    expect(execSnapshots).toMatchObject([
+      { cmd: 'docker pull renovate/go:latest' },
+      { cmd: 'docker ps --filter name=renovate_go -aq' },
+      {
+        cmd: 'docker run --rm --name=renovate_go --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e GOPROXY -e GOPRIVATE -e GONOPROXY -e GONOSUMDB -e GOINSECURE -e GOFLAGS -e CGO_ENABLED -e BUILDPACK_CACHE_DIR -w "/tmp/github/some/repo" renovate/go:latest bash -l -c "go get -d -t ./... && go mod tidy -compat=1.17 && go mod tidy -compat=1.17"',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
   });
 
   it('catches errors', async () => {
     const execSnapshots = mockExecAll();
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     fs.writeLocalFile.mockImplementationOnce(() => {
       throw new Error('This update totally doesnt work');
     });
@@ -667,13 +979,12 @@ describe('modules/manager/gomod/artifacts', () => {
         },
       },
     ]);
-    expect(execSnapshots).toMatchSnapshot();
+    expect(execSnapshots).toBeEmptyArray();
   });
 
   it('updates import paths with gomodUpdateImportPaths', async () => {
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum', 'main.go'],
@@ -699,13 +1010,33 @@ describe('modules/manager/gomod/artifacts', () => {
       { file: { type: 'addition', path: 'main.go', contents: 'New main.go' } },
       { file: { type: 'addition', path: 'go.mod', contents: 'New go.mod' } },
     ]);
-    expect(execSnapshots).toMatchSnapshot();
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'go get -d -t ./...',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'go install github.com/marwan-at-work/mod/cmd/mod@latest',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'mod upgrade --mod-name=github.com/google/go-github/v24 -t=28',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'go mod tidy',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'go mod tidy',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
   });
 
   it('skips updating import paths with gomodUpdateImportPaths on v0 to v1', async () => {
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum', 'main.go'],
@@ -729,13 +1060,17 @@ describe('modules/manager/gomod/artifacts', () => {
       { file: { type: 'addition', path: 'go.sum', contents: 'New go.sum' } },
       { file: { type: 'addition', path: 'go.mod', contents: 'New go.mod' } },
     ]);
-    expect(execSnapshots).toMatchSnapshot();
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'go get -d -t ./...',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
   });
 
   it('skips gomodTidy without gomodUpdateImportPaths on major update', async () => {
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum', 'main.go'],
@@ -756,14 +1091,21 @@ describe('modules/manager/gomod/artifacts', () => {
           postUpdateOptions: ['gomodTidy'],
         },
       })
-    ).toMatchSnapshot();
-    expect(execSnapshots).toMatchSnapshot();
+    ).toEqual([
+      { file: { contents: 'New go.sum', path: 'go.sum', type: 'addition' } },
+      { file: { contents: 'New main.go', path: 'go.mod', type: 'addition' } },
+    ]);
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'go get -d -t ./...',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
   });
 
   it('does not execute go mod tidy when none of gomodTidy and gomodUpdateImportPaths are set', async () => {
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum', 'main.go'],
@@ -783,14 +1125,21 @@ describe('modules/manager/gomod/artifacts', () => {
           newMajor: 28,
         },
       })
-    ).toMatchSnapshot();
-    expect(execSnapshots).toMatchSnapshot();
+    ).toEqual([
+      { file: { contents: 'New go.sum', path: 'go.sum', type: 'addition' } },
+      { file: { contents: 'New main.go', path: 'go.mod', type: 'addition' } },
+    ]);
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'go get -d -t ./...',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
   });
 
   it('updates import paths with specific tool version from constraint', async () => {
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum', 'main.go'],
@@ -819,13 +1168,33 @@ describe('modules/manager/gomod/artifacts', () => {
       { file: { type: 'addition', path: 'main.go', contents: 'New main.go' } },
       { file: { type: 'addition', path: 'go.mod', contents: 'New go.mod' } },
     ]);
-    expect(execSnapshots).toMatchSnapshot();
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'go get -d -t ./...',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'go install github.com/marwan-at-work/mod/cmd/mod@v1.2.3',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'mod upgrade --mod-name=github.com/google/go-github/v24 -t=28',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'go mod tidy',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'go mod tidy',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
   });
 
   it('updates import paths with latest tool version on invalid version constraint', async () => {
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum', 'main.go'],
@@ -854,13 +1223,33 @@ describe('modules/manager/gomod/artifacts', () => {
       { file: { type: 'addition', path: 'main.go', contents: 'New main.go' } },
       { file: { type: 'addition', path: 'go.mod', contents: 'New go.mod' } },
     ]);
-    expect(execSnapshots).toMatchSnapshot();
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'go get -d -t ./...',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'go install github.com/marwan-at-work/mod/cmd/mod@latest',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'mod upgrade --mod-name=github.com/google/go-github/v24 -t=28',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'go mod tidy',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'go mod tidy',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
   });
 
   it('skips updating import paths for gopkg.in dependencies', async () => {
     fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
-    // TODO: #7154 can be null
-    fs.readLocalFile.mockResolvedValueOnce(null as never); // vendor modules filename
+    fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename
     const execSnapshots = mockExecAll();
     git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
@@ -884,6 +1273,19 @@ describe('modules/manager/gomod/artifacts', () => {
       { file: { type: 'addition', path: 'go.sum', contents: 'New go.sum' } },
       { file: { type: 'addition', path: 'go.mod', contents: 'New go.mod' } },
     ]);
-    expect(execSnapshots).toMatchSnapshot();
+    expect(execSnapshots).toMatchObject([
+      {
+        cmd: 'go get -d -t ./...',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'go mod tidy',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+      {
+        cmd: 'go mod tidy',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
   });
 });
diff --git a/lib/modules/manager/gomod/artifacts.ts b/lib/modules/manager/gomod/artifacts.ts
index 0bb4cf3aa5397590e88928b8e46817cd2e2979b9..1e1e9edf66e8b4040e714455cff25099527a121a 100644
--- a/lib/modules/manager/gomod/artifacts.ts
+++ b/lib/modules/manager/gomod/artifacts.ts
@@ -379,7 +379,7 @@ export async function updateArtifacts({
       }
     }
 
-    // TODO #7154
+    // TODO: throws in tests (#7154)
     const finalGoModContent = (await readLocalFile(goModFileName, 'utf8'))!
       .replace(regEx(/\/\/ renovate-replace /g), '')
       .replace(regEx(/renovate-replace-bracket/g), ')');