diff --git a/docs/usage/golang.md b/docs/usage/golang.md index a51df4dece0801a945c5398b7b3fb3a8883008b9..1fd2a25131eab52edd045bfc5f478f4c11fd6fbb 100644 --- a/docs/usage/golang.md +++ b/docs/usage/golang.md @@ -53,22 +53,3 @@ As an example, say you want Renovate to use the latest patch version of the `1.1 We do not support patch level versions for the minimum `go` version. This means you cannot use `go 1.16.6`, but you can use `go 1.16` as a contraint. - -### Custom registry support, and authentication - -This example shows how you can use a `config.js` file to configure Renovate for use with a custom private Go module source using Git to pull the modules. -We're using environment variables to pass the Git token to Renovate bot. - -```js -module.exports = { - hostRules: [ - { - matchHost: 'github.enterprise.com', - token: process.env.GO_GIT_TOKEN, - }, - ], - golang: { - registryUrls: ['github.enterprise.com'], - }, -}; -``` diff --git a/docs/usage/private-modules.md b/docs/usage/private-modules.md index ec245b912af6b2a7e029f60a2f05facd62a7548d..87159f65ba7acf442ecb3eeac384a060a86b7bf5 100644 --- a/docs/usage/private-modules.md +++ b/docs/usage/private-modules.md @@ -128,11 +128,8 @@ Any `hostRules` with `hostType=packagist` are also included. ### gomod -The `GOPRIVATE` environment variable is used to decide if a package should be fetched from the `GOPROXY` or directly from the source. -Most private modules will need to be fetched from the source directly, Renovate currently supports only Git for this. -For each comma-separated module path in `GOPRIVATE` or `golang.registryUrls` Renovate will look for credentials in `hostRules`. -Credentials are passed to Git via `GIT_CONFIG_KEY_x=url."https://${token}@${GOPRIVATE}/".insteadOf` and `GIT_CONFIG_VALUE_x=https://${GOPRIVATE}/` when running `go` commands. -Glob syntax for `GOPRIVATE` is not supported. +If a `github.com` token is found in `hostRules`, then it is written out to local git config prior to running `go` commands. +The command run is `git config --global url."https://${token}@github.com/".insteadOf "https://github.com/"`. ### npm diff --git a/lib/manager/gomod/__snapshots__/artifacts.spec.ts.snap b/lib/manager/gomod/__snapshots__/artifacts.spec.ts.snap index a4ab89395c3458bc9228d92618da8267fbcfa2bf..6e0ee06a4a9eb53fb7fcef28528b144b8ce1f9c0 100644 --- a/lib/manager/gomod/__snapshots__/artifacts.spec.ts.snap +++ b/lib/manager/gomod/__snapshots__/artifacts.spec.ts.snap @@ -13,48 +13,6 @@ Array [ exports[`.updateArtifacts() catches errors 2`] = `Array []`; -exports[`.updateArtifacts() ignore docker mode passthrough of invalid GIT_CONFIG_COUNT 1`] = ` -Array [ - Object { - "cmd": "docker pull renovate/go:latest", - "options": Object { - "encoding": "utf-8", - }, - }, - Object { - "cmd": "docker ps --filter name=renovate_go -aq", - "options": Object { - "encoding": "utf-8", - }, - }, - Object { - "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\\" -v \\"/tmp/renovate/cache/others/go\\":\\"/tmp/renovate/cache/others/go\\" -e GOPATH -e GOPROXY -e GOPRIVATE -e GONOPROXY -e GONOSUMDB -e GOFLAGS -e CGO_ENABLED -w \\"/tmp/github/some/repo\\" renovate/go:latest bash -l -c \\"go get -d ./...\\"", - "options": Object { - "cwd": "/tmp/github/some/repo", - "encoding": "utf-8", - "env": Object { - "CGO_ENABLED": "1", - "GOFLAGS": "-modcacherw", - "GONOPROXY": "noproxy.example.com/*", - "GONOSUMDB": "1", - "GOPATH": "/tmp/renovate/cache/others/go", - "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[`.updateArtifacts() returns if no go.sum found 1`] = `Array []`; exports[`.updateArtifacts() returns null if unchanged 1`] = ` @@ -311,49 +269,6 @@ Array [ ] `; -exports[`.updateArtifacts() supports docker mode passthrough of GIT_CONFIG_COUNT 1`] = ` -Array [ - Object { - "cmd": "docker pull renovate/go:latest", - "options": Object { - "encoding": "utf-8", - }, - }, - Object { - "cmd": "docker ps --filter name=renovate_go -aq", - "options": Object { - "encoding": "utf-8", - }, - }, - Object { - "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\\" -v \\"/tmp/renovate/cache/others/go\\":\\"/tmp/renovate/cache/others/go\\" -e GOPATH -e GOPROXY -e GOPRIVATE -e GONOPROXY -e GONOSUMDB -e GOFLAGS -e CGO_ENABLED -e GIT_CONFIG_COUNT -w \\"/tmp/github/some/repo\\" renovate/go:latest bash -l -c \\"go get -d ./...\\"", - "options": Object { - "cwd": "/tmp/github/some/repo", - "encoding": "utf-8", - "env": Object { - "CGO_ENABLED": "1", - "GIT_CONFIG_COUNT": "2", - "GOFLAGS": "-modcacherw", - "GONOPROXY": "noproxy.example.com/*", - "GONOSUMDB": "1", - "GOPATH": "/tmp/renovate/cache/others/go", - "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[`.updateArtifacts() supports docker mode with credentials 1`] = ` Array [ Object { @@ -369,118 +284,17 @@ Array [ }, }, Object { - "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\\" -v \\"/tmp/renovate/cache/others/go\\":\\"/tmp/renovate/cache/others/go\\" -e GOPATH -e GOPROXY -e GOPRIVATE -e GONOPROXY -e GONOSUMDB -e GOFLAGS -e CGO_ENABLED -e GIT_CONFIG_KEY_0 -e GIT_CONFIG_VALUE_0 -e GIT_CONFIG_COUNT -w \\"/tmp/github/some/repo\\" renovate/go:latest bash -l -c \\"go get -d ./...\\"", + "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\\" -v \\"/tmp/renovate/cache/others/go\\":\\"/tmp/renovate/cache/others/go\\" -e GOPATH -e GOPROXY -e GOPRIVATE -e GONOPROXY -e GONOSUMDB -e GOFLAGS -e CGO_ENABLED -w \\"/tmp/github/some/repo\\" renovate/go:latest bash -l -c \\"git config --global url.\\\\\\"https://some-token@github.com/\\\\\\".insteadOf \\\\\\"https://github.com/\\\\\\" && go get -d ./...\\"", "options": Object { "cwd": "/tmp/github/some/repo", "encoding": "utf-8", "env": Object { "CGO_ENABLED": "1", - "GIT_CONFIG_COUNT": "1", - "GIT_CONFIG_KEY_0": "url.https://some-token@github.com/.insteadOf", - "GIT_CONFIG_VALUE_0": "https://github.com/", "GOFLAGS": "-modcacherw", "GONOPROXY": "noproxy.example.com/*", "GONOSUMDB": "1", "GOPATH": "/tmp/renovate/cache/others/go", - "GOPRIVATE": "github.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[`.updateArtifacts() supports docker mode with credentials with golang.registryUrls 1`] = ` -Array [ - Object { - "cmd": "docker pull renovate/go:latest", - "options": Object { - "encoding": "utf-8", - }, - }, - Object { - "cmd": "docker ps --filter name=renovate_go -aq", - "options": Object { - "encoding": "utf-8", - }, - }, - Object { - "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\\" -v \\"/tmp/renovate/cache/others/go\\":\\"/tmp/renovate/cache/others/go\\" -e GOPATH -e GOPROXY -e GOPRIVATE -e GONOPROXY -e GONOSUMDB -e GOFLAGS -e CGO_ENABLED -e GIT_CONFIG_KEY_0 -e GIT_CONFIG_VALUE_0 -e GIT_CONFIG_COUNT -w \\"/tmp/github/some/repo\\" renovate/go:latest bash -l -c \\"go get -d ./...\\"", - "options": Object { - "cwd": "/tmp/github/some/repo", - "encoding": "utf-8", - "env": Object { - "CGO_ENABLED": "1", - "GIT_CONFIG_COUNT": "1", - "GIT_CONFIG_KEY_0": "url.https://some-token@github.com/.insteadOf", - "GIT_CONFIG_VALUE_0": "https://github.com/", - "GOFLAGS": "-modcacherw", - "GONOPROXY": "noproxy.example.com/*", - "GONOSUMDB": "1", - "GOPATH": "/tmp/renovate/cache/others/go", - "GOPRIVATE": "github.com,github.enterprise.com/test,github2.enterprise.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[`.updateArtifacts() supports docker mode with custom credentials 1`] = ` -Array [ - Object { - "cmd": "docker pull renovate/go:latest", - "options": Object { - "encoding": "utf-8", - }, - }, - Object { - "cmd": "docker ps --filter name=renovate_go -aq", - "options": Object { - "encoding": "utf-8", - }, - }, - Object { - "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\\" -v \\"/tmp/renovate/cache/others/go\\":\\"/tmp/renovate/cache/others/go\\" -e GOPATH -e GOPROXY -e GOPRIVATE -e GONOPROXY -e GONOSUMDB -e GOFLAGS -e CGO_ENABLED -e GIT_CONFIG_KEY_0 -e GIT_CONFIG_VALUE_0 -e GIT_CONFIG_COUNT -e GIT_CONFIG_KEY_1 -e GIT_CONFIG_VALUE_1 -e GIT_CONFIG_KEY_2 -e GIT_CONFIG_VALUE_2 -e GIT_CONFIG_KEY_3 -e GIT_CONFIG_VALUE_3 -e GIT_CONFIG_KEY_4 -e GIT_CONFIG_VALUE_4 -w \\"/tmp/github/some/repo\\" renovate/go:latest bash -l -c \\"go get -d ./...\\"", - "options": Object { - "cwd": "/tmp/github/some/repo", - "encoding": "utf-8", - "env": Object { - "CGO_ENABLED": "1", - "GIT_CONFIG_COUNT": "5", - "GIT_CONFIG_KEY_0": "url.https://some-github-enterprise-token@github.enterprise.com/.insteadOf", - "GIT_CONFIG_KEY_1": "url.https://some-git-private-token@git.private.com/.insteadOf", - "GIT_CONFIG_KEY_2": "url.https://some-git2-private-token@git2.private.com/.insteadOf", - "GIT_CONFIG_KEY_3": "url.https://some-git3-private-token@git3.private.com/test-org.insteadOf", - "GIT_CONFIG_KEY_4": "url.https://username:password@git4.private.com/.insteadOf", - "GIT_CONFIG_VALUE_0": "https://github.enterprise.com/", - "GIT_CONFIG_VALUE_1": "https://git.private.com/", - "GIT_CONFIG_VALUE_2": "https://git2.private.com/", - "GIT_CONFIG_VALUE_3": "https://git3.private.com/test-org", - "GIT_CONFIG_VALUE_4": "https://git4.private.com/", - "GOFLAGS": "-modcacherw", - "GONOPROXY": "noproxy.example.com/*", - "GONOSUMDB": "1", - "GOPATH": "/tmp/renovate/cache/others/go", - "GOPRIVATE": "github.enterprise.com,git.private.com,git2.private.com,git3.private.com/test-org,git4.private.com,git5.private.com", + "GOPRIVATE": "private.example.com/*", "GOPROXY": "proxy.example.com", "HOME": "/home/user", "HTTPS_PROXY": "https://example.com", @@ -539,47 +353,6 @@ Array [ ] `; -exports[`.updateArtifacts() supports docker mode without GORPIVATE 1`] = ` -Array [ - Object { - "cmd": "docker pull renovate/go:latest", - "options": Object { - "encoding": "utf-8", - }, - }, - Object { - "cmd": "docker ps --filter name=renovate_go -aq", - "options": Object { - "encoding": "utf-8", - }, - }, - Object { - "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\\" -v \\"/tmp/renovate/cache/others/go\\":\\"/tmp/renovate/cache/others/go\\" -e GOPATH -e GOPROXY -e GONOPROXY -e GONOSUMDB -e GOFLAGS -e CGO_ENABLED -w \\"/tmp/github/some/repo\\" renovate/go:latest bash -l -c \\"go get -d ./...\\"", - "options": Object { - "cwd": "/tmp/github/some/repo", - "encoding": "utf-8", - "env": Object { - "CGO_ENABLED": "1", - "GOFLAGS": "-modcacherw", - "GONOPROXY": "noproxy.example.com/*", - "GONOSUMDB": "1", - "GOPATH": "/tmp/renovate/cache/others/go", - "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[`.updateArtifacts() supports docker mode without credentials 1`] = ` Array [ Object { diff --git a/lib/manager/gomod/artifacts.spec.ts b/lib/manager/gomod/artifacts.spec.ts index f1b5d0a3f4315349e8acdc11041b063d8aa28f09..f9b5e52e0eb887ab53d28eadc85739c8738b1e4d 100644 --- a/lib/manager/gomod/artifacts.spec.ts +++ b/lib/manager/gomod/artifacts.spec.ts @@ -49,6 +49,7 @@ const config: UpdateArtifactsConfig = { const goEnv = { GONOSUMDB: '1', GOPROXY: 'proxy.example.com', + GOPRIVATE: 'private.example.com/*', GONOPROXY: 'noproxy.example.com/*', CGO_ENABLED: '1', }; @@ -59,17 +60,13 @@ describe('.updateArtifacts()', () => { jest.resetModules(); delete process.env.GOPATH; - delete process.env.GIT_CONFIG_COUNT; - process.env.GOPRIVATE = 'private.example.com/*'; env.getChildProcessEnv.mockReturnValue({ ...envMock.basic, ...goEnv }); setAdminConfig(adminConfig); docker.resetPrefetchedImages(); }); - afterEach(() => { setAdminConfig(); }); - it('returns if no go.sum found', async () => { const execSnapshots = mockExecAll(exec); expect( @@ -82,7 +79,6 @@ describe('.updateArtifacts()', () => { ).toBeNull(); expect(execSnapshots).toMatchSnapshot(); }); - it('returns null if unchanged', async () => { fs.readFile.mockResolvedValueOnce('Current go.sum' as any); fs.readFile.mockResolvedValueOnce(null as any); // vendor modules filename @@ -100,7 +96,6 @@ describe('.updateArtifacts()', () => { ).toBeNull(); expect(execSnapshots).toMatchSnapshot(); }); - it('returns updated go.sum', async () => { fs.readFile.mockResolvedValueOnce('Current go.sum' as any); fs.readFile.mockResolvedValueOnce(null as any); // vendor modules filename @@ -119,7 +114,6 @@ describe('.updateArtifacts()', () => { ).not.toBeNull(); expect(execSnapshots).toMatchSnapshot(); }); - it('supports vendor directory update', async () => { const foo = join('vendor/github.com/foo/foo/go.mod'); const bar = join('vendor/github.com/bar/bar/go.mod'); @@ -156,7 +150,6 @@ describe('.updateArtifacts()', () => { ]); expect(execSnapshots).toMatchSnapshot(); }); - it('supports docker mode without credentials', async () => { setAdminConfig({ ...adminConfig, binarySource: 'docker' }); fs.readFile.mockResolvedValueOnce('Current go.sum' as any); @@ -176,70 +169,6 @@ describe('.updateArtifacts()', () => { ).not.toBeNull(); expect(execSnapshots).toMatchSnapshot(); }); - - it('supports docker mode passthrough of GIT_CONFIG_COUNT', async () => { - process.env.GIT_CONFIG_COUNT = '2'; - setAdminConfig({ ...adminConfig, binarySource: 'docker' }); - fs.readFile.mockResolvedValueOnce('Current go.sum' as any); - fs.readFile.mockResolvedValueOnce(null as any); // vendor modules filename - const execSnapshots = mockExecAll(exec); - git.getRepoStatus.mockResolvedValueOnce({ - modified: ['go.sum'], - } as StatusResult); - fs.readFile.mockResolvedValueOnce('New go.sum' as any); - expect( - await gomod.updateArtifacts({ - packageFileName: 'go.mod', - updatedDeps: [], - newPackageFileContent: gomod1, - config, - }) - ).not.toBeNull(); - expect(execSnapshots).toMatchSnapshot(); - }); - - it('supports docker mode without GORPIVATE', async () => { - delete process.env.GOPRIVATE; - setAdminConfig({ ...adminConfig, binarySource: 'docker' }); - fs.readFile.mockResolvedValueOnce('Current go.sum' as any); - fs.readFile.mockResolvedValueOnce(null as any); // vendor modules filename - const execSnapshots = mockExecAll(exec); - git.getRepoStatus.mockResolvedValueOnce({ - modified: ['go.sum'], - } as StatusResult); - fs.readFile.mockResolvedValueOnce('New go.sum' as any); - expect( - await gomod.updateArtifacts({ - packageFileName: 'go.mod', - updatedDeps: [], - newPackageFileContent: gomod1, - config, - }) - ).not.toBeNull(); - expect(execSnapshots).toMatchSnapshot(); - }); - - it('ignore docker mode passthrough of invalid GIT_CONFIG_COUNT', async () => { - process.env.GIT_CONFIG_COUNT = 'not-a-number'; - setAdminConfig({ ...adminConfig, binarySource: 'docker' }); - fs.readFile.mockResolvedValueOnce('Current go.sum' as any); - fs.readFile.mockResolvedValueOnce(null as any); // vendor modules filename - const execSnapshots = mockExecAll(exec); - git.getRepoStatus.mockResolvedValueOnce({ - modified: ['go.sum'], - } as StatusResult); - fs.readFile.mockResolvedValueOnce('New go.sum' as any); - expect( - await gomod.updateArtifacts({ - packageFileName: 'go.mod', - updatedDeps: [], - newPackageFileContent: gomod1, - config, - }) - ).not.toBeNull(); - expect(execSnapshots).toMatchSnapshot(); - }); - it('supports global mode', async () => { setAdminConfig({ ...adminConfig, binarySource: 'global' }); fs.readFile.mockResolvedValueOnce('Current go.sum' as any); @@ -259,33 +188,7 @@ describe('.updateArtifacts()', () => { ).not.toBeNull(); expect(execSnapshots).toMatchSnapshot(); }); - it('supports docker mode with credentials', async () => { - setAdminConfig({ ...adminConfig, binarySource: 'docker' }); - process.env.GOPRIVATE = 'github.com'; - hostRules.find.mockReturnValueOnce({ - token: 'some-token', - }); - fs.readFile.mockResolvedValueOnce('Current go.sum' as any); - fs.readFile.mockResolvedValueOnce(null as any); // vendor modules filename - const execSnapshots = mockExecAll(exec); - git.getRepoStatus.mockResolvedValueOnce({ - modified: ['go.sum'], - } as StatusResult); - fs.readFile.mockResolvedValueOnce('New go.sum' as any); - expect( - await gomod.updateArtifacts({ - packageFileName: 'go.mod', - updatedDeps: [], - newPackageFileContent: gomod1, - config, - }) - ).not.toBeNull(); - expect(execSnapshots).toMatchSnapshot(); - }); - - it('supports docker mode with credentials with golang.registryUrls', async () => { - delete process.env.GOPRIVATE; setAdminConfig({ ...adminConfig, binarySource: 'docker' }); hostRules.find.mockReturnValueOnce({ token: 'some-token', @@ -297,66 +200,6 @@ describe('.updateArtifacts()', () => { modified: ['go.sum'], } as StatusResult); fs.readFile.mockResolvedValueOnce('New go.sum' as any); - expect( - await gomod.updateArtifacts({ - packageFileName: 'go.mod', - updatedDeps: [], - newPackageFileContent: gomod1, - config: { - ...config, - registryUrls: [ - 'github.com', - 'github.enterprise.com/test', - 'https://github2.enterprise.com', - 'ftp://this-is-invalid.git.enterprise.com', - ], - }, - }) - ).not.toBeNull(); - expect(execSnapshots).toMatchSnapshot(); - }); - - it('supports docker mode with custom credentials', async () => { - setAdminConfig({ ...adminConfig, binarySource: 'docker' }); - const mockValues = [ - { - token: 'some-github-enterprise-token', - matchHost: 'github.enterprise.com', - }, - { - token: 'some-git-private-token', - matchHost: 'git.private.com', - }, - { - token: 'some-git2-private-token', - matchHost: 'https://git2.private.com', - }, - { - token: 'some-git3-private-token', - matchHost: 'git3.private.com/test-org', - }, - { - username: 'username', - password: 'password', - matchHost: 'git4.private.com', - }, - { - username: 'username-is-not-enough', - matchHost: 'git5.private.com', - }, - ]; - process.env.GOPRIVATE = - 'github.enterprise.com,git.private.com,git2.private.com,git3.private.com/test-org,git4.private.com,git5.private.com'; - for (const mockValue of mockValues) { - hostRules.find.mockReturnValueOnce(mockValue); - } - fs.readFile.mockResolvedValueOnce('Current go.sum' as any); - fs.readFile.mockResolvedValueOnce(null as any); // vendor modules filename - const execSnapshots = mockExecAll(exec); - git.getRepoStatus.mockResolvedValueOnce({ - modified: ['go.sum'], - } as StatusResult); - fs.readFile.mockResolvedValueOnce('New go.sum' as any); expect( await gomod.updateArtifacts({ packageFileName: 'go.mod', @@ -367,7 +210,6 @@ describe('.updateArtifacts()', () => { ).not.toBeNull(); expect(execSnapshots).toMatchSnapshot(); }); - it('supports docker mode with goModTidy', async () => { setAdminConfig({ ...adminConfig, binarySource: 'docker' }); hostRules.find.mockReturnValueOnce({}); @@ -394,7 +236,6 @@ describe('.updateArtifacts()', () => { ).not.toBeNull(); expect(execSnapshots).toMatchSnapshot(); }); - it('catches errors', async () => { const execSnapshots = mockExecAll(exec); fs.readFile.mockResolvedValueOnce('Current go.sum' as any); @@ -412,7 +253,6 @@ describe('.updateArtifacts()', () => { ).toMatchSnapshot(); expect(execSnapshots).toMatchSnapshot(); }); - it('updates import paths with gomodUpdateImportPaths', async () => { fs.readFile.mockResolvedValueOnce('Current go.sum' as any); fs.readFile.mockResolvedValueOnce(null as any); // vendor modules filename @@ -439,7 +279,6 @@ describe('.updateArtifacts()', () => { ).toMatchSnapshot(); expect(execSnapshots).toMatchSnapshot(); }); - it('skips updating import paths with gomodUpdateImportPaths on v0 to v1', async () => { fs.readFile.mockResolvedValueOnce('Current go.sum' as any); fs.readFile.mockResolvedValueOnce(null as any); // vendor modules filename @@ -465,7 +304,6 @@ describe('.updateArtifacts()', () => { ).toMatchSnapshot(); expect(execSnapshots).toMatchSnapshot(); }); - it('updates import paths with specific tool version from constraint', async () => { fs.readFile.mockResolvedValueOnce('Current go.sum' as any); fs.readFile.mockResolvedValueOnce(null as any); // vendor modules filename @@ -495,7 +333,6 @@ describe('.updateArtifacts()', () => { ).toMatchSnapshot(); expect(execSnapshots).toMatchSnapshot(); }); - it('updates import paths with latest tool version on invalid version constraint', async () => { fs.readFile.mockResolvedValueOnce('Current go.sum' as any); fs.readFile.mockResolvedValueOnce(null as any); // vendor modules filename @@ -525,7 +362,6 @@ describe('.updateArtifacts()', () => { ).toMatchSnapshot(); expect(execSnapshots).toMatchSnapshot(); }); - it('skips updating import paths for gopkg.in dependencies', async () => { fs.readFile.mockResolvedValueOnce('Current go.sum' as any); fs.readFile.mockResolvedValueOnce(null as any); // vendor modules filename diff --git a/lib/manager/gomod/artifacts.ts b/lib/manager/gomod/artifacts.ts index 6e611233dfb815ed12c6f036942316d63b6eb71d..36f05c0983457cf7063a5c10c1c540c4be055172 100644 --- a/lib/manager/gomod/artifacts.ts +++ b/lib/manager/gomod/artifacts.ts @@ -1,14 +1,14 @@ import is from '@sindresorhus/is'; +import { quote } from 'shlex'; import { dirname, join } from 'upath'; import { getAdminConfig } from '../../config/admin'; import { TEMPORARY_ERROR } from '../../constants/error-messages'; +import { PLATFORM_TYPE_GITHUB } from '../../constants/platforms'; import { logger } from '../../logger'; import { ExecOptions, exec } from '../../util/exec'; import { ensureCacheDir, readLocalFile, writeLocalFile } from '../../util/fs'; import { getRepoStatus } from '../../util/git'; -import { getGitAuthenticatedEnvironmentVariables } from '../../util/git/auth'; -import { getHttpUrl } from '../../util/git/url'; -import { parseUrl } from '../../util/url'; +import { find } from '../../util/host-rules'; import { isValid } from '../../versioning/semver'; import type { PackageDependency, @@ -17,18 +17,19 @@ import type { UpdateArtifactsResult, } from '../types'; -function getGoEnvironmentVariables(registryUrls: string[]): NodeJS.ProcessEnv { - let goEnvVariables: NodeJS.ProcessEnv = {}; - - for (const registryUrl of registryUrls) { - const goPrivateWithProtocol = getHttpUrl(registryUrl); - goEnvVariables = getGitAuthenticatedEnvironmentVariables( - goPrivateWithProtocol, - goEnvVariables - ); +function getPreCommands(): string[] | null { + const credentials = find({ + hostType: PLATFORM_TYPE_GITHUB, + url: 'https://api.github.com/', + }); + let preCommands = null; + if (credentials?.token) { + const token = quote(credentials.token); + preCommands = [ + `git config --global url.\"https://${token}@github.com/\".insteadOf \"https://github.com/\"`, // eslint-disable-line no-useless-escape + ]; } - - return goEnvVariables; + return preCommands; } function getUpdateImportPathCmds( @@ -115,51 +116,6 @@ export async function updateArtifacts({ logger.debug('Removed some relative replace statements from go.mod'); } await writeLocalFile(goModFileName, massagedGoMod); - // array of GOMODULE registries which should be fetched from - // passed to go as GOPRIVATE - let registryUrls: string[] = []; - let goPrivates: string[] = []; - - // add GOPRIVATE environment variables - if (process.env.GOPRIVATE) { - goPrivates = process.env.GOPRIVATE.split(','); - // GOPRIVATE is without protocol so we add the https protocol before adding it to the registryUrls - const goPrivatesWithProtocol = goPrivates.map( - (goPrivate) => `https://${goPrivate}` - ); - registryUrls = registryUrls.concat(goPrivatesWithProtocol); - } - - // add explicit registryUrls - if (config.registryUrls) { - for (const registryUrl of config.registryUrls) { - // if the registryUrl could not be parsed, retry with a protocol - const parsedRegistryUrl = - parseUrl(registryUrl) || parseUrl(`https://${registryUrl}`); - - // Only allow http(s) - if (parsedRegistryUrl?.protocol?.startsWith('http')) { - // Add the full URL to the registryUrls - registryUrls.push(parsedRegistryUrl.toString()); - - // Add only the domain + path to the goPrivates - let goPrivate = parsedRegistryUrl.host; - // only add the pathname if it is not just the base path - if (parsedRegistryUrl.pathname !== '/') { - goPrivate += parsedRegistryUrl.pathname; - } - goPrivates.push(goPrivate); - } else { - // ignore if registryUrl could not be parsed - logger.warn( - `Could not parse registryUrl ${registryUrl} or not using http(s). Ignoring` - ); - } - } - } - - // create comma-separated GOPRIVATE environment variable if any goPrivates exist - const goPrivate = goPrivates.length > 0 ? goPrivates.join(',') : undefined; const cmd = 'go'; const execOptions: ExecOptions = { @@ -167,18 +123,18 @@ export async function updateArtifacts({ extraEnv: { GOPATH: goPath, GOPROXY: process.env.GOPROXY, - GOPRIVATE: goPrivate, + GOPRIVATE: process.env.GOPRIVATE, GONOPROXY: process.env.GONOPROXY, GONOSUMDB: process.env.GONOSUMDB, GOFLAGS: useModcacherw(config.constraints?.go) ? '-modcacherw' : null, CGO_ENABLED: getAdminConfig().binarySource === 'docker' ? '0' : null, - ...getGoEnvironmentVariables(registryUrls), }, docker: { image: 'go', tagConstraint: config.constraints?.go, tagScheme: 'npm', volumes: [goPath], + preCommands: getPreCommands(), }, }; diff --git a/lib/util/git/auth.ts b/lib/util/git/auth.ts deleted file mode 100644 index 4cfba38e4ffaae8dd21f97794331062ca1b4845b..0000000000000000000000000000000000000000 --- a/lib/util/git/auth.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { logger } from '../../logger'; -import { getRemoteUrlWithToken } from './url'; - -/* - Add authorization to a Git Url and returns the updated environment variables -*/ -export function getGitAuthenticatedEnvironmentVariables( - gitUrl: string, - environmentVariables: NodeJS.ProcessEnv -): NodeJS.ProcessEnv { - // check if the environmentVariables already contain a GIT_CONFIG_COUNT or if the process has one - const gitConfigCountEnvVariable = - environmentVariables.GIT_CONFIG_COUNT || process.env.GIT_CONFIG_COUNT; - let gitConfigCount = 0; - if (gitConfigCountEnvVariable) { - // passthrough the gitConfigCountEnvVariable environment variable as start value of the index count - gitConfigCount = parseInt(gitConfigCountEnvVariable, 10); - if (Number.isNaN(gitConfigCount)) { - logger.warn( - `Found GIT_CONFIG_COUNT env variable, but couldn't parse the value to an integer: ${process.env.GIT_CONFIG_COUNT}. Ignoring it.` - ); - gitConfigCount = 0; - } - } - - const gitUrlWithToken = getRemoteUrlWithToken(gitUrl); - const returnEnvironmentVariables = { ...environmentVariables }; - - // only if credentials got injected and thus the urls are no longer equal - if (gitUrlWithToken !== gitUrl) { - // prettier-ignore - returnEnvironmentVariables[`GIT_CONFIG_KEY_${gitConfigCount}`] = `url.${gitUrlWithToken}.insteadOf`; - // prettier-ignore - returnEnvironmentVariables[`GIT_CONFIG_VALUE_${gitConfigCount}`] = gitUrl; - gitConfigCount += 1; - } - - if (gitConfigCount > 0) { - returnEnvironmentVariables.GIT_CONFIG_COUNT = gitConfigCount.toString(); - } - - return returnEnvironmentVariables; -}