From 865316a0937874721d5ca4590706faa418baea97 Mon Sep 17 00:00:00 2001 From: Rhys Arkins Date: Sun, 29 Jan 2023 07:11:52 +0100 Subject: [PATCH] feat(go)!: default GOPROXY (#20081) Set default GOPROXY value to match `go`'s own default. Closes #20040 BREAKING CHANGE: Renovate will now use go's default `GOPROXY` settings. To avoid using the public proxy, configure `GOPROXY=direct`. --- lib/modules/datasource/go/index.spec.ts | 17 +----------- lib/modules/datasource/go/index.ts | 4 +-- lib/modules/datasource/go/readme.md | 5 ++++ .../datasource/go/releases-goproxy.spec.ts | 26 +++++++++++++++++-- lib/modules/datasource/go/releases-goproxy.ts | 6 +++-- 5 files changed, 35 insertions(+), 23 deletions(-) create mode 100644 lib/modules/datasource/go/readme.md diff --git a/lib/modules/datasource/go/index.spec.ts b/lib/modules/datasource/go/index.spec.ts index 6f5575968b7c65b..319ad8baff65285 100644 --- a/lib/modules/datasource/go/index.spec.ts +++ b/lib/modules/datasource/go/index.spec.ts @@ -53,25 +53,10 @@ describe('modules/datasource/go/index', () => { delete process.env.GOPROXY; }); - it('fetches release info directly from VCS', async () => { - const expected = { releases: [{ version: '0.0.1' }] }; - getReleasesProxyMock.mockResolvedValue(null); - getReleasesDirectMock.mockResolvedValue(expected); - - const res = await datasource.getReleases({ - packageName: 'golang.org/foo/bar', - }); - - expect(res).toBe(expected); - expect(getReleasesProxyMock).not.toHaveBeenCalled(); - expect(getReleasesDirectMock).toHaveBeenCalled(); - }); - - it('supports GOPROXY', async () => { + it('fetches releases', async () => { const expected = { releases: [{ version: '0.0.1' }] }; getReleasesProxyMock.mockResolvedValue(expected); getReleasesDirectMock.mockResolvedValue(null); - process.env.GOPROXY = 'https://proxy.golang.org,direct'; const res = await datasource.getReleases({ packageName: 'golang.org/foo/bar', diff --git a/lib/modules/datasource/go/index.ts b/lib/modules/datasource/go/index.ts index 8bd8f4629a0f84c..d4ac94e98ad525d 100644 --- a/lib/modules/datasource/go/index.ts +++ b/lib/modules/datasource/go/index.ts @@ -36,9 +36,7 @@ export class GoDatasource extends Datasource { key: ({ packageName }: Partial) => `${packageName}-digest`, }) getReleases(config: GetReleasesConfig): Promise { - return process.env.GOPROXY - ? this.goproxy.getReleases(config) - : this.direct.getReleases(config); + return this.goproxy.getReleases(config); } /** diff --git a/lib/modules/datasource/go/readme.md b/lib/modules/datasource/go/readme.md new file mode 100644 index 000000000000000..1546b270d1796c7 --- /dev/null +++ b/lib/modules/datasource/go/readme.md @@ -0,0 +1,5 @@ +This datasource will default to using the `GOPROXY` settings `https://proxy.golang.org,direct` if there is no value defined in environment variables. + +To override this default and use a different proxy, simply configure `GOPROXY` to an alternative setting in env. + +To override this default and stop using any proxy at all, set `GOPROXY` to the value `direct`. diff --git a/lib/modules/datasource/go/releases-goproxy.spec.ts b/lib/modules/datasource/go/releases-goproxy.spec.ts index 4cbc7aa852300cf..55250e597fadb4c 100644 --- a/lib/modules/datasource/go/releases-goproxy.spec.ts +++ b/lib/modules/datasource/go/releases-goproxy.spec.ts @@ -285,6 +285,30 @@ describe('modules/datasource/go/releases-goproxy', () => { delete process.env.GOINSECURE; }); + it('handles direct', async () => { + process.env.GOPROXY = 'direct'; + + githubGetTags.mockResolvedValueOnce({ + releases: [ + { gitRef: 'v1.0.0', version: 'v1.0.0' }, + { gitRef: 'v1.0.1', version: 'v1.0.1' }, + ], + }); + githubGetReleases.mockResolvedValueOnce({ releases: [] }); + + const res = await datasource.getReleases({ + packageName: 'github.com/google/btree', + }); + + expect(res).toEqual({ + releases: [ + { gitRef: 'v1.0.0', version: 'v1.0.0' }, + { gitRef: 'v1.0.1', version: 'v1.0.1' }, + ], + sourceUrl: 'https://github.com/google/btree', + }); + }); + it('skips GONOPROXY and GOPRIVATE packages', async () => { process.env.GOPROXY = baseUrl; process.env.GOPRIVATE = 'github.com/google/*'; @@ -311,8 +335,6 @@ describe('modules/datasource/go/releases-goproxy', () => { }); it('fetches release data from goproxy', async () => { - process.env.GOPROXY = baseUrl; - httpMock .scope(`${baseUrl}/github.com/google/btree`) .get('/@v/list') diff --git a/lib/modules/datasource/go/releases-goproxy.ts b/lib/modules/datasource/go/releases-goproxy.ts index 000d2473e4ffbd3..c3dd78d1608cbfe 100644 --- a/lib/modules/datasource/go/releases-goproxy.ts +++ b/lib/modules/datasource/go/releases-goproxy.ts @@ -32,8 +32,10 @@ export class GoProxyDatasource extends Datasource { async getReleases(config: GetReleasesConfig): Promise { const { packageName } = config; logger.trace(`goproxy.getReleases(${packageName})`); - - const goproxy = process.env.GOPROXY; + const goproxy = process.env.GOPROXY ?? 'https://proxy.golang.org,direct'; + if (goproxy === 'direct') { + return this.direct.getReleases(config); + } const proxyList = this.parseGoproxy(goproxy); const noproxy = GoProxyDatasource.parseNoproxy();