mirror of
				https://github.com/actions/setup-go.git
				synced 2025-10-30 23:10:30 +00:00 
			
		
		
		
	Compare commits
	
		
			36 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | fcdc43634a | ||
|   | 265edc1beb | ||
|   | 193b404f8a | ||
|   | 56a61c9834 | ||
|   | b46db954a1 | ||
|   | 3332358454 | ||
|   | 46eabca1ab | ||
|   | 07948221be | ||
|   | ad70bef2ef | ||
|   | 4a4352b330 | ||
|   | 115d6e6004 | ||
|   | bf7ccf173e | ||
|   | dcb4ec94ce | ||
|   | 341b20ac36 | ||
|   | a5865a93f2 | ||
|   | 13df686579 | ||
|   | 8e9a229830 | ||
|   | 0b4fbc55f6 | ||
|   | acdbc5377c | ||
|   | 3e6475c089 | ||
|   | 65771601ff | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | fcc0174ef2 | ||
|   | 75726802f3 | ||
|   | 0c03929337 | ||
|   | 229eefa42b | ||
|   | 802876f7c7 | ||
|   | 2a34c33bd7 | ||
|   | 83124a14b6 | ||
|   | 9a1626044c | ||
|   | 24c791c06c | ||
|   | ec07be593a | ||
|   | f6164bd8c8 | ||
|   | 2bb2aab2fd | ||
|   | edcbc0c2cd | ||
|   | fb9a043dd8 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 5b0ae0e97d | 
							
								
								
									
										1
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							| @@ -1 +1,2 @@ | ||||
| * text=auto | ||||
| .licenses/** -diff linguist-generated=true | ||||
							
								
								
									
										10
									
								
								.github/workflows/check-dist.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.github/workflows/check-dist.yml
									
									
									
									
										vendored
									
									
								
							| @@ -21,12 +21,12 @@ jobs: | ||||
|     runs-on: ubuntu-latest | ||||
|  | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - uses: actions/checkout@v3 | ||||
|  | ||||
|       - name: Set Node.js 12.x | ||||
|         uses: actions/setup-node@v2 | ||||
|       - name: Set Node.js 16.x | ||||
|         uses: actions/setup-node@v3 | ||||
|         with: | ||||
|           node-version: 12.x | ||||
|           node-version: 16.x | ||||
|  | ||||
|       - name: Install dependencies | ||||
|         run: npm ci | ||||
| @@ -44,7 +44,7 @@ jobs: | ||||
|         id: diff | ||||
|  | ||||
|       # If index.js was different than expected, upload the expected version as an artifact | ||||
|       - uses: actions/upload-artifact@v2 | ||||
|       - uses: actions/upload-artifact@v3 | ||||
|         if: ${{ failure() && steps.diff.conclusion == 'failure' }} | ||||
|         with: | ||||
|           name: dist | ||||
|   | ||||
							
								
								
									
										8
									
								
								.github/workflows/licensed.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/licensed.yml
									
									
									
									
										vendored
									
									
								
							| @@ -13,12 +13,16 @@ jobs: | ||||
|     runs-on: ubuntu-latest | ||||
|     name: Check licenses | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - uses: actions/checkout@v3 | ||||
|       - name: Set Node.js 16.x | ||||
|         uses: actions/setup-node@v3 | ||||
|         with: | ||||
|           node-version: 16.x | ||||
|       - run: npm ci | ||||
|       - name: Install licensed | ||||
|         run: | | ||||
|           cd $RUNNER_TEMP | ||||
|           curl -Lfs -o licensed.tar.gz https://github.com/github/licensed/releases/download/3.3.1/licensed-3.3.1-linux-x64.tar.gz | ||||
|           curl -Lfs -o licensed.tar.gz https://github.com/github/licensed/releases/download/3.4.4/licensed-3.4.4-linux-x64.tar.gz | ||||
|           sudo tar -xzf licensed.tar.gz | ||||
|           sudo mv licensed /usr/local/bin/licensed | ||||
|       - run: licensed status | ||||
|   | ||||
							
								
								
									
										26
									
								
								.github/workflows/versions.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								.github/workflows/versions.yml
									
									
									
									
										vendored
									
									
								
							| @@ -22,7 +22,7 @@ jobs: | ||||
|         go: [1.12, 1.13, 1.14] | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|         uses: actions/checkout@v3 | ||||
|  | ||||
|       - name: setup-go ${{ matrix.go }} | ||||
|         uses: ./ | ||||
| @@ -41,7 +41,7 @@ jobs: | ||||
|         os: [ubuntu-latest, windows-latest, macos-latest] | ||||
|         go-version: [1.16, 1.17] | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - uses: actions/checkout@v3 | ||||
|       - name: Setup Go and check latest | ||||
|         uses: ./ | ||||
|         with: | ||||
| @@ -50,6 +50,22 @@ jobs: | ||||
|       - name: Verify Go | ||||
|         run: go version | ||||
|  | ||||
|   go-version-file: | ||||
|     runs-on: ${{ matrix.os }} | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         os: [ubuntu-latest, windows-latest, macos-latest] | ||||
|     steps: | ||||
|       - uses: actions/checkout@v3 | ||||
|       - name: Setup Go and check latest | ||||
|         uses: ./ | ||||
|         with: | ||||
|           go-version-file: __tests__/data/go.mod | ||||
|       - name: verify go | ||||
|         run: __tests__/verify-go.sh 1.14 | ||||
|         shell: bash | ||||
|  | ||||
|   setup-versions-from-manifest: | ||||
|     name: Setup ${{ matrix.go }} ${{ matrix.os }} | ||||
|     runs-on: ${{ matrix.os }} | ||||
| @@ -60,7 +76,7 @@ jobs: | ||||
|         go: [1.12.16, 1.13.11, 1.14.3] | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|         uses: actions/checkout@v3 | ||||
|  | ||||
|       - name: setup-go ${{ matrix.go }} | ||||
|         uses: ./ | ||||
| @@ -78,10 +94,10 @@ jobs: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         os: [macos-latest, windows-latest, ubuntu-latest] | ||||
|         go: [1.7, 1.8.6] | ||||
|         go: [1.9, 1.8.6] | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|         uses: actions/checkout@v3 | ||||
|  | ||||
|       - name: setup-go ${{ matrix.go }} | ||||
|         uses: ./ | ||||
|   | ||||
							
								
								
									
										8
									
								
								.github/workflows/workflow.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/workflow.yml
									
									
									
									
										vendored
									
									
								
							| @@ -17,12 +17,12 @@ jobs: | ||||
|         operating-system: [ubuntu-latest, windows-latest] | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|         uses: actions/checkout@v3 | ||||
|  | ||||
|       - name: Setup node 12 | ||||
|         uses: actions/setup-node@v2 | ||||
|       - name: Setup node 16 | ||||
|         uses: actions/setup-node@v3 | ||||
|         with: | ||||
|           node-version: 12 | ||||
|           node-version: 16 | ||||
|           cache: npm | ||||
|  | ||||
|       - name: npm ci | ||||
|   | ||||
| @@ -1 +1 @@ | ||||
| * @actions/spark | ||||
| * @actions/actions-service | ||||
|   | ||||
| @@ -55,7 +55,7 @@ a project may be further defined and clarified by project maintainers. | ||||
| ## Enforcement | ||||
| 
 | ||||
| Instances of abusive, harassing, or otherwise unacceptable behavior may be | ||||
| reported by contacting the project team at opensource@github.com. All | ||||
| reported by contacting the project team at opensource+actions/setup-go@github.com. All | ||||
| complaints will be reviewed and investigated and will result in a response that | ||||
| is deemed necessary and appropriate to the circumstances. The project team is | ||||
| obligated to maintain confidentiality with regard to the reporter of an incident. | ||||
							
								
								
									
										101
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,45 +1,63 @@ | ||||
| # setup-go | ||||
|  | ||||
| <p align="left"> | ||||
|   <a href="https://github.com/actions/setup-go/actions"><img alt="GitHub Actions status" src="https://github.com/actions/setup-go/workflows/build-test/badge.svg"></a> | ||||
|  | ||||
|   <a href="https://github.com/actions/setup-go/actions"><img alt="versions status" src="https://github.com/actions/setup-go/workflows/go-versions/badge.svg"></a>   | ||||
| </p> | ||||
| [](https://github.com/actions/setup-go/actions/workflows/workflow.yml) | ||||
| [](https://github.com/actions/setup-go/actions/workflows/versions.yml) | ||||
|  | ||||
| This action sets up a go environment for use in actions by: | ||||
|  | ||||
| - optionally downloading and caching a version of Go by version and adding to PATH | ||||
| - registering problem matchers for error output | ||||
| - Optionally downloading and caching a version of Go by version and adding to `PATH`. | ||||
| - Registering problem matchers for error output. | ||||
|  | ||||
| # V2 | ||||
| # V3 | ||||
|  | ||||
| The V2 offers: | ||||
| - Adds GOBIN to the PATH | ||||
| - Proxy Support | ||||
| - `stable` input  | ||||
| The V3 edition of the action offers: | ||||
|  | ||||
| - Adds `GOBIN` to the `PATH` | ||||
| - Proxy support | ||||
| - Check latest version | ||||
| - Bug Fixes (including issues around version matching and semver) | ||||
| - Bug fixes (including issues around version matching and semver) | ||||
|  | ||||
| The action will first check the local cache for a version match. If a version is not found locally, it will pull it from the `main` branch of the [go-versions](https://github.com/actions/go-versions/blob/main/versions-manifest.json) repository. On miss or failure, it will fall back to downloading directly from [go dist](https://storage.googleapis.com/golang). To change the default behavior, please use the [check-latest input](#check-latest-version). | ||||
|  | ||||
| **Note:** The `setup-go` action uses executable binaries which are built by Golang side. The action does not build golang from source code. | ||||
|  | ||||
| Matching by [semver spec](https://github.com/npm/node-semver): | ||||
|  | ||||
| ```yaml | ||||
| steps: | ||||
|   - uses: actions/checkout@v2 | ||||
|   - uses: actions/setup-go@v2 | ||||
|   - uses: actions/checkout@v3 | ||||
|   - uses: actions/setup-go@v3 | ||||
|     with: | ||||
|       go-version: '^1.13.1' # The Go version to download (if necessary) and use. | ||||
|   - run: go version | ||||
| ``` | ||||
|  | ||||
| Matching an unstable pre-release: | ||||
| ```yaml | ||||
| steps: | ||||
|   - uses: actions/checkout@v2 | ||||
|   - uses: actions/setup-go@v2 | ||||
|   - uses: actions/checkout@v3 | ||||
|   - uses: actions/setup-go@v3 | ||||
|     with: | ||||
|       stable: 'false' | ||||
|       go-version: '1.14.0-rc1' # The Go version to download (if necessary) and use. | ||||
|       go-version: '>=1.17.0' | ||||
|   - run: go version | ||||
| ``` | ||||
|  | ||||
| Matching an unstable pre-release: | ||||
|  | ||||
| ```yaml | ||||
| steps: | ||||
|   - uses: actions/checkout@v3 | ||||
|   - uses: actions/setup-go@v3 | ||||
|     with: | ||||
|       go-version: '1.18.0-rc.1' # The Go version to download (if necessary) and use. | ||||
|   - run: go version | ||||
| ``` | ||||
|  | ||||
| ```yaml | ||||
| steps: | ||||
|   - uses: actions/checkout@v3 | ||||
|   - uses: actions/setup-go@v3 | ||||
|     with: | ||||
|       go-version: '1.16.0-beta.1' # The Go version to download (if necessary) and use. | ||||
|   - run: go version | ||||
| ``` | ||||
|  | ||||
| @@ -47,18 +65,19 @@ steps: | ||||
|  | ||||
| See [action.yml](action.yml) | ||||
|  | ||||
| ## Basic: | ||||
| ## Basic | ||||
|  | ||||
| ```yaml | ||||
| steps: | ||||
|   - uses: actions/checkout@v2 | ||||
|   - uses: actions/setup-go@v2 | ||||
|   - uses: actions/checkout@v3 | ||||
|   - uses: actions/setup-go@v3 | ||||
|     with: | ||||
|       go-version: '1.16.1' # The Go version to download (if necessary) and use. | ||||
|   - run: go run hello.go | ||||
| ``` | ||||
|  | ||||
|  | ||||
| ## Check latest version:   | ||||
| ## Check latest version | ||||
|  | ||||
| The `check-latest` flag defaults to `false`. Use the default or set `check-latest` to `false` if you prefer stability and if you want to ensure a specific Go version is always used. | ||||
|  | ||||
| @@ -68,15 +87,31 @@ If `check-latest` is set to `true`, the action first checks if the cached versio | ||||
|  | ||||
| ```yaml | ||||
| steps: | ||||
|   - uses: actions/checkout@v2 | ||||
|   - uses: actions/setup-go@v2 | ||||
|   - uses: actions/checkout@v3 | ||||
|   - uses: actions/setup-go@v3 | ||||
|     with: | ||||
|       go-version: '1.14' | ||||
|       check-latest: true | ||||
|   - run: go run hello.go | ||||
| ``` | ||||
| ## Getting go version from the go.mod file | ||||
|  | ||||
| The `go-version-file` input accepts a path to a `go.mod` file containing the version of Go to be used by a project. As the `go.mod` file contains only major and minor (e.g. 1.18) tags, the action will search for the latest available patch version sequentially in the runner's directory with the cached tools, in the [version-manifest.json](https://github.com/actions/go-versions/blob/main/versions-manifest.json) file or at the go servers. | ||||
|  | ||||
| If both the `go-version` and the `go-version-file` inputs are provided then the `go-version` input is used. | ||||
| > The action will search for the `go.mod` file relative to the repository root | ||||
|  | ||||
| ```yaml | ||||
| steps: | ||||
| - uses: actions/checkout@v3 | ||||
| - uses: actions/setup-go@v3 | ||||
|   with: | ||||
|     go-version-file: 'path/to/go.mod' | ||||
| - run: go version | ||||
| ``` | ||||
|  | ||||
| ## Matrix testing | ||||
|  | ||||
| ## Matrix Testing: | ||||
| ```yaml | ||||
| jobs: | ||||
|   build: | ||||
| @@ -86,20 +121,22 @@ jobs: | ||||
|         go: [ '1.14', '1.13' ] | ||||
|     name: Go ${{ matrix.go }} sample | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - uses: actions/checkout@v3 | ||||
|       - name: Setup go | ||||
|         uses: actions/setup-go@v2 | ||||
|         uses: actions/setup-go@v3 | ||||
|         with: | ||||
|           go-version: ${{ matrix.go }} | ||||
|       - run: go run hello.go | ||||
| ``` | ||||
|  | ||||
| ### Supported version syntax | ||||
|  | ||||
| The `go-version` input supports the following syntax: | ||||
|  | ||||
| Specific versions: `1.15`, `1.16.1`, `1.17.0-rc2`, `1.16.0-beta1`   | ||||
| SemVer's version range syntax: `^1.13.1`   | ||||
| For more information about semantic versioning please refer [semver](https://github.com/npm/node-semver) documentation | ||||
| - Specific versions: `1.15`, `1.16.1`, `1.17.0-rc.2`, `1.16.0-beta.1` | ||||
| - SemVer's version range syntax: `^1.13.1`, `>=1.18.0-rc.1` | ||||
|  | ||||
| For more information about semantic versioning, please refer to [semver](https://github.com/npm/node-semver) documentation. | ||||
|  | ||||
| # License | ||||
|  | ||||
|   | ||||
							
								
								
									
										12
									
								
								__tests__/data/go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								__tests__/data/go.mod
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| module example.com/mymodule | ||||
|  | ||||
| go 1.14 | ||||
|  | ||||
| require ( | ||||
| 	example.com/othermodule v1.2.3 | ||||
| 	example.com/thismodule v1.2.3 | ||||
| 	example.com/thatmodule v1.2.3 | ||||
| ) | ||||
|  | ||||
| replace example.com/thatmodule => ../thatmodule | ||||
| exclude example.com/thismodule v1.3.0 | ||||
| @@ -20,6 +20,7 @@ describe('setup-go', () => { | ||||
|  | ||||
|   let inSpy: jest.SpyInstance; | ||||
|   let getBooleanInputSpy: jest.SpyInstance; | ||||
|   let exportVarSpy: jest.SpyInstance; | ||||
|   let findSpy: jest.SpyInstance; | ||||
|   let cnSpy: jest.SpyInstance; | ||||
|   let logSpy: jest.SpyInstance; | ||||
| @@ -27,11 +28,12 @@ describe('setup-go', () => { | ||||
|   let platSpy: jest.SpyInstance; | ||||
|   let archSpy: jest.SpyInstance; | ||||
|   let dlSpy: jest.SpyInstance; | ||||
|   let exSpy: jest.SpyInstance; | ||||
|   let extractTarSpy: jest.SpyInstance; | ||||
|   let cacheSpy: jest.SpyInstance; | ||||
|   let dbgSpy: jest.SpyInstance; | ||||
|   let whichSpy: jest.SpyInstance; | ||||
|   let existsSpy: jest.SpyInstance; | ||||
|   let readFileSpy: jest.SpyInstance; | ||||
|   let mkdirpSpy: jest.SpyInstance; | ||||
|   let execSpy: jest.SpyInstance; | ||||
|   let getManifestSpy: jest.SpyInstance; | ||||
| @@ -49,6 +51,7 @@ describe('setup-go', () => { | ||||
|     inSpy.mockImplementation(name => inputs[name]); | ||||
|     getBooleanInputSpy = jest.spyOn(core, 'getBooleanInput'); | ||||
|     getBooleanInputSpy.mockImplementation(name => inputs[name]); | ||||
|     exportVarSpy = jest.spyOn(core, 'exportVariable'); | ||||
|  | ||||
|     // node | ||||
|     os = {}; | ||||
| @@ -61,7 +64,7 @@ describe('setup-go', () => { | ||||
|     // @actions/tool-cache | ||||
|     findSpy = jest.spyOn(tc, 'find'); | ||||
|     dlSpy = jest.spyOn(tc, 'downloadTool'); | ||||
|     exSpy = jest.spyOn(tc, 'extractTar'); | ||||
|     extractTarSpy = jest.spyOn(tc, 'extractTar'); | ||||
|     cacheSpy = jest.spyOn(tc, 'cacheDir'); | ||||
|     getSpy = jest.spyOn(im, 'getVersionsDist'); | ||||
|     getManifestSpy = jest.spyOn(tc, 'getManifestFromRepo'); | ||||
| @@ -69,6 +72,7 @@ describe('setup-go', () => { | ||||
|     // io | ||||
|     whichSpy = jest.spyOn(io, 'which'); | ||||
|     existsSpy = jest.spyOn(fs, 'existsSync'); | ||||
|     readFileSpy = jest.spyOn(fs, 'readFileSync'); | ||||
|     mkdirpSpy = jest.spyOn(io, 'mkdirP'); | ||||
|  | ||||
|     // gets | ||||
| @@ -103,6 +107,11 @@ describe('setup-go', () => { | ||||
|     jest.restoreAllMocks(); | ||||
|   }, 100000); | ||||
|  | ||||
|   it('can extract the major.minor.patch version from a given Go version string', async () => { | ||||
|     const goVersionOutput = 'go version go1.16.6 darwin/amd64'; | ||||
|     expect(main.parseGoVersion(goVersionOutput)).toBe('1.16.6'); | ||||
|   }); | ||||
|  | ||||
|   it('can find 1.9.7 from manifest on osx', async () => { | ||||
|     os.platform = 'darwin'; | ||||
|     os.arch = 'x64'; | ||||
| @@ -147,7 +156,7 @@ describe('setup-go', () => { | ||||
|     os.arch = 'x64'; | ||||
|  | ||||
|     // spec: 1.13.0 => 1.13 | ||||
|     let match: im.IGoVersion | undefined = await im.findMatch('1.13.0', true); | ||||
|     let match: im.IGoVersion | undefined = await im.findMatch('1.13.0'); | ||||
|     expect(match).toBeDefined(); | ||||
|     let version: string = match ? match.version : ''; | ||||
|     expect(version).toBe('go1.13'); | ||||
| @@ -160,7 +169,7 @@ describe('setup-go', () => { | ||||
|     os.arch = 'x64'; | ||||
|  | ||||
|     // spec: 1.13 => 1.13.7 (latest) | ||||
|     let match: im.IGoVersion | undefined = await im.findMatch('1.13', true); | ||||
|     let match: im.IGoVersion | undefined = await im.findMatch('1.13'); | ||||
|     expect(match).toBeDefined(); | ||||
|     let version: string = match ? match.version : ''; | ||||
|     expect(version).toBe('go1.13.7'); | ||||
| @@ -173,7 +182,7 @@ describe('setup-go', () => { | ||||
|     os.arch = 'x64'; | ||||
|  | ||||
|     // spec: ^1.13.6 => 1.13.7 | ||||
|     let match: im.IGoVersion | undefined = await im.findMatch('^1.13.6', true); | ||||
|     let match: im.IGoVersion | undefined = await im.findMatch('^1.13.6'); | ||||
|     expect(match).toBeDefined(); | ||||
|     let version: string = match ? match.version : ''; | ||||
|     expect(version).toBe('go1.13.7'); | ||||
| @@ -186,7 +195,7 @@ describe('setup-go', () => { | ||||
|     os.arch = 'x32'; | ||||
|  | ||||
|     // spec: 1 => 1.13.7 (latest) | ||||
|     let match: im.IGoVersion | undefined = await im.findMatch('1', true); | ||||
|     let match: im.IGoVersion | undefined = await im.findMatch('1'); | ||||
|     expect(match).toBeDefined(); | ||||
|     let version: string = match ? match.version : ''; | ||||
|     expect(version).toBe('go1.13.7'); | ||||
| @@ -199,10 +208,7 @@ describe('setup-go', () => { | ||||
|     os.arch = 'x64'; | ||||
|  | ||||
|     // spec: 1.14, stable=false => go1.14rc1 | ||||
|     let match: im.IGoVersion | undefined = await im.findMatch( | ||||
|       '1.14.0-rc1', | ||||
|       false | ||||
|     ); | ||||
|     let match: im.IGoVersion | undefined = await im.findMatch('1.14.0-rc.1'); | ||||
|     expect(match).toBeDefined(); | ||||
|     let version: string = match ? match.version : ''; | ||||
|     expect(version).toBe('go1.14rc1'); | ||||
| @@ -218,7 +224,7 @@ describe('setup-go', () => { | ||||
|     findSpy.mockImplementation(() => toolPath); | ||||
|     await main.run(); | ||||
|  | ||||
|     expect(logSpy).toHaveBeenCalledWith(`Setup go stable version spec 1.13.0`); | ||||
|     expect(logSpy).toHaveBeenCalledWith(`Setup go version spec 1.13.0`); | ||||
|   }); | ||||
|  | ||||
|   it('evaluates to stable with no input', async () => { | ||||
| @@ -230,7 +236,41 @@ describe('setup-go', () => { | ||||
|     findSpy.mockImplementation(() => toolPath); | ||||
|     await main.run(); | ||||
|  | ||||
|     expect(logSpy).toHaveBeenCalledWith(`Setup go stable version spec 1.13.0`); | ||||
|     expect(logSpy).toHaveBeenCalledWith(`Setup go version spec 1.13.0`); | ||||
|   }); | ||||
|  | ||||
|   it('does not export any variables for Go versions >=1.9', async () => { | ||||
|     inputs['go-version'] = '1.13.0'; | ||||
|     inSpy.mockImplementation(name => inputs[name]); | ||||
|  | ||||
|     let toolPath = path.normalize('/cache/go/1.13.0/x64'); | ||||
|     findSpy.mockImplementation(() => toolPath); | ||||
|  | ||||
|     let vars: {[key: string]: string} = {}; | ||||
|     exportVarSpy.mockImplementation((name: string, val: string) => { | ||||
|       vars[name] = val; | ||||
|     }); | ||||
|  | ||||
|     await main.run(); | ||||
|     expect(vars).toStrictEqual({}); | ||||
|   }); | ||||
|  | ||||
|   it('exports GOROOT for Go versions <1.9', async () => { | ||||
|     inputs['go-version'] = '1.8'; | ||||
|     inSpy.mockImplementation(name => inputs[name]); | ||||
|  | ||||
|     let toolPath = path.normalize('/cache/go/1.8.0/x64'); | ||||
|     findSpy.mockImplementation(() => toolPath); | ||||
|  | ||||
|     let vars: {[key: string]: string} = {}; | ||||
|     exportVarSpy.mockImplementation((name: string, val: string) => { | ||||
|       vars[name] = val; | ||||
|     }); | ||||
|  | ||||
|     await main.run(); | ||||
|     expect(vars).toStrictEqual({ | ||||
|       GOROOT: toolPath | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   it('finds a version of go already in the cache', async () => { | ||||
| @@ -274,14 +314,14 @@ describe('setup-go', () => { | ||||
|     findSpy.mockImplementation(() => ''); | ||||
|     dlSpy.mockImplementation(() => '/some/temp/path'); | ||||
|     let toolPath = path.normalize('/cache/go/1.13.0/x64'); | ||||
|     exSpy.mockImplementation(() => '/some/other/temp/path'); | ||||
|     extractTarSpy.mockImplementation(() => '/some/other/temp/path'); | ||||
|     cacheSpy.mockImplementation(() => toolPath); | ||||
|     await main.run(); | ||||
|  | ||||
|     let expPath = path.join(toolPath, 'bin'); | ||||
|  | ||||
|     expect(dlSpy).toHaveBeenCalled(); | ||||
|     expect(exSpy).toHaveBeenCalled(); | ||||
|     expect(extractTarSpy).toHaveBeenCalled(); | ||||
|     expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`); | ||||
|   }); | ||||
|  | ||||
| @@ -316,7 +356,7 @@ describe('setup-go', () => { | ||||
|  | ||||
|     dlSpy.mockImplementation(async () => '/some/temp/path'); | ||||
|     let toolPath = path.normalize('/cache/go/1.12.16/x64'); | ||||
|     exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||
|     extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||
|     cacheSpy.mockImplementation(async () => toolPath); | ||||
|  | ||||
|     await main.run(); | ||||
| @@ -324,7 +364,7 @@ describe('setup-go', () => { | ||||
|     let expPath = path.join(toolPath, 'bin'); | ||||
|  | ||||
|     expect(dlSpy).toHaveBeenCalled(); | ||||
|     expect(exSpy).toHaveBeenCalled(); | ||||
|     expect(extractTarSpy).toHaveBeenCalled(); | ||||
|     expect(logSpy).not.toHaveBeenCalledWith( | ||||
|       'Not found in manifest.  Falling back to download directly from Go' | ||||
|     ); | ||||
| @@ -353,7 +393,7 @@ describe('setup-go', () => { | ||||
|  | ||||
|     dlSpy.mockImplementation(async () => '/some/temp/path'); | ||||
|     let toolPath = path.normalize('/cache/go/1.12.17/x64'); | ||||
|     exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||
|     extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||
|     cacheSpy.mockImplementation(async () => toolPath); | ||||
|  | ||||
|     await main.run(); | ||||
| @@ -361,7 +401,7 @@ describe('setup-go', () => { | ||||
|     let expPath = path.join(toolPath, 'bin'); | ||||
|  | ||||
|     expect(dlSpy).toHaveBeenCalled(); | ||||
|     expect(exSpy).toHaveBeenCalled(); | ||||
|     expect(extractTarSpy).toHaveBeenCalled(); | ||||
|     expect(logSpy).not.toHaveBeenCalledWith( | ||||
|       'Not found in manifest.  Falling back to download directly from Go' | ||||
|     ); | ||||
| @@ -390,18 +430,18 @@ describe('setup-go', () => { | ||||
|  | ||||
|     dlSpy.mockImplementation(async () => '/some/temp/path'); | ||||
|     let toolPath = path.normalize('/cache/go/1.12.14/x64'); | ||||
|     exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||
|     extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||
|     cacheSpy.mockImplementation(async () => toolPath); | ||||
|  | ||||
|     await main.run(); | ||||
|  | ||||
|     let expPath = path.join(toolPath, 'bin'); | ||||
|     expect(logSpy).toHaveBeenCalledWith('Setup go stable version spec 1.12.14'); | ||||
|     expect(logSpy).toHaveBeenCalledWith('Setup go version spec 1.12.14'); | ||||
|     expect(findSpy).toHaveBeenCalled(); | ||||
|     expect(logSpy).toHaveBeenCalledWith('Attempting to download 1.12.14...'); | ||||
|     expect(dlSpy).toHaveBeenCalled(); | ||||
|     expect(logSpy).toHaveBeenCalledWith('matching 1.12.14...'); | ||||
|     expect(exSpy).toHaveBeenCalled(); | ||||
|     expect(extractTarSpy).toHaveBeenCalled(); | ||||
|     expect(logSpy).toHaveBeenCalledWith( | ||||
|       'Not found in manifest.  Falling back to download directly from Go' | ||||
|     ); | ||||
| @@ -560,11 +600,11 @@ describe('setup-go', () => { | ||||
|  | ||||
|   // 1.13.1 => 1.13.1 | ||||
|   // 1.13 => 1.13.0 | ||||
|   // 1.10beta1 => 1.10.0-beta1, 1.10rc1 => 1.10.0-rc1 | ||||
|   // 1.8.5beta1 => 1.8.5-beta1, 1.8.5rc1 => 1.8.5-rc1 | ||||
|   // 1.10beta1 => 1.10.0-beta.1, 1.10rc1 => 1.10.0-rc.1 | ||||
|   // 1.8.5beta1 => 1.8.5-beta.1, 1.8.5rc1 => 1.8.5-rc.1 | ||||
|   it('converts prerelease versions', async () => { | ||||
|     expect(im.makeSemver('1.10beta1')).toBe('1.10.0-beta1'); | ||||
|     expect(im.makeSemver('1.10rc1')).toBe('1.10.0-rc1'); | ||||
|     expect(im.makeSemver('1.10beta1')).toBe('1.10.0-beta.1'); | ||||
|     expect(im.makeSemver('1.10rc1')).toBe('1.10.0-rc.1'); | ||||
|   }); | ||||
|  | ||||
|   it('converts dot zero versions', async () => { | ||||
| @@ -603,12 +643,12 @@ describe('setup-go', () => { | ||||
|       const toolPath = path.normalize('/cache/go/1.16.1/x64'); | ||||
|       findSpy.mockReturnValue(toolPath); | ||||
|       dlSpy.mockImplementation(async () => '/some/temp/path'); | ||||
|       exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||
|       extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||
|       cacheSpy.mockImplementation(async () => toolPath); | ||||
|  | ||||
|       await main.run(); | ||||
|  | ||||
|       expect(logSpy).toHaveBeenCalledWith('Setup go stable version spec 1.16'); | ||||
|       expect(logSpy).toHaveBeenCalledWith('Setup go version spec 1.16'); | ||||
|       expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`); | ||||
|     }); | ||||
|  | ||||
| @@ -625,7 +665,7 @@ describe('setup-go', () => { | ||||
|       findSpy.mockImplementation(() => ''); | ||||
|       dlSpy.mockImplementation(async () => '/some/temp/path'); | ||||
|       const toolPath = path.normalize('/cache/go/1.17.5/x64'); | ||||
|       exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||
|       extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||
|       cacheSpy.mockImplementation(async () => toolPath); | ||||
|       const expectedUrl = | ||||
|         'https://github.com/actions/go-versions/releases/download/1.17.6-1668090892/go-1.17.6-darwin-x64.tar.gz'; | ||||
| @@ -633,7 +673,7 @@ describe('setup-go', () => { | ||||
|       await main.run(); | ||||
|  | ||||
|       expect(logSpy).toHaveBeenCalledWith( | ||||
|         `Setup go stable version spec ${versionSpec}` | ||||
|         `Setup go version spec ${versionSpec}` | ||||
|       ); | ||||
|       expect(logSpy).toHaveBeenCalledWith( | ||||
|         'Attempting to resolve the latest version from the manifest...' | ||||
| @@ -646,7 +686,7 @@ describe('setup-go', () => { | ||||
|       expect(logSpy).toHaveBeenCalledWith('Adding to the cache ...'); | ||||
|       expect(logSpy).toHaveBeenCalledWith('Added go to the path'); | ||||
|       expect(logSpy).toHaveBeenCalledWith( | ||||
|         `Successfully setup go version ${versionSpec}` | ||||
|         `Successfully set up Go version ${versionSpec}` | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
| @@ -666,7 +706,7 @@ describe('setup-go', () => { | ||||
|  | ||||
|       dlSpy.mockImplementation(async () => '/some/temp/path'); | ||||
|       let toolPath = path.normalize('/cache/go/1.13.7/x64'); | ||||
|       exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||
|       extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||
|       cacheSpy.mockImplementation(async () => toolPath); | ||||
|  | ||||
|       await main.run(); | ||||
| @@ -674,7 +714,7 @@ describe('setup-go', () => { | ||||
|       let expPath = path.join(toolPath, 'bin'); | ||||
|  | ||||
|       expect(dlSpy).toHaveBeenCalled(); | ||||
|       expect(exSpy).toHaveBeenCalled(); | ||||
|       expect(extractTarSpy).toHaveBeenCalled(); | ||||
|       expect(logSpy).toHaveBeenCalledWith( | ||||
|         'Attempting to resolve the latest version from the manifest...' | ||||
|       ); | ||||
| @@ -708,7 +748,7 @@ describe('setup-go', () => { | ||||
|  | ||||
|       dlSpy.mockImplementation(async () => '/some/temp/path'); | ||||
|       let toolPath = path.normalize('/cache/go/1.13.7/x64'); | ||||
|       exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||
|       extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||
|       cacheSpy.mockImplementation(async () => toolPath); | ||||
|  | ||||
|       await main.run(); | ||||
| @@ -719,7 +759,7 @@ describe('setup-go', () => { | ||||
|         `Failed to resolve version ${versionSpec} from manifest` | ||||
|       ); | ||||
|       expect(dlSpy).toHaveBeenCalled(); | ||||
|       expect(exSpy).toHaveBeenCalled(); | ||||
|       expect(extractTarSpy).toHaveBeenCalled(); | ||||
|       expect(logSpy).toHaveBeenCalledWith( | ||||
|         'Attempting to resolve the latest version from the manifest...' | ||||
|       ); | ||||
| @@ -736,4 +776,68 @@ describe('setup-go', () => { | ||||
|       expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   describe('go-version-file', () => { | ||||
|     const goModContents = `module example.com/mymodule | ||||
|  | ||||
| go 1.14 | ||||
|  | ||||
| require ( | ||||
| 	example.com/othermodule v1.2.3 | ||||
| 	example.com/thismodule v1.2.3 | ||||
| 	example.com/thatmodule v1.2.3 | ||||
| ) | ||||
|  | ||||
| replace example.com/thatmodule => ../thatmodule | ||||
| exclude example.com/thismodule v1.3.0 | ||||
| `; | ||||
|  | ||||
|     it('reads version from go.mod', async () => { | ||||
|       inputs['go-version-file'] = 'go.mod'; | ||||
|       existsSpy.mockImplementation(path => true); | ||||
|       readFileSpy.mockImplementation(() => Buffer.from(goModContents)); | ||||
|  | ||||
|       await main.run(); | ||||
|  | ||||
|       expect(logSpy).toHaveBeenCalledWith('Setup go version spec 1.14'); | ||||
|       expect(logSpy).toHaveBeenCalledWith('Attempting to download 1.14...'); | ||||
|       expect(logSpy).toHaveBeenCalledWith('matching 1.14...'); | ||||
|     }); | ||||
|  | ||||
|     it('reads version from .go-version', async () => { | ||||
|       inputs['go-version-file'] = '.go-version'; | ||||
|       existsSpy.mockImplementation(path => true); | ||||
|       readFileSpy.mockImplementation(() => Buffer.from(`1.13.0${osm.EOL}`)); | ||||
|  | ||||
|       await main.run(); | ||||
|  | ||||
|       expect(logSpy).toHaveBeenCalledWith('Setup go version spec 1.13.0'); | ||||
|       expect(logSpy).toHaveBeenCalledWith('Attempting to download 1.13.0...'); | ||||
|       expect(logSpy).toHaveBeenCalledWith('matching 1.13.0...'); | ||||
|     }); | ||||
|  | ||||
|     it('is overwritten by go-version', async () => { | ||||
|       inputs['go-version'] = '1.13.1'; | ||||
|       inputs['go-version-file'] = 'go.mod'; | ||||
|       existsSpy.mockImplementation(path => true); | ||||
|       readFileSpy.mockImplementation(() => Buffer.from(goModContents)); | ||||
|  | ||||
|       await main.run(); | ||||
|  | ||||
|       expect(logSpy).toHaveBeenCalledWith('Setup go version spec 1.13.1'); | ||||
|       expect(logSpy).toHaveBeenCalledWith('Attempting to download 1.13.1...'); | ||||
|       expect(logSpy).toHaveBeenCalledWith('matching 1.13.1...'); | ||||
|     }); | ||||
|  | ||||
|     it('reports a read failure', async () => { | ||||
|       inputs['go-version-file'] = 'go.mod'; | ||||
|       existsSpy.mockImplementation(path => false); | ||||
|  | ||||
|       await main.run(); | ||||
|  | ||||
|       expect(cnSpy).toHaveBeenCalledWith( | ||||
|         `::error::The specified go version file at: go.mod does not exist${osm.EOL}` | ||||
|       ); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
|   | ||||
							
								
								
									
										10
									
								
								action.yml
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								action.yml
									
									
									
									
									
								
							| @@ -4,15 +4,17 @@ author: 'GitHub' | ||||
| inputs: | ||||
|   go-version: | ||||
|     description: 'The Go version to download (if necessary) and use. Supports semver spec and ranges.' | ||||
|   go-version-file: | ||||
|     description: 'Path to the go.mod file.' | ||||
|   check-latest: | ||||
|     description: 'Set this option to true if you want the action to always check for the latest available version that satisfies the version spec' | ||||
|     default: false | ||||
|   stable: | ||||
|     description: 'Whether to download only stable versions' | ||||
|     default: 'true' | ||||
|   token: | ||||
|     description: Used to pull node distributions from go-versions.  Since there's a default, this is typically not supplied by the user. | ||||
|     default: ${{ github.token }} | ||||
| outputs: | ||||
|   go-version: | ||||
|     description: 'The installed Go version. Useful when given a version range as input.' | ||||
| runs: | ||||
|   using: 'node12' | ||||
|   using: 'node16' | ||||
|   main: 'dist/index.js' | ||||
|   | ||||
							
								
								
									
										6954
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6954
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										69
									
								
								docs/adrs/0000-caching-dependencies.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								docs/adrs/0000-caching-dependencies.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| # 0. Caching dependencies | ||||
| Date: 2022-04-13 | ||||
|  | ||||
| Status: Accepted | ||||
|  | ||||
| # Context | ||||
| `actions/setup-go` is the one of the most popular action related to Golang in GitHub Actions. Many customers use it in conjunction with [actions/cache](https://github.com/actions/cache) to speed up dependency installation process.   | ||||
| See more examples on proper usage in [actions/cache documentation](https://github.com/actions/cache/blob/main/examples.md#go---modules). | ||||
|  | ||||
| # Goals & Anti-Goals | ||||
| Integration of caching functionality into `actions/setup-go` action will bring the following benefits for action users: | ||||
| - Decrease the entry threshold for using the cache for Go dependencies and simplify initial configuration | ||||
| - Simplify YAML pipelines because there will be no need for additional steps to enable caching | ||||
| - More users will use cache for Go so more customers will have fast builds! | ||||
|  | ||||
| We don't pursue the goal to provide wide customization of caching in scope of `actions/setup-go` action. The purpose of this integration is covering ~90% of basic use-cases. If user needs flexible customization, we should advice them to use `actions/cache` directly. | ||||
|  | ||||
| # Decision | ||||
| - Add `cache` input parameter to `actions/setup-go`. For now, input will accept the following values:  | ||||
|   - `true` - enable caching for go dependencies | ||||
|   - `false`- disable caching for go dependencies. This value will be set as default value | ||||
| - Cache feature will be disabled by default to make sure that we don't break existing customers. We will consider enabling cache by default in next major releases | ||||
| - Action will try to search a go.sum files in the repository and throw error in the scenario that it was not found | ||||
| - The hash of found file will be used as cache key (the same approach like [actions/cache](https://github.com/actions/cache/blob/main/examples.md#go---modules) recommends) | ||||
| - The following key cache will be used `${{ runner.os }}-go${{ go-version }}-${{ hashFiles('<go.sum-path>') }}` | ||||
| - Action will cache global cache from the `go env GOMODCACHE` and `go env GOCACHE` commands. | ||||
| - Add a `cache-dependency-path` input parameter to `actions/setup-go`. The new input will accept an array or regex of dependency files. The field will accept a path (relative to the repository root) to dependency files. If the provided path contains wildcards, the action will search all matching files and calculate a common hash like the ${{ hashFiles('**/go.sum') }} YAML construction does. | ||||
|  | ||||
| # Example of real use-cases | ||||
|  | ||||
|  - With cache | ||||
|  | ||||
| ```yml | ||||
| steps: | ||||
| - uses: actions/checkout@v3 | ||||
| - uses: actions/setup-go@v3 | ||||
|   with: | ||||
|     go-version: '18' | ||||
|     cache: true | ||||
| ``` | ||||
|  | ||||
|  - With cache-dependency-path | ||||
|  | ||||
|  ```yml | ||||
| steps: | ||||
| - uses: actions/checkout@v3 | ||||
| - uses: actions/setup-go@v3 | ||||
|   with: | ||||
|     go-version: '18' | ||||
|     cache: true | ||||
|     cache-dependency-path: **/go.sum | ||||
| ``` | ||||
|  | ||||
|  ```yml | ||||
| steps: | ||||
| - uses: actions/checkout@v3 | ||||
| - uses: actions/setup-go@v3 | ||||
|   with: | ||||
|     go-version: '18' | ||||
|     cache: true | ||||
|     cache-dependency-path: | | ||||
|         **/go.sum | ||||
|         **/go.mod | ||||
| ``` | ||||
|  | ||||
| # Release process | ||||
|  | ||||
| As soon as functionality is implemented, we will release minor update of action. No need to bump major version since there are no breaking changes for existing users. | ||||
| After that, we will update [starter-workflows](https://github.com/actions/starter-workflows/blob/main/ci/go.yml) | ||||
							
								
								
									
										4667
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4667
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -31,9 +31,9 @@ | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@types/jest": "^27.0.2", | ||||
|     "@types/node": "^12.0.4", | ||||
|     "@types/node": "^16.11.25", | ||||
|     "@types/semver": "^6.0.0", | ||||
|     "@zeit/ncc": "^0.21.0", | ||||
|     "@vercel/ncc": "^0.33.4", | ||||
|     "jest": "^27.2.5", | ||||
|     "jest-circus": "^27.2.5", | ||||
|     "nock": "^10.0.6", | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import * as path from 'path'; | ||||
| import * as semver from 'semver'; | ||||
| import * as httpm from '@actions/http-client'; | ||||
| import * as sys from './system'; | ||||
| import fs from 'fs'; | ||||
| import os from 'os'; | ||||
|  | ||||
| type InstallationType = 'dist' | 'manifest'; | ||||
| @@ -30,7 +31,6 @@ export interface IGoVersionInfo { | ||||
|  | ||||
| export async function getGo( | ||||
|   versionSpec: string, | ||||
|   stable: boolean, | ||||
|   checkLatest: boolean, | ||||
|   auth: string | undefined | ||||
| ) { | ||||
| @@ -41,7 +41,7 @@ export async function getGo( | ||||
|     core.info('Attempting to resolve the latest version from the manifest...'); | ||||
|     const resolvedVersion = await resolveVersionFromManifest( | ||||
|       versionSpec, | ||||
|       stable, | ||||
|       true, | ||||
|       auth | ||||
|     ); | ||||
|     if (resolvedVersion) { | ||||
| @@ -68,7 +68,7 @@ export async function getGo( | ||||
|   // Try download from internal distribution (popular versions only) | ||||
|   // | ||||
|   try { | ||||
|     info = await getInfoFromManifest(versionSpec, stable, auth); | ||||
|     info = await getInfoFromManifest(versionSpec, true, auth); | ||||
|     if (info) { | ||||
|       downloadPath = await installGoVersion(info, auth); | ||||
|     } else { | ||||
| @@ -95,7 +95,7 @@ export async function getGo( | ||||
|   // Download from storage.googleapis.com | ||||
|   // | ||||
|   if (!downloadPath) { | ||||
|     info = await getInfoFromDist(versionSpec, stable); | ||||
|     info = await getInfoFromDist(versionSpec); | ||||
|     if (!info) { | ||||
|       throw new Error( | ||||
|         `Unable to find Go version '${versionSpec}' for platform ${osPlat} and architecture ${osArch}.` | ||||
| @@ -191,11 +191,10 @@ export async function getInfoFromManifest( | ||||
| } | ||||
|  | ||||
| async function getInfoFromDist( | ||||
|   versionSpec: string, | ||||
|   stable: boolean | ||||
|   versionSpec: string | ||||
| ): Promise<IGoVersionInfo | null> { | ||||
|   let version: IGoVersion | undefined; | ||||
|   version = await findMatch(versionSpec, stable); | ||||
|   version = await findMatch(versionSpec); | ||||
|   if (!version) { | ||||
|     return null; | ||||
|   } | ||||
| @@ -211,8 +210,7 @@ async function getInfoFromDist( | ||||
| } | ||||
|  | ||||
| export async function findMatch( | ||||
|   versionSpec: string, | ||||
|   stable: boolean | ||||
|   versionSpec: string | ||||
| ): Promise<IGoVersion | undefined> { | ||||
|   let archFilter = sys.getArch(); | ||||
|   let platFilter = sys.getPlatform(); | ||||
| @@ -233,18 +231,8 @@ export async function findMatch( | ||||
|     let candidate: IGoVersion = candidates[i]; | ||||
|     let version = makeSemver(candidate.version); | ||||
|  | ||||
|     // 1.13.0 is advertised as 1.13 preventing being able to match exactly 1.13.0 | ||||
|     // since a semver of 1.13 would match latest 1.13 | ||||
|     let parts: string[] = version.split('.'); | ||||
|     if (parts.length == 2) { | ||||
|       version = version + '.0'; | ||||
|     } | ||||
|  | ||||
|     core.debug(`check ${version} satisfies ${versionSpec}`); | ||||
|     if ( | ||||
|       semver.satisfies(version, versionSpec) && | ||||
|       (!stable || candidate.stable === stable) | ||||
|     ) { | ||||
|     if (semver.satisfies(version, versionSpec)) { | ||||
|       goFile = candidate.files.find(file => { | ||||
|         core.debug( | ||||
|           `${file.arch}===${archFilter} && ${file.os}===${platFilter}` | ||||
| @@ -284,20 +272,41 @@ export async function getVersionsDist( | ||||
| // Convert the go version syntax into semver for semver matching | ||||
| // 1.13.1 => 1.13.1 | ||||
| // 1.13 => 1.13.0 | ||||
| // 1.10beta1 => 1.10.0-beta1, 1.10rc1 => 1.10.0-rc1 | ||||
| // 1.8.5beta1 => 1.8.5-beta1, 1.8.5rc1 => 1.8.5-rc1 | ||||
| // 1.10beta1 => 1.10.0-beta.1, 1.10rc1 => 1.10.0-rc.1 | ||||
| // 1.8.5beta1 => 1.8.5-beta.1, 1.8.5rc1 => 1.8.5-rc.1 | ||||
| export function makeSemver(version: string): string { | ||||
|   version = version.replace('go', ''); | ||||
|   version = version.replace('beta', '-beta').replace('rc', '-rc'); | ||||
|   version = version.replace('beta', '-beta.').replace('rc', '-rc.'); | ||||
|   let parts = version.split('-'); | ||||
|  | ||||
|   let verPart: string = parts[0]; | ||||
|   let prereleasePart = parts.length > 1 ? `-${parts[1]}` : ''; | ||||
|  | ||||
|   let verParts: string[] = verPart.split('.'); | ||||
|   if (verParts.length == 2) { | ||||
|     verPart += '.0'; | ||||
|   let semVersion = semver.coerce(parts[0])?.version; | ||||
|   if (!semVersion) { | ||||
|     throw new Error( | ||||
|       `The version: ${version} can't be changed to SemVer notation` | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   return `${verPart}${prereleasePart}`; | ||||
|   if (!parts[1]) { | ||||
|     return semVersion; | ||||
|   } | ||||
|  | ||||
|   const fullVersion = semver.valid(`${semVersion}-${parts[1]}`); | ||||
|  | ||||
|   if (!fullVersion) { | ||||
|     throw new Error( | ||||
|       `The version: ${version} can't be changed to SemVer notation` | ||||
|     ); | ||||
|   } | ||||
|   return fullVersion; | ||||
| } | ||||
|  | ||||
| export function parseGoVersionFile(versionFilePath: string): string { | ||||
|   const contents = fs.readFileSync(versionFilePath).toString(); | ||||
|  | ||||
|   if (path.basename(versionFilePath) === 'go.mod') { | ||||
|     const match = contents.match(/^go (\d+(\.\d+)*)/m); | ||||
|     return match ? match[1] : ''; | ||||
|   } | ||||
|  | ||||
|   return contents.trim(); | ||||
| } | ||||
|   | ||||
							
								
								
									
										68
									
								
								src/main.ts
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								src/main.ts
									
									
									
									
									
								
							| @@ -1,6 +1,7 @@ | ||||
| import * as core from '@actions/core'; | ||||
| import * as io from '@actions/io'; | ||||
| import * as installer from './installer'; | ||||
| import * as semver from 'semver'; | ||||
| import path from 'path'; | ||||
| import cp from 'child_process'; | ||||
| import fs from 'fs'; | ||||
| @@ -12,33 +13,30 @@ export async function run() { | ||||
|     // versionSpec is optional.  If supplied, install / use from the tool cache | ||||
|     // If not supplied then problem matchers will still be setup.  Useful for self-hosted. | ||||
|     // | ||||
|     let versionSpec = core.getInput('go-version'); | ||||
|     const versionSpec = resolveVersionInput(); | ||||
|  | ||||
|     // stable will be true unless false is the exact input | ||||
|     // since getting unstable versions should be explicit | ||||
|     let stable = (core.getInput('stable') || 'true').toUpperCase() === 'TRUE'; | ||||
|  | ||||
|     core.info(`Setup go ${stable ? 'stable' : ''} version spec ${versionSpec}`); | ||||
|     core.info(`Setup go version spec ${versionSpec}`); | ||||
|  | ||||
|     if (versionSpec) { | ||||
|       let token = core.getInput('token'); | ||||
|       let auth = !token || isGhes() ? undefined : `token ${token}`; | ||||
|  | ||||
|       const checkLatest = core.getBooleanInput('check-latest'); | ||||
|       const installDir = await installer.getGo( | ||||
|         versionSpec, | ||||
|         stable, | ||||
|         checkLatest, | ||||
|         auth | ||||
|       ); | ||||
|       const installDir = await installer.getGo(versionSpec, checkLatest, auth); | ||||
|  | ||||
|       core.exportVariable('GOROOT', installDir); | ||||
|       core.addPath(path.join(installDir, 'bin')); | ||||
|       core.info('Added go to the path'); | ||||
|  | ||||
|       const version = installer.makeSemver(versionSpec); | ||||
|       // Go versions less than 1.9 require GOROOT to be set | ||||
|       if (semver.lt(version, '1.9.0')) { | ||||
|         core.info('Setting GOROOT for Go version < 1.9'); | ||||
|         core.exportVariable('GOROOT', installDir); | ||||
|       } | ||||
|  | ||||
|       let added = await addBinToPath(); | ||||
|       core.debug(`add bin ${added}`); | ||||
|       core.info(`Successfully setup go version ${versionSpec}`); | ||||
|       core.info(`Successfully set up Go version ${versionSpec}`); | ||||
|     } | ||||
|  | ||||
|     // add problem matchers | ||||
| @@ -50,6 +48,8 @@ export async function run() { | ||||
|     let goVersion = (cp.execSync(`${goPath} version`) || '').toString(); | ||||
|     core.info(goVersion); | ||||
|  | ||||
|     core.setOutput('go-version', parseGoVersion(goVersion)); | ||||
|  | ||||
|     core.startGroup('go env'); | ||||
|     let goEnv = (cp.execSync(`${goPath} env`) || '').toString(); | ||||
|     core.info(goEnv); | ||||
| @@ -69,19 +69,19 @@ export async function addBinToPath(): Promise<boolean> { | ||||
|   } | ||||
|  | ||||
|   let buf = cp.execSync('go env GOPATH'); | ||||
|   if (buf) { | ||||
|   if (buf.length > 1) { | ||||
|     let gp = buf.toString().trim(); | ||||
|     core.debug(`go env GOPATH :${gp}:`); | ||||
|     if (!fs.existsSync(gp)) { | ||||
|       // some of the hosted images have go install but not profile dir | ||||
|       core.debug(`creating ${gp}`); | ||||
|       io.mkdirP(gp); | ||||
|       await io.mkdirP(gp); | ||||
|     } | ||||
|  | ||||
|     let bp = path.join(gp, 'bin'); | ||||
|     if (!fs.existsSync(bp)) { | ||||
|       core.debug(`creating ${bp}`); | ||||
|       io.mkdirP(bp); | ||||
|       await io.mkdirP(bp); | ||||
|     } | ||||
|  | ||||
|     core.addPath(bp); | ||||
| @@ -96,3 +96,37 @@ function isGhes(): boolean { | ||||
|   ); | ||||
|   return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; | ||||
| } | ||||
|  | ||||
| export function parseGoVersion(versionString: string): string { | ||||
|   // get the installed version as an Action output | ||||
|   // based on go/src/cmd/go/internal/version/version.go: | ||||
|   // fmt.Printf("go version %s %s/%s\n", runtime.Version(), runtime.GOOS, runtime.GOARCH) | ||||
|   // expecting go<version> for runtime.Version() | ||||
|   return versionString.split(' ')[2].slice('go'.length); | ||||
| } | ||||
|  | ||||
| function resolveVersionInput(): string { | ||||
|   let version = core.getInput('go-version'); | ||||
|   const versionFilePath = core.getInput('go-version-file'); | ||||
|  | ||||
|   if (version && versionFilePath) { | ||||
|     core.warning( | ||||
|       'Both go-version and go-version-file inputs are specified, only go-version will be used' | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   if (version) { | ||||
|     return version; | ||||
|   } | ||||
|  | ||||
|   if (versionFilePath) { | ||||
|     if (!fs.existsSync(versionFilePath)) { | ||||
|       throw new Error( | ||||
|         `The specified go version file at: ${versionFilePath} does not exist` | ||||
|       ); | ||||
|     } | ||||
|     version = installer.parseGoVersionFile(versionFilePath); | ||||
|   } | ||||
|  | ||||
|   return version; | ||||
| } | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| let os = require('os'); | ||||
| const os = require('os'); | ||||
|  | ||||
| export function getPlatform(): string { | ||||
|   // darwin and linux match already | ||||
|   | ||||
		Reference in New Issue
	
	Block a user