mirror of
				https://github.com/actions/setup-go.git
				synced 2025-10-31 07:30:31 +00:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			v3.1.0
			...
			thboop/nod
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 4314d44d94 | ||
|   | 28c3d5cef9 | 
							
								
								
									
										1
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							| @@ -1,2 +1 @@ | |||||||
| * text=auto |  | ||||||
| .licenses/** -diff linguist-generated=true | .licenses/** -diff linguist-generated=true | ||||||
							
								
								
									
										6
									
								
								.github/workflows/check-dist.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/check-dist.yml
									
									
									
									
										vendored
									
									
								
							| @@ -21,10 +21,10 @@ jobs: | |||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|  |  | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v3 |       - uses: actions/checkout@v2 | ||||||
|  |  | ||||||
|       - name: Set Node.js 16.x |       - name: Set Node.js 16.x | ||||||
|         uses: actions/setup-node@v3 |         uses: actions/setup-node@v1 | ||||||
|         with: |         with: | ||||||
|           node-version: 16.x |           node-version: 16.x | ||||||
|  |  | ||||||
| @@ -44,7 +44,7 @@ jobs: | |||||||
|         id: diff |         id: diff | ||||||
|  |  | ||||||
|       # If index.js was different than expected, upload the expected version as an artifact |       # If index.js was different than expected, upload the expected version as an artifact | ||||||
|       - uses: actions/upload-artifact@v3 |       - uses: actions/upload-artifact@v2 | ||||||
|         if: ${{ failure() && steps.diff.conclusion == 'failure' }} |         if: ${{ failure() && steps.diff.conclusion == 'failure' }} | ||||||
|         with: |         with: | ||||||
|           name: dist |           name: dist | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								.github/workflows/licensed.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/licensed.yml
									
									
									
									
										vendored
									
									
								
							| @@ -13,16 +13,12 @@ jobs: | |||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     name: Check licenses |     name: Check licenses | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v3 |       - uses: actions/checkout@v2 | ||||||
|       - name: Set Node.js 16.x |  | ||||||
|         uses: actions/setup-node@v3 |  | ||||||
|         with: |  | ||||||
|           node-version: 16.x |  | ||||||
|       - run: npm ci |       - run: npm ci | ||||||
|       - name: Install licensed |       - name: Install licensed | ||||||
|         run: | |         run: | | ||||||
|           cd $RUNNER_TEMP |           cd $RUNNER_TEMP | ||||||
|           curl -Lfs -o licensed.tar.gz https://github.com/github/licensed/releases/download/3.4.4/licensed-3.4.4-linux-x64.tar.gz |           curl -Lfs -o licensed.tar.gz https://github.com/github/licensed/releases/download/2.12.2/licensed-2.12.2-linux-x64.tar.gz | ||||||
|           sudo tar -xzf licensed.tar.gz |           sudo tar -xzf licensed.tar.gz | ||||||
|           sudo mv licensed /usr/local/bin/licensed |           sudo mv licensed /usr/local/bin/licensed | ||||||
|       - run: licensed status |       - run: licensed status | ||||||
|   | |||||||
							
								
								
									
										41
									
								
								.github/workflows/versions.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										41
									
								
								.github/workflows/versions.yml
									
									
									
									
										vendored
									
									
								
							| @@ -22,7 +22,7 @@ jobs: | |||||||
|         go: [1.12, 1.13, 1.14] |         go: [1.12, 1.13, 1.14] | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout |       - name: Checkout | ||||||
|         uses: actions/checkout@v3 |         uses: actions/checkout@v2 | ||||||
|  |  | ||||||
|       - name: setup-go ${{ matrix.go }} |       - name: setup-go ${{ matrix.go }} | ||||||
|         uses: ./ |         uses: ./ | ||||||
| @@ -33,39 +33,6 @@ jobs: | |||||||
|         run: __tests__/verify-go.sh ${{ matrix.go }} |         run: __tests__/verify-go.sh ${{ matrix.go }} | ||||||
|         shell: bash |         shell: bash | ||||||
|  |  | ||||||
|   check-latest: |  | ||||||
|     runs-on: ${{ matrix.os }} |  | ||||||
|     strategy: |  | ||||||
|       fail-fast: false |  | ||||||
|       matrix: |  | ||||||
|         os: [ubuntu-latest, windows-latest, macos-latest] |  | ||||||
|         go-version: [1.16, 1.17] |  | ||||||
|     steps: |  | ||||||
|       - uses: actions/checkout@v3 |  | ||||||
|       - name: Setup Go and check latest |  | ||||||
|         uses: ./ |  | ||||||
|         with: |  | ||||||
|           go-version: ${{ matrix.go-version }} |  | ||||||
|           check-latest: true |  | ||||||
|       - 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: |   setup-versions-from-manifest: | ||||||
|     name: Setup ${{ matrix.go }} ${{ matrix.os }} |     name: Setup ${{ matrix.go }} ${{ matrix.os }} | ||||||
|     runs-on: ${{ matrix.os }} |     runs-on: ${{ matrix.os }} | ||||||
| @@ -76,7 +43,7 @@ jobs: | |||||||
|         go: [1.12.16, 1.13.11, 1.14.3] |         go: [1.12.16, 1.13.11, 1.14.3] | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout |       - name: Checkout | ||||||
|         uses: actions/checkout@v3 |         uses: actions/checkout@v2 | ||||||
|        |        | ||||||
|       - name: setup-go ${{ matrix.go }} |       - name: setup-go ${{ matrix.go }} | ||||||
|         uses: ./ |         uses: ./ | ||||||
| @@ -94,10 +61,10 @@ jobs: | |||||||
|       fail-fast: false |       fail-fast: false | ||||||
|       matrix: |       matrix: | ||||||
|         os: [macos-latest, windows-latest, ubuntu-latest] |         os: [macos-latest, windows-latest, ubuntu-latest] | ||||||
|         go: [1.9, 1.8.6] |         go: [1.7, 1.8.6] | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout |       - name: Checkout | ||||||
|         uses: actions/checkout@v3 |         uses: actions/checkout@v2 | ||||||
|  |  | ||||||
|       - name: setup-go ${{ matrix.go }} |       - name: setup-go ${{ matrix.go }} | ||||||
|         uses: ./ |         uses: ./ | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								.github/workflows/workflow.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/workflow.yml
									
									
									
									
										vendored
									
									
								
							| @@ -17,16 +17,16 @@ jobs: | |||||||
|         operating-system: [ubuntu-latest, windows-latest] |         operating-system: [ubuntu-latest, windows-latest] | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout |       - name: Checkout | ||||||
|         uses: actions/checkout@v3 |         uses: actions/checkout@v2 | ||||||
|  |  | ||||||
|       - name: Setup node 16 |       - name: Setup node 16 | ||||||
|         uses: actions/setup-node@v3 |         uses: actions/setup-node@v2 | ||||||
|         with: |         with: | ||||||
|           node-version: 16 |           node-version: 16 | ||||||
|           cache: npm |           cache: npm | ||||||
|  |  | ||||||
|       - name: npm ci |       - name: npm install | ||||||
|         run: npm ci |         run: npm install | ||||||
|  |  | ||||||
|       - name: Lint |       - name: Lint | ||||||
|         run: npm run format-check |         run: npm run format-check | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								.licenses/npm/@actions/core.dep.yml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								.licenses/npm/@actions/core.dep.yml
									
									
									
										generated
									
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| --- | --- | ||||||
| name: "@actions/core" | name: "@actions/core" | ||||||
| version: 1.6.0 | version: 1.2.6 | ||||||
| type: npm | type: npm | ||||||
| summary: Actions core lib | summary: Actions core lib | ||||||
| homepage: https://github.com/actions/toolkit/tree/main/packages/core | homepage: https://github.com/actions/toolkit/tree/main/packages/core | ||||||
|   | |||||||
							
								
								
									
										32
									
								
								.licenses/npm/@actions/http-client-1.0.11.dep.yml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										32
									
								
								.licenses/npm/@actions/http-client-1.0.11.dep.yml
									
									
									
										generated
									
									
									
								
							| @@ -1,32 +0,0 @@ | |||||||
| --- |  | ||||||
| name: "@actions/http-client" |  | ||||||
| version: 1.0.11 |  | ||||||
| type: npm |  | ||||||
| summary: Actions Http Client |  | ||||||
| homepage: https://github.com/actions/http-client#readme |  | ||||||
| license: mit |  | ||||||
| licenses: |  | ||||||
| - sources: LICENSE |  | ||||||
|   text: | |  | ||||||
|     Actions Http Client for Node.js |  | ||||||
| 
 |  | ||||||
|     Copyright (c) GitHub, Inc. |  | ||||||
| 
 |  | ||||||
|     All rights reserved. |  | ||||||
| 
 |  | ||||||
|     MIT License |  | ||||||
| 
 |  | ||||||
|     Permission is hereby granted, free of charge, to any person obtaining a copy of this software and |  | ||||||
|     associated documentation files (the "Software"), to deal in the Software without restriction, |  | ||||||
|     including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, |  | ||||||
|     and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, |  | ||||||
|     subject to the following conditions: |  | ||||||
| 
 |  | ||||||
|     The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. |  | ||||||
| 
 |  | ||||||
|     THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT |  | ||||||
|     LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |  | ||||||
|     NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |  | ||||||
|     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |  | ||||||
|     SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |  | ||||||
| notices: [] |  | ||||||
| @@ -1 +1 @@ | |||||||
| * @actions/actions-service | * @actions/spark | ||||||
|   | |||||||
| @@ -55,7 +55,7 @@ a project may be further defined and clarified by project maintainers. | |||||||
| ## Enforcement | ## Enforcement | ||||||
| 
 | 
 | ||||||
| Instances of abusive, harassing, or otherwise unacceptable behavior may be | Instances of abusive, harassing, or otherwise unacceptable behavior may be | ||||||
| reported by contacting the project team at opensource+actions/setup-go@github.com. All | reported by contacting the project team at opensource@github.com. All | ||||||
| complaints will be reviewed and investigated and will result in a response that | 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 | is deemed necessary and appropriate to the circumstances. The project team is | ||||||
| obligated to maintain confidentiality with regard to the reporter of an incident. | obligated to maintain confidentiality with regard to the reporter of an incident. | ||||||
							
								
								
									
										117
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										117
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,63 +1,44 @@ | |||||||
| # setup-go | # setup-go | ||||||
|  |  | ||||||
| [](https://github.com/actions/setup-go/actions/workflows/workflow.yml) | <p align="left"> | ||||||
| [](https://github.com/actions/setup-go/actions/workflows/versions.yml) |   <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> | ||||||
|  |  | ||||||
| This action sets up a go environment for use in actions by: | 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`. | - optionally downloading and caching a version of Go by version and adding to PATH | ||||||
| - Registering problem matchers for error output. | - registering problem matchers for error output | ||||||
|  |  | ||||||
| # V3 | # V2 | ||||||
|  |  | ||||||
| The V3 edition of the action offers: | The V2 offers: | ||||||
|  | - Adds GOBIN to the PATH | ||||||
|  | - Proxy Support | ||||||
|  | - stable input  | ||||||
|  | - Bug Fixes (including issues around version matching and semver) | ||||||
|  |  | ||||||
| - Adds `GOBIN` to the `PATH` | It will first check the local cache for a version match. If version is not found locally, It will pull it from `main` branch of [go-versions](https://github.com/actions/go-versions/blob/main/versions-manifest.json) repository and on miss or failure, it will fall back to the previous behavior of download directly from [go dist](https://storage.googleapis.com/golang). | ||||||
| - Proxy support |  | ||||||
| - Check latest version |  | ||||||
| - 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): | Matching by [semver spec](https://github.com/npm/node-semver): | ||||||
|  |  | ||||||
| ```yaml | ```yaml | ||||||
| steps: | steps: | ||||||
|   - uses: actions/checkout@v3 |   - uses: actions/checkout@v2 | ||||||
|   - uses: actions/setup-go@v3 |   - uses: actions/setup-go@v2 | ||||||
|     with: |     with: | ||||||
|       go-version: '^1.13.1' # The Go version to download (if necessary) and use. |       go-version: '^1.13.1' # The Go version to download (if necessary) and use. | ||||||
|   - run: go version |   - run: go version | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| ```yaml |  | ||||||
| steps: |  | ||||||
|   - uses: actions/checkout@v3 |  | ||||||
|   - uses: actions/setup-go@v3 |  | ||||||
|     with: |  | ||||||
|       go-version: '>=1.17.0' |  | ||||||
|   - run: go version |  | ||||||
| ``` |  | ||||||
|  |  | ||||||
| Matching an unstable pre-release: | Matching an unstable pre-release: | ||||||
|  |  | ||||||
| ```yaml | ```yaml | ||||||
| steps: | steps: | ||||||
|   - uses: actions/checkout@v3 |   - uses: actions/checkout@v2 | ||||||
|   - uses: actions/setup-go@v3 |   - uses: actions/setup-go@v2 | ||||||
|     with: |     with: | ||||||
|       go-version: '1.18.0-rc.1' # The Go version to download (if necessary) and use. |       stable: 'false' | ||||||
|   - run: go version |       go-version: '1.14.0-rc1' # The Go version to download (if necessary) and use. | ||||||
| ``` |  | ||||||
|  |  | ||||||
| ```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 |   - run: go version | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| @@ -65,53 +46,17 @@ steps: | |||||||
|  |  | ||||||
| See [action.yml](action.yml) | See [action.yml](action.yml) | ||||||
|  |  | ||||||
| ## Basic | Basic: | ||||||
|  |  | ||||||
| ```yaml | ```yaml | ||||||
| steps: | steps: | ||||||
|   - uses: actions/checkout@v3 |   - uses: actions/checkout@master | ||||||
|   - uses: actions/setup-go@v3 |   - uses: actions/setup-go@v2 | ||||||
|     with: |     with: | ||||||
|       go-version: '1.16.1' # The Go version to download (if necessary) and use. |       go-version: '1.9.3' # The Go version to download (if necessary) and use. | ||||||
|   - run: go run hello.go |   - run: go run hello.go | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
|  | Matrix Testing: | ||||||
| ## 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. |  | ||||||
|  |  | ||||||
| If `check-latest` is set to `true`, the action first checks if the cached version is the latest one. If the locally cached version is not the most up-to-date, a Go version will then be downloaded. Set `check-latest` to `true` if you want the most up-to-date Go version to always be used. |  | ||||||
|  |  | ||||||
| > Setting `check-latest` to `true` has performance implications as downloading Go versions is slower than using cached versions. |  | ||||||
|  |  | ||||||
| ```yaml |  | ||||||
| steps: |  | ||||||
|   - 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 |  | ||||||
|  |  | ||||||
| ```yaml | ```yaml | ||||||
| jobs: | jobs: | ||||||
|   build: |   build: | ||||||
| @@ -121,22 +66,20 @@ jobs: | |||||||
|         go: [ '1.14', '1.13' ] |         go: [ '1.14', '1.13' ] | ||||||
|     name: Go ${{ matrix.go }} sample |     name: Go ${{ matrix.go }} sample | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v3 |       - uses: actions/checkout@v2 | ||||||
|       - name: Setup go |       - name: Setup go | ||||||
|         uses: actions/setup-go@v3 |         uses: actions/setup-go@v2 | ||||||
|         with: |         with: | ||||||
|           go-version: ${{ matrix.go }} |           go-version: ${{ matrix.go }} | ||||||
|       - run: go run hello.go |       - run: go run hello.go | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| ### Supported version syntax | ### Supported version syntax | ||||||
|  |  | ||||||
| The `go-version` input supports the following syntax: | The `go-version` input supports the following syntax: | ||||||
|  |  | ||||||
| - Specific versions: `1.15`, `1.16.1`, `1.17.0-rc.2`, `1.16.0-beta.1` | Specific versions: `1.15`, `1.16.1`, `1.17.0-rc2`, `1.16.0-beta1`   | ||||||
| - SemVer's version range syntax: `^1.13.1`, `>=1.18.0-rc.1` | SemVer's version range syntax: `^1.13.1`   | ||||||
|  | For more information about semantic versioning please refer [semver](https://github.com/npm/node-semver) documentation | ||||||
| For more information about semantic versioning, please refer to [semver](https://github.com/npm/node-semver) documentation. |  | ||||||
|  |  | ||||||
| # License | # License | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,12 +0,0 @@ | |||||||
| 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 |  | ||||||
| @@ -1,29 +1,4 @@ | |||||||
| [ | [ | ||||||
|     { |  | ||||||
|       "version": "1.17.6", |  | ||||||
|       "stable": true, |  | ||||||
|       "release_url": "https://github.com/actions/go-versions/releases/tag/1.17.6-1668090892", |  | ||||||
|       "files": [ |  | ||||||
|         { |  | ||||||
|           "filename": "go-1.17.6-darwin-x64.tar.gz", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "platform": "darwin", |  | ||||||
|           "download_url": "https://github.com/actions/go-versions/releases/download/1.17.6-1668090892/go-1.17.6-darwin-x64.tar.gz" |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           "filename": "go-1.17.6-linux-x64.tar.gz", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "platform": "linux", |  | ||||||
|           "download_url": "https://github.com/actions/go-versions/releases/download/1.17.6-1668090892/go-1.17.6-linux-x64.tar.gz" |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           "filename": "go-1.17.6-win32-x64.zip", |  | ||||||
|           "arch": "x64", |  | ||||||
|           "platform": "win32", |  | ||||||
|           "download_url": "https://github.com/actions/go-versions/releases/download/1.17.6-1668090892/go-1.17.6-win32-x64.zip" |  | ||||||
|         } |  | ||||||
|       ] |  | ||||||
|     }, |  | ||||||
|     { |     { | ||||||
|       "version": "1.12.17", |       "version": "1.12.17", | ||||||
|       "stable": true, |       "stable": true, | ||||||
|   | |||||||
| @@ -19,8 +19,6 @@ describe('setup-go', () => { | |||||||
|   let os = {} as any; |   let os = {} as any; | ||||||
|  |  | ||||||
|   let inSpy: jest.SpyInstance; |   let inSpy: jest.SpyInstance; | ||||||
|   let getBooleanInputSpy: jest.SpyInstance; |  | ||||||
|   let exportVarSpy: jest.SpyInstance; |  | ||||||
|   let findSpy: jest.SpyInstance; |   let findSpy: jest.SpyInstance; | ||||||
|   let cnSpy: jest.SpyInstance; |   let cnSpy: jest.SpyInstance; | ||||||
|   let logSpy: jest.SpyInstance; |   let logSpy: jest.SpyInstance; | ||||||
| @@ -28,30 +26,25 @@ describe('setup-go', () => { | |||||||
|   let platSpy: jest.SpyInstance; |   let platSpy: jest.SpyInstance; | ||||||
|   let archSpy: jest.SpyInstance; |   let archSpy: jest.SpyInstance; | ||||||
|   let dlSpy: jest.SpyInstance; |   let dlSpy: jest.SpyInstance; | ||||||
|   let extractTarSpy: jest.SpyInstance; |   let exSpy: jest.SpyInstance; | ||||||
|   let cacheSpy: jest.SpyInstance; |   let cacheSpy: jest.SpyInstance; | ||||||
|   let dbgSpy: jest.SpyInstance; |   let dbgSpy: jest.SpyInstance; | ||||||
|   let whichSpy: jest.SpyInstance; |   let whichSpy: jest.SpyInstance; | ||||||
|   let existsSpy: jest.SpyInstance; |   let existsSpy: jest.SpyInstance; | ||||||
|   let readFileSpy: jest.SpyInstance; |  | ||||||
|   let mkdirpSpy: jest.SpyInstance; |   let mkdirpSpy: jest.SpyInstance; | ||||||
|   let execSpy: jest.SpyInstance; |   let execSpy: jest.SpyInstance; | ||||||
|   let getManifestSpy: jest.SpyInstance; |   let getManifestSpy: jest.SpyInstance; | ||||||
|  |  | ||||||
|   beforeAll(async () => { |   beforeAll(() => { | ||||||
|     process.env['GITHUB_ENV'] = ''; // Stub out Environment file functionality so we can verify it writes to standard out (toolkit is backwards compatible) |     process.env['GITHUB_PATH'] = ''; // Stub out ENV file functionality so we can verify it writes to standard out | ||||||
|   }, 100000); |     console.log('::stop-commands::stoptoken'); // Disable executing of runner commands when running tests in actions | ||||||
|  |   }); | ||||||
|  |  | ||||||
|   beforeEach(() => { |   beforeEach(() => { | ||||||
|     process.env['GITHUB_PATH'] = ''; // Stub out ENV file functionality so we can verify it writes to standard out |  | ||||||
|  |  | ||||||
|     // @actions/core |     // @actions/core | ||||||
|     inputs = {}; |     inputs = {}; | ||||||
|     inSpy = jest.spyOn(core, 'getInput'); |     inSpy = jest.spyOn(core, 'getInput'); | ||||||
|     inSpy.mockImplementation(name => inputs[name]); |     inSpy.mockImplementation(name => inputs[name]); | ||||||
|     getBooleanInputSpy = jest.spyOn(core, 'getBooleanInput'); |  | ||||||
|     getBooleanInputSpy.mockImplementation(name => inputs[name]); |  | ||||||
|     exportVarSpy = jest.spyOn(core, 'exportVariable'); |  | ||||||
|  |  | ||||||
|     // node |     // node | ||||||
|     os = {}; |     os = {}; | ||||||
| @@ -64,7 +57,7 @@ describe('setup-go', () => { | |||||||
|     // @actions/tool-cache |     // @actions/tool-cache | ||||||
|     findSpy = jest.spyOn(tc, 'find'); |     findSpy = jest.spyOn(tc, 'find'); | ||||||
|     dlSpy = jest.spyOn(tc, 'downloadTool'); |     dlSpy = jest.spyOn(tc, 'downloadTool'); | ||||||
|     extractTarSpy = jest.spyOn(tc, 'extractTar'); |     exSpy = jest.spyOn(tc, 'extractTar'); | ||||||
|     cacheSpy = jest.spyOn(tc, 'cacheDir'); |     cacheSpy = jest.spyOn(tc, 'cacheDir'); | ||||||
|     getSpy = jest.spyOn(im, 'getVersionsDist'); |     getSpy = jest.spyOn(im, 'getVersionsDist'); | ||||||
|     getManifestSpy = jest.spyOn(tc, 'getManifestFromRepo'); |     getManifestSpy = jest.spyOn(tc, 'getManifestFromRepo'); | ||||||
| @@ -72,7 +65,6 @@ describe('setup-go', () => { | |||||||
|     // io |     // io | ||||||
|     whichSpy = jest.spyOn(io, 'which'); |     whichSpy = jest.spyOn(io, 'which'); | ||||||
|     existsSpy = jest.spyOn(fs, 'existsSync'); |     existsSpy = jest.spyOn(fs, 'existsSync'); | ||||||
|     readFileSpy = jest.spyOn(fs, 'readFileSync'); |  | ||||||
|     mkdirpSpy = jest.spyOn(io, 'mkdirP'); |     mkdirpSpy = jest.spyOn(io, 'mkdirP'); | ||||||
|  |  | ||||||
|     // gets |     // gets | ||||||
| @@ -89,7 +81,7 @@ describe('setup-go', () => { | |||||||
|     }); |     }); | ||||||
|     logSpy.mockImplementation(line => { |     logSpy.mockImplementation(line => { | ||||||
|       // uncomment to debug |       // uncomment to debug | ||||||
|       process.stderr.write('log:' + line + '\n'); |       // process.stderr.write('log:' + line + '\n'); | ||||||
|     }); |     }); | ||||||
|     dbgSpy.mockImplementation(msg => { |     dbgSpy.mockImplementation(msg => { | ||||||
|       // uncomment to see debug output |       // uncomment to see debug output | ||||||
| @@ -104,14 +96,9 @@ describe('setup-go', () => { | |||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   afterAll(async () => { |   afterAll(async () => { | ||||||
|     jest.restoreAllMocks(); |     console.log('::stoptoken::'); // Re-enable executing of runner commands when running tests in actions | ||||||
|   }, 100000); |   }, 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 () => { |   it('can find 1.9.7 from manifest on osx', async () => { | ||||||
|     os.platform = 'darwin'; |     os.platform = 'darwin'; | ||||||
|     os.arch = 'x64'; |     os.arch = 'x64'; | ||||||
| @@ -156,7 +143,7 @@ describe('setup-go', () => { | |||||||
|     os.arch = 'x64'; |     os.arch = 'x64'; | ||||||
|  |  | ||||||
|     // spec: 1.13.0 => 1.13 |     // spec: 1.13.0 => 1.13 | ||||||
|     let match: im.IGoVersion | undefined = await im.findMatch('1.13.0'); |     let match: im.IGoVersion | undefined = await im.findMatch('1.13.0', true); | ||||||
|     expect(match).toBeDefined(); |     expect(match).toBeDefined(); | ||||||
|     let version: string = match ? match.version : ''; |     let version: string = match ? match.version : ''; | ||||||
|     expect(version).toBe('go1.13'); |     expect(version).toBe('go1.13'); | ||||||
| @@ -169,7 +156,7 @@ describe('setup-go', () => { | |||||||
|     os.arch = 'x64'; |     os.arch = 'x64'; | ||||||
|  |  | ||||||
|     // spec: 1.13 => 1.13.7 (latest) |     // spec: 1.13 => 1.13.7 (latest) | ||||||
|     let match: im.IGoVersion | undefined = await im.findMatch('1.13'); |     let match: im.IGoVersion | undefined = await im.findMatch('1.13', true); | ||||||
|     expect(match).toBeDefined(); |     expect(match).toBeDefined(); | ||||||
|     let version: string = match ? match.version : ''; |     let version: string = match ? match.version : ''; | ||||||
|     expect(version).toBe('go1.13.7'); |     expect(version).toBe('go1.13.7'); | ||||||
| @@ -182,7 +169,7 @@ describe('setup-go', () => { | |||||||
|     os.arch = 'x64'; |     os.arch = 'x64'; | ||||||
|  |  | ||||||
|     // spec: ^1.13.6 => 1.13.7 |     // spec: ^1.13.6 => 1.13.7 | ||||||
|     let match: im.IGoVersion | undefined = await im.findMatch('^1.13.6'); |     let match: im.IGoVersion | undefined = await im.findMatch('^1.13.6', true); | ||||||
|     expect(match).toBeDefined(); |     expect(match).toBeDefined(); | ||||||
|     let version: string = match ? match.version : ''; |     let version: string = match ? match.version : ''; | ||||||
|     expect(version).toBe('go1.13.7'); |     expect(version).toBe('go1.13.7'); | ||||||
| @@ -195,7 +182,7 @@ describe('setup-go', () => { | |||||||
|     os.arch = 'x32'; |     os.arch = 'x32'; | ||||||
|  |  | ||||||
|     // spec: 1 => 1.13.7 (latest) |     // spec: 1 => 1.13.7 (latest) | ||||||
|     let match: im.IGoVersion | undefined = await im.findMatch('1'); |     let match: im.IGoVersion | undefined = await im.findMatch('1', true); | ||||||
|     expect(match).toBeDefined(); |     expect(match).toBeDefined(); | ||||||
|     let version: string = match ? match.version : ''; |     let version: string = match ? match.version : ''; | ||||||
|     expect(version).toBe('go1.13.7'); |     expect(version).toBe('go1.13.7'); | ||||||
| @@ -208,7 +195,10 @@ describe('setup-go', () => { | |||||||
|     os.arch = 'x64'; |     os.arch = 'x64'; | ||||||
|  |  | ||||||
|     // spec: 1.14, stable=false => go1.14rc1 |     // spec: 1.14, stable=false => go1.14rc1 | ||||||
|     let match: im.IGoVersion | undefined = await im.findMatch('1.14.0-rc.1'); |     let match: im.IGoVersion | undefined = await im.findMatch( | ||||||
|  |       '1.14.0-rc1', | ||||||
|  |       false | ||||||
|  |     ); | ||||||
|     expect(match).toBeDefined(); |     expect(match).toBeDefined(); | ||||||
|     let version: string = match ? match.version : ''; |     let version: string = match ? match.version : ''; | ||||||
|     expect(version).toBe('go1.14rc1'); |     expect(version).toBe('go1.14rc1'); | ||||||
| @@ -224,7 +214,7 @@ describe('setup-go', () => { | |||||||
|     findSpy.mockImplementation(() => toolPath); |     findSpy.mockImplementation(() => toolPath); | ||||||
|     await main.run(); |     await main.run(); | ||||||
|  |  | ||||||
|     expect(logSpy).toHaveBeenCalledWith(`Setup go version spec 1.13.0`); |     expect(logSpy).toHaveBeenCalledWith(`Setup go stable version spec 1.13.0`); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('evaluates to stable with no input', async () => { |   it('evaluates to stable with no input', async () => { | ||||||
| @@ -236,41 +226,7 @@ describe('setup-go', () => { | |||||||
|     findSpy.mockImplementation(() => toolPath); |     findSpy.mockImplementation(() => toolPath); | ||||||
|     await main.run(); |     await main.run(); | ||||||
|  |  | ||||||
|     expect(logSpy).toHaveBeenCalledWith(`Setup go version spec 1.13.0`); |     expect(logSpy).toHaveBeenCalledWith(`Setup go stable 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 () => { |   it('finds a version of go already in the cache', async () => { | ||||||
| @@ -314,14 +270,14 @@ describe('setup-go', () => { | |||||||
|     findSpy.mockImplementation(() => ''); |     findSpy.mockImplementation(() => ''); | ||||||
|     dlSpy.mockImplementation(() => '/some/temp/path'); |     dlSpy.mockImplementation(() => '/some/temp/path'); | ||||||
|     let toolPath = path.normalize('/cache/go/1.13.0/x64'); |     let toolPath = path.normalize('/cache/go/1.13.0/x64'); | ||||||
|     extractTarSpy.mockImplementation(() => '/some/other/temp/path'); |     exSpy.mockImplementation(() => '/some/other/temp/path'); | ||||||
|     cacheSpy.mockImplementation(() => toolPath); |     cacheSpy.mockImplementation(() => toolPath); | ||||||
|     await main.run(); |     await main.run(); | ||||||
|  |  | ||||||
|     let expPath = path.join(toolPath, 'bin'); |     let expPath = path.join(toolPath, 'bin'); | ||||||
|  |  | ||||||
|     expect(dlSpy).toHaveBeenCalled(); |     expect(dlSpy).toHaveBeenCalled(); | ||||||
|     expect(extractTarSpy).toHaveBeenCalled(); |     expect(exSpy).toHaveBeenCalled(); | ||||||
|     expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`); |     expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
| @@ -343,6 +299,7 @@ describe('setup-go', () => { | |||||||
|     os.platform = 'linux'; |     os.platform = 'linux'; | ||||||
|     os.arch = 'x64'; |     os.arch = 'x64'; | ||||||
|  |  | ||||||
|  |     // a version which is in the manifest | ||||||
|     let versionSpec = '1.12.16'; |     let versionSpec = '1.12.16'; | ||||||
|  |  | ||||||
|     inputs['go-version'] = versionSpec; |     inputs['go-version'] = versionSpec; | ||||||
| @@ -356,7 +313,7 @@ describe('setup-go', () => { | |||||||
|  |  | ||||||
|     dlSpy.mockImplementation(async () => '/some/temp/path'); |     dlSpy.mockImplementation(async () => '/some/temp/path'); | ||||||
|     let toolPath = path.normalize('/cache/go/1.12.16/x64'); |     let toolPath = path.normalize('/cache/go/1.12.16/x64'); | ||||||
|     extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); |     exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||||
|     cacheSpy.mockImplementation(async () => toolPath); |     cacheSpy.mockImplementation(async () => toolPath); | ||||||
|  |  | ||||||
|     await main.run(); |     await main.run(); | ||||||
| @@ -364,7 +321,7 @@ describe('setup-go', () => { | |||||||
|     let expPath = path.join(toolPath, 'bin'); |     let expPath = path.join(toolPath, 'bin'); | ||||||
|  |  | ||||||
|     expect(dlSpy).toHaveBeenCalled(); |     expect(dlSpy).toHaveBeenCalled(); | ||||||
|     expect(extractTarSpy).toHaveBeenCalled(); |     expect(exSpy).toHaveBeenCalled(); | ||||||
|     expect(logSpy).not.toHaveBeenCalledWith( |     expect(logSpy).not.toHaveBeenCalledWith( | ||||||
|       'Not found in manifest.  Falling back to download directly from Go' |       'Not found in manifest.  Falling back to download directly from Go' | ||||||
|     ); |     ); | ||||||
| @@ -380,6 +337,7 @@ describe('setup-go', () => { | |||||||
|     os.platform = 'linux'; |     os.platform = 'linux'; | ||||||
|     os.arch = 'x64'; |     os.arch = 'x64'; | ||||||
|  |  | ||||||
|  |     // a version which is in the manifest | ||||||
|     let versionSpec = '1.12'; |     let versionSpec = '1.12'; | ||||||
|  |  | ||||||
|     inputs['go-version'] = versionSpec; |     inputs['go-version'] = versionSpec; | ||||||
| @@ -393,7 +351,7 @@ describe('setup-go', () => { | |||||||
|  |  | ||||||
|     dlSpy.mockImplementation(async () => '/some/temp/path'); |     dlSpy.mockImplementation(async () => '/some/temp/path'); | ||||||
|     let toolPath = path.normalize('/cache/go/1.12.17/x64'); |     let toolPath = path.normalize('/cache/go/1.12.17/x64'); | ||||||
|     extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); |     exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||||
|     cacheSpy.mockImplementation(async () => toolPath); |     cacheSpy.mockImplementation(async () => toolPath); | ||||||
|  |  | ||||||
|     await main.run(); |     await main.run(); | ||||||
| @@ -401,7 +359,7 @@ describe('setup-go', () => { | |||||||
|     let expPath = path.join(toolPath, 'bin'); |     let expPath = path.join(toolPath, 'bin'); | ||||||
|  |  | ||||||
|     expect(dlSpy).toHaveBeenCalled(); |     expect(dlSpy).toHaveBeenCalled(); | ||||||
|     expect(extractTarSpy).toHaveBeenCalled(); |     expect(exSpy).toHaveBeenCalled(); | ||||||
|     expect(logSpy).not.toHaveBeenCalledWith( |     expect(logSpy).not.toHaveBeenCalledWith( | ||||||
|       'Not found in manifest.  Falling back to download directly from Go' |       'Not found in manifest.  Falling back to download directly from Go' | ||||||
|     ); |     ); | ||||||
| @@ -417,6 +375,7 @@ describe('setup-go', () => { | |||||||
|     os.platform = 'linux'; |     os.platform = 'linux'; | ||||||
|     os.arch = 'x64'; |     os.arch = 'x64'; | ||||||
|  |  | ||||||
|  |     // a version which is not in the manifest but is in node dist | ||||||
|     let versionSpec = '1.12.14'; |     let versionSpec = '1.12.14'; | ||||||
|  |  | ||||||
|     inputs['go-version'] = versionSpec; |     inputs['go-version'] = versionSpec; | ||||||
| @@ -430,18 +389,18 @@ describe('setup-go', () => { | |||||||
|  |  | ||||||
|     dlSpy.mockImplementation(async () => '/some/temp/path'); |     dlSpy.mockImplementation(async () => '/some/temp/path'); | ||||||
|     let toolPath = path.normalize('/cache/go/1.12.14/x64'); |     let toolPath = path.normalize('/cache/go/1.12.14/x64'); | ||||||
|     extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); |     exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||||
|     cacheSpy.mockImplementation(async () => toolPath); |     cacheSpy.mockImplementation(async () => toolPath); | ||||||
|  |  | ||||||
|     await main.run(); |     await main.run(); | ||||||
|  |  | ||||||
|     let expPath = path.join(toolPath, 'bin'); |     let expPath = path.join(toolPath, 'bin'); | ||||||
|     expect(logSpy).toHaveBeenCalledWith('Setup go version spec 1.12.14'); |     expect(logSpy).toHaveBeenCalledWith('Setup go stable version spec 1.12.14'); | ||||||
|     expect(findSpy).toHaveBeenCalled(); |     expect(findSpy).toHaveBeenCalled(); | ||||||
|     expect(logSpy).toHaveBeenCalledWith('Attempting to download 1.12.14...'); |     expect(logSpy).toHaveBeenCalledWith('Attempting to download 1.12.14...'); | ||||||
|     expect(dlSpy).toHaveBeenCalled(); |     expect(dlSpy).toHaveBeenCalled(); | ||||||
|     expect(logSpy).toHaveBeenCalledWith('matching 1.12.14...'); |     expect(logSpy).toHaveBeenCalledWith('matching 1.12.14...'); | ||||||
|     expect(extractTarSpy).toHaveBeenCalled(); |     expect(exSpy).toHaveBeenCalled(); | ||||||
|     expect(logSpy).toHaveBeenCalledWith( |     expect(logSpy).toHaveBeenCalledWith( | ||||||
|       'Not found in manifest.  Falling back to download directly from Go' |       'Not found in manifest.  Falling back to download directly from Go' | ||||||
|     ); |     ); | ||||||
| @@ -600,11 +559,11 @@ describe('setup-go', () => { | |||||||
|  |  | ||||||
|   // 1.13.1 => 1.13.1 |   // 1.13.1 => 1.13.1 | ||||||
|   // 1.13 => 1.13.0 |   // 1.13 => 1.13.0 | ||||||
|   // 1.10beta1 => 1.10.0-beta.1, 1.10rc1 => 1.10.0-rc.1 |   // 1.10beta1 => 1.10.0-beta1, 1.10rc1 => 1.10.0-rc1 | ||||||
|   // 1.8.5beta1 => 1.8.5-beta.1, 1.8.5rc1 => 1.8.5-rc.1 |   // 1.8.5beta1 => 1.8.5-beta1, 1.8.5rc1 => 1.8.5-rc1 | ||||||
|   it('converts prerelease versions', async () => { |   it('converts prerelease versions', async () => { | ||||||
|     expect(im.makeSemver('1.10beta1')).toBe('1.10.0-beta.1'); |     expect(im.makeSemver('1.10beta1')).toBe('1.10.0-beta1'); | ||||||
|     expect(im.makeSemver('1.10rc1')).toBe('1.10.0-rc.1'); |     expect(im.makeSemver('1.10rc1')).toBe('1.10.0-rc1'); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('converts dot zero versions', async () => { |   it('converts dot zero versions', async () => { | ||||||
| @@ -614,230 +573,4 @@ describe('setup-go', () => { | |||||||
|   it('does not convert exact versions', async () => { |   it('does not convert exact versions', async () => { | ||||||
|     expect(im.makeSemver('1.13.1')).toBe('1.13.1'); |     expect(im.makeSemver('1.13.1')).toBe('1.13.1'); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   describe('check-latest flag', () => { |  | ||||||
|     it("use local version and don't check manifest if check-latest is not specified", async () => { |  | ||||||
|       os.platform = 'linux'; |  | ||||||
|       os.arch = 'x64'; |  | ||||||
|  |  | ||||||
|       inputs['go-version'] = '1.16'; |  | ||||||
|       inputs['check-latest'] = false; |  | ||||||
|  |  | ||||||
|       const toolPath = path.normalize('/cache/go/1.16.1/x64'); |  | ||||||
|       findSpy.mockReturnValue(toolPath); |  | ||||||
|       await main.run(); |  | ||||||
|  |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`); |  | ||||||
|       expect(logSpy).not.toHaveBeenCalledWith( |  | ||||||
|         'Attempting to resolve the latest version from the manifest...' |  | ||||||
|       ); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     it('check latest version and resolve it from local cache', async () => { |  | ||||||
|       os.platform = 'linux'; |  | ||||||
|       os.arch = 'x64'; |  | ||||||
|  |  | ||||||
|       inputs['go-version'] = '1.16'; |  | ||||||
|       inputs['check-latest'] = true; |  | ||||||
|  |  | ||||||
|       const toolPath = path.normalize('/cache/go/1.16.1/x64'); |  | ||||||
|       findSpy.mockReturnValue(toolPath); |  | ||||||
|       dlSpy.mockImplementation(async () => '/some/temp/path'); |  | ||||||
|       extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); |  | ||||||
|       cacheSpy.mockImplementation(async () => toolPath); |  | ||||||
|  |  | ||||||
|       await main.run(); |  | ||||||
|  |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith('Setup go version spec 1.16'); |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     it('check latest version and install it from manifest', async () => { |  | ||||||
|       os.platform = 'linux'; |  | ||||||
|       os.arch = 'x64'; |  | ||||||
|  |  | ||||||
|       const versionSpec = '1.17'; |  | ||||||
|       const patchVersion = '1.17.6'; |  | ||||||
|       inputs['go-version'] = versionSpec; |  | ||||||
|       inputs['stable'] = 'true'; |  | ||||||
|       inputs['check-latest'] = true; |  | ||||||
|  |  | ||||||
|       findSpy.mockImplementation(() => ''); |  | ||||||
|       dlSpy.mockImplementation(async () => '/some/temp/path'); |  | ||||||
|       const toolPath = path.normalize('/cache/go/1.17.5/x64'); |  | ||||||
|       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'; |  | ||||||
|  |  | ||||||
|       await main.run(); |  | ||||||
|  |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith( |  | ||||||
|         `Setup go version spec ${versionSpec}` |  | ||||||
|       ); |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith( |  | ||||||
|         'Attempting to resolve the latest version from the manifest...' |  | ||||||
|       ); |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith(`Resolved as '${patchVersion}'`); |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith( |  | ||||||
|         `Attempting to download ${patchVersion}...` |  | ||||||
|       ); |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith('Extracting Go...'); |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith('Adding to the cache ...'); |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith('Added go to the path'); |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith( |  | ||||||
|         `Successfully set up Go version ${versionSpec}` |  | ||||||
|       ); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     it('fallback to dist if version is not found in manifest', async () => { |  | ||||||
|       os.platform = 'linux'; |  | ||||||
|       os.arch = 'x64'; |  | ||||||
|  |  | ||||||
|       let versionSpec = '1.13'; |  | ||||||
|  |  | ||||||
|       inputs['go-version'] = versionSpec; |  | ||||||
|       inputs['check-latest'] = true; |  | ||||||
|       inputs['always-auth'] = false; |  | ||||||
|       inputs['token'] = 'faketoken'; |  | ||||||
|  |  | ||||||
|       // ... but not in the local cache |  | ||||||
|       findSpy.mockImplementation(() => ''); |  | ||||||
|  |  | ||||||
|       dlSpy.mockImplementation(async () => '/some/temp/path'); |  | ||||||
|       let toolPath = path.normalize('/cache/go/1.13.7/x64'); |  | ||||||
|       extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); |  | ||||||
|       cacheSpy.mockImplementation(async () => toolPath); |  | ||||||
|  |  | ||||||
|       await main.run(); |  | ||||||
|  |  | ||||||
|       let expPath = path.join(toolPath, 'bin'); |  | ||||||
|  |  | ||||||
|       expect(dlSpy).toHaveBeenCalled(); |  | ||||||
|       expect(extractTarSpy).toHaveBeenCalled(); |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith( |  | ||||||
|         'Attempting to resolve the latest version from the manifest...' |  | ||||||
|       ); |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith( |  | ||||||
|         `Failed to resolve version ${versionSpec} from manifest` |  | ||||||
|       ); |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith( |  | ||||||
|         `Attempting to download ${versionSpec}...` |  | ||||||
|       ); |  | ||||||
|       expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     it('fallback to dist if manifest is not available', async () => { |  | ||||||
|       os.platform = 'linux'; |  | ||||||
|       os.arch = 'x64'; |  | ||||||
|  |  | ||||||
|       let versionSpec = '1.13'; |  | ||||||
|  |  | ||||||
|       process.env['GITHUB_PATH'] = ''; |  | ||||||
|  |  | ||||||
|       inputs['go-version'] = versionSpec; |  | ||||||
|       inputs['check-latest'] = true; |  | ||||||
|       inputs['always-auth'] = false; |  | ||||||
|       inputs['token'] = 'faketoken'; |  | ||||||
|  |  | ||||||
|       // ... but not in the local cache |  | ||||||
|       findSpy.mockImplementation(() => ''); |  | ||||||
|       getManifestSpy.mockImplementation(() => { |  | ||||||
|         throw new Error('Unable to download manifest'); |  | ||||||
|       }); |  | ||||||
|  |  | ||||||
|       dlSpy.mockImplementation(async () => '/some/temp/path'); |  | ||||||
|       let toolPath = path.normalize('/cache/go/1.13.7/x64'); |  | ||||||
|       extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); |  | ||||||
|       cacheSpy.mockImplementation(async () => toolPath); |  | ||||||
|  |  | ||||||
|       await main.run(); |  | ||||||
|  |  | ||||||
|       let expPath = path.join(toolPath, 'bin'); |  | ||||||
|  |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith( |  | ||||||
|         `Failed to resolve version ${versionSpec} from manifest` |  | ||||||
|       ); |  | ||||||
|       expect(dlSpy).toHaveBeenCalled(); |  | ||||||
|       expect(extractTarSpy).toHaveBeenCalled(); |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith( |  | ||||||
|         'Attempting to resolve the latest version from the manifest...' |  | ||||||
|       ); |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith( |  | ||||||
|         'Unable to resolve a version from the manifest...' |  | ||||||
|       ); |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith( |  | ||||||
|         `Failed to resolve version ${versionSpec} from manifest` |  | ||||||
|       ); |  | ||||||
|       expect(logSpy).toHaveBeenCalledWith( |  | ||||||
|         `Attempting to download ${versionSpec}...` |  | ||||||
|       ); |  | ||||||
|  |  | ||||||
|       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}` |  | ||||||
|       ); |  | ||||||
|     }); |  | ||||||
|   }); |  | ||||||
| }); | }); | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								action.yml
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								action.yml
									
									
									
									
									
								
							| @@ -4,17 +4,12 @@ author: 'GitHub' | |||||||
| inputs:  | inputs:  | ||||||
|   go-version: |   go-version: | ||||||
|     description: 'The Go version to download (if necessary) and use. Supports semver spec and ranges.' |     description: 'The Go version to download (if necessary) and use. Supports semver spec and ranges.' | ||||||
|   go-version-file: |   stable: | ||||||
|     description: 'Path to the go.mod file.' |     description: 'Whether to download only stable versions' | ||||||
|   check-latest: |     default: 'true' | ||||||
|     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 |  | ||||||
|   token: |   token: | ||||||
|     description: Used to pull node distributions from go-versions.  Since there's a default, this is typically not supplied by the user. |     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 }} |     default: ${{ github.token }} | ||||||
| outputs: |  | ||||||
|   go-version: |  | ||||||
|     description: 'The installed Go version. Useful when given a version range as input.' |  | ||||||
| runs: | runs: | ||||||
|   using: 'node16' |   using: 'node16' | ||||||
|   main: 'dist/index.js' |   main: 'dist/index.js' | ||||||
|   | |||||||
							
								
								
									
										6807
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6807
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,69 +0,0 @@ | |||||||
| # 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) |  | ||||||
							
								
								
									
										4686
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4686
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -23,7 +23,7 @@ | |||||||
|   "author": "GitHub", |   "author": "GitHub", | ||||||
|   "license": "MIT", |   "license": "MIT", | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "@actions/core": "^1.6.0", |     "@actions/core": "^1.2.6", | ||||||
|     "@actions/http-client": "^1.0.6", |     "@actions/http-client": "^1.0.6", | ||||||
|     "@actions/io": "^1.0.2", |     "@actions/io": "^1.0.2", | ||||||
|     "@actions/tool-cache": "^1.5.5", |     "@actions/tool-cache": "^1.5.5", | ||||||
| @@ -31,9 +31,9 @@ | |||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|     "@types/jest": "^27.0.2", |     "@types/jest": "^27.0.2", | ||||||
|     "@types/node": "^16.11.25", |     "@types/node": "^12.0.4", | ||||||
|     "@types/semver": "^6.0.0", |     "@types/semver": "^6.0.0", | ||||||
|     "@vercel/ncc": "^0.33.4", |     "@zeit/ncc": "^0.21.0", | ||||||
|     "jest": "^27.2.5", |     "jest": "^27.2.5", | ||||||
|     "jest-circus": "^27.2.5", |     "jest-circus": "^27.2.5", | ||||||
|     "nock": "^10.0.6", |     "nock": "^10.0.6", | ||||||
|   | |||||||
| @@ -4,7 +4,6 @@ import * as path from 'path'; | |||||||
| import * as semver from 'semver'; | import * as semver from 'semver'; | ||||||
| import * as httpm from '@actions/http-client'; | import * as httpm from '@actions/http-client'; | ||||||
| import * as sys from './system'; | import * as sys from './system'; | ||||||
| import fs from 'fs'; |  | ||||||
| import os from 'os'; | import os from 'os'; | ||||||
|  |  | ||||||
| type InstallationType = 'dist' | 'manifest'; | type InstallationType = 'dist' | 'manifest'; | ||||||
| @@ -31,27 +30,12 @@ export interface IGoVersionInfo { | |||||||
|  |  | ||||||
| export async function getGo( | export async function getGo( | ||||||
|   versionSpec: string, |   versionSpec: string, | ||||||
|   checkLatest: boolean, |   stable: boolean, | ||||||
|   auth: string | undefined |   auth: string | undefined | ||||||
| ) { | ) { | ||||||
|   let osPlat: string = os.platform(); |   let osPlat: string = os.platform(); | ||||||
|   let osArch: string = os.arch(); |   let osArch: string = os.arch(); | ||||||
|  |  | ||||||
|   if (checkLatest) { |  | ||||||
|     core.info('Attempting to resolve the latest version from the manifest...'); |  | ||||||
|     const resolvedVersion = await resolveVersionFromManifest( |  | ||||||
|       versionSpec, |  | ||||||
|       true, |  | ||||||
|       auth |  | ||||||
|     ); |  | ||||||
|     if (resolvedVersion) { |  | ||||||
|       versionSpec = resolvedVersion; |  | ||||||
|       core.info(`Resolved as '${versionSpec}'`); |  | ||||||
|     } else { |  | ||||||
|       core.info(`Failed to resolve version ${versionSpec} from manifest`); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // check cache |   // check cache | ||||||
|   let toolPath: string; |   let toolPath: string; | ||||||
|   toolPath = tc.find('go', versionSpec); |   toolPath = tc.find('go', versionSpec); | ||||||
| @@ -68,7 +52,7 @@ export async function getGo( | |||||||
|   // Try download from internal distribution (popular versions only) |   // Try download from internal distribution (popular versions only) | ||||||
|   // |   // | ||||||
|   try { |   try { | ||||||
|     info = await getInfoFromManifest(versionSpec, true, auth); |     info = await getInfoFromManifest(versionSpec, stable, auth); | ||||||
|     if (info) { |     if (info) { | ||||||
|       downloadPath = await installGoVersion(info, auth); |       downloadPath = await installGoVersion(info, auth); | ||||||
|     } else { |     } else { | ||||||
| @@ -95,7 +79,7 @@ export async function getGo( | |||||||
|   // Download from storage.googleapis.com |   // Download from storage.googleapis.com | ||||||
|   // |   // | ||||||
|   if (!downloadPath) { |   if (!downloadPath) { | ||||||
|     info = await getInfoFromDist(versionSpec); |     info = await getInfoFromDist(versionSpec, stable); | ||||||
|     if (!info) { |     if (!info) { | ||||||
|       throw new Error( |       throw new Error( | ||||||
|         `Unable to find Go version '${versionSpec}' for platform ${osPlat} and architecture ${osArch}.` |         `Unable to find Go version '${versionSpec}' for platform ${osPlat} and architecture ${osArch}.` | ||||||
| @@ -113,20 +97,6 @@ export async function getGo( | |||||||
|   return downloadPath; |   return downloadPath; | ||||||
| } | } | ||||||
|  |  | ||||||
| async function resolveVersionFromManifest( |  | ||||||
|   versionSpec: string, |  | ||||||
|   stable: boolean, |  | ||||||
|   auth: string | undefined |  | ||||||
| ): Promise<string | undefined> { |  | ||||||
|   try { |  | ||||||
|     const info = await getInfoFromManifest(versionSpec, stable, auth); |  | ||||||
|     return info?.resolvedVersion; |  | ||||||
|   } catch (err) { |  | ||||||
|     core.info('Unable to resolve a version from the manifest...'); |  | ||||||
|     core.debug(err.message); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| async function installGoVersion( | async function installGoVersion( | ||||||
|   info: IGoVersionInfo, |   info: IGoVersionInfo, | ||||||
|   auth: string | undefined |   auth: string | undefined | ||||||
| @@ -191,10 +161,11 @@ export async function getInfoFromManifest( | |||||||
| } | } | ||||||
|  |  | ||||||
| async function getInfoFromDist( | async function getInfoFromDist( | ||||||
|   versionSpec: string |   versionSpec: string, | ||||||
|  |   stable: boolean | ||||||
| ): Promise<IGoVersionInfo | null> { | ): Promise<IGoVersionInfo | null> { | ||||||
|   let version: IGoVersion | undefined; |   let version: IGoVersion | undefined; | ||||||
|   version = await findMatch(versionSpec); |   version = await findMatch(versionSpec, stable); | ||||||
|   if (!version) { |   if (!version) { | ||||||
|     return null; |     return null; | ||||||
|   } |   } | ||||||
| @@ -210,7 +181,8 @@ async function getInfoFromDist( | |||||||
| } | } | ||||||
|  |  | ||||||
| export async function findMatch( | export async function findMatch( | ||||||
|   versionSpec: string |   versionSpec: string, | ||||||
|  |   stable: boolean | ||||||
| ): Promise<IGoVersion | undefined> { | ): Promise<IGoVersion | undefined> { | ||||||
|   let archFilter = sys.getArch(); |   let archFilter = sys.getArch(); | ||||||
|   let platFilter = sys.getPlatform(); |   let platFilter = sys.getPlatform(); | ||||||
| @@ -231,8 +203,18 @@ export async function findMatch( | |||||||
|     let candidate: IGoVersion = candidates[i]; |     let candidate: IGoVersion = candidates[i]; | ||||||
|     let version = makeSemver(candidate.version); |     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}`); |     core.debug(`check ${version} satisfies ${versionSpec}`); | ||||||
|     if (semver.satisfies(version, versionSpec)) { |     if ( | ||||||
|  |       semver.satisfies(version, versionSpec) && | ||||||
|  |       (!stable || candidate.stable === stable) | ||||||
|  |     ) { | ||||||
|       goFile = candidate.files.find(file => { |       goFile = candidate.files.find(file => { | ||||||
|         core.debug( |         core.debug( | ||||||
|           `${file.arch}===${archFilter} && ${file.os}===${platFilter}` |           `${file.arch}===${archFilter} && ${file.os}===${platFilter}` | ||||||
| @@ -272,41 +254,20 @@ export async function getVersionsDist( | |||||||
| // Convert the go version syntax into semver for semver matching | // Convert the go version syntax into semver for semver matching | ||||||
| // 1.13.1 => 1.13.1 | // 1.13.1 => 1.13.1 | ||||||
| // 1.13 => 1.13.0 | // 1.13 => 1.13.0 | ||||||
| // 1.10beta1 => 1.10.0-beta.1, 1.10rc1 => 1.10.0-rc.1 | // 1.10beta1 => 1.10.0-beta1, 1.10rc1 => 1.10.0-rc1 | ||||||
| // 1.8.5beta1 => 1.8.5-beta.1, 1.8.5rc1 => 1.8.5-rc.1 | // 1.8.5beta1 => 1.8.5-beta1, 1.8.5rc1 => 1.8.5-rc1 | ||||||
| export function makeSemver(version: string): string { | export function makeSemver(version: string): string { | ||||||
|   version = version.replace('go', ''); |   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 parts = version.split('-'); | ||||||
|  |  | ||||||
|   let semVersion = semver.coerce(parts[0])?.version; |   let verPart: string = parts[0]; | ||||||
|   if (!semVersion) { |   let prereleasePart = parts.length > 1 ? `-${parts[1]}` : ''; | ||||||
|     throw new Error( |  | ||||||
|       `The version: ${version} can't be changed to SemVer notation` |   let verParts: string[] = verPart.split('.'); | ||||||
|     ); |   if (verParts.length == 2) { | ||||||
|  |     verPart += '.0'; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   if (!parts[1]) { |   return `${verPart}${prereleasePart}`; | ||||||
|     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(); |  | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										64
									
								
								src/main.ts
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								src/main.ts
									
									
									
									
									
								
							| @@ -1,7 +1,6 @@ | |||||||
| import * as core from '@actions/core'; | import * as core from '@actions/core'; | ||||||
| import * as io from '@actions/io'; | import * as io from '@actions/io'; | ||||||
| import * as installer from './installer'; | import * as installer from './installer'; | ||||||
| import * as semver from 'semver'; |  | ||||||
| import path from 'path'; | import path from 'path'; | ||||||
| import cp from 'child_process'; | import cp from 'child_process'; | ||||||
| import fs from 'fs'; | import fs from 'fs'; | ||||||
| @@ -13,30 +12,27 @@ export async function run() { | |||||||
|     // versionSpec is optional.  If supplied, install / use from the tool cache |     // 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. |     // If not supplied then problem matchers will still be setup.  Useful for self-hosted. | ||||||
|     // |     // | ||||||
|     const versionSpec = resolveVersionInput(); |     let versionSpec = core.getInput('go-version'); | ||||||
|  |  | ||||||
|     core.info(`Setup go version spec ${versionSpec}`); |     // 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}`); | ||||||
|  |  | ||||||
|     if (versionSpec) { |     if (versionSpec) { | ||||||
|       let token = core.getInput('token'); |       let token = core.getInput('token'); | ||||||
|       let auth = !token || isGhes() ? undefined : `token ${token}`; |       let auth = !token || isGhes() ? undefined : `token ${token}`; | ||||||
|  |  | ||||||
|       const checkLatest = core.getBooleanInput('check-latest'); |       const installDir = await installer.getGo(versionSpec, stable, auth); | ||||||
|       const installDir = await installer.getGo(versionSpec, checkLatest, auth); |  | ||||||
|  |  | ||||||
|  |       core.exportVariable('GOROOT', installDir); | ||||||
|       core.addPath(path.join(installDir, 'bin')); |       core.addPath(path.join(installDir, 'bin')); | ||||||
|       core.info('Added go to the path'); |       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(); |       let added = await addBinToPath(); | ||||||
|       core.debug(`add bin ${added}`); |       core.debug(`add bin ${added}`); | ||||||
|       core.info(`Successfully set up Go version ${versionSpec}`); |       core.info(`Successfully setup go version ${versionSpec}`); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // add problem matchers |     // add problem matchers | ||||||
| @@ -48,8 +44,6 @@ export async function run() { | |||||||
|     let goVersion = (cp.execSync(`${goPath} version`) || '').toString(); |     let goVersion = (cp.execSync(`${goPath} version`) || '').toString(); | ||||||
|     core.info(goVersion); |     core.info(goVersion); | ||||||
|  |  | ||||||
|     core.setOutput('go-version', parseGoVersion(goVersion)); |  | ||||||
|  |  | ||||||
|     core.startGroup('go env'); |     core.startGroup('go env'); | ||||||
|     let goEnv = (cp.execSync(`${goPath} env`) || '').toString(); |     let goEnv = (cp.execSync(`${goPath} env`) || '').toString(); | ||||||
|     core.info(goEnv); |     core.info(goEnv); | ||||||
| @@ -69,19 +63,19 @@ export async function addBinToPath(): Promise<boolean> { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   let buf = cp.execSync('go env GOPATH'); |   let buf = cp.execSync('go env GOPATH'); | ||||||
|   if (buf.length > 1) { |   if (buf) { | ||||||
|     let gp = buf.toString().trim(); |     let gp = buf.toString().trim(); | ||||||
|     core.debug(`go env GOPATH :${gp}:`); |     core.debug(`go env GOPATH :${gp}:`); | ||||||
|     if (!fs.existsSync(gp)) { |     if (!fs.existsSync(gp)) { | ||||||
|       // some of the hosted images have go install but not profile dir |       // some of the hosted images have go install but not profile dir | ||||||
|       core.debug(`creating ${gp}`); |       core.debug(`creating ${gp}`); | ||||||
|       await io.mkdirP(gp); |       io.mkdirP(gp); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     let bp = path.join(gp, 'bin'); |     let bp = path.join(gp, 'bin'); | ||||||
|     if (!fs.existsSync(bp)) { |     if (!fs.existsSync(bp)) { | ||||||
|       core.debug(`creating ${bp}`); |       core.debug(`creating ${bp}`); | ||||||
|       await io.mkdirP(bp); |       io.mkdirP(bp); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     core.addPath(bp); |     core.addPath(bp); | ||||||
| @@ -96,37 +90,3 @@ function isGhes(): boolean { | |||||||
|   ); |   ); | ||||||
|   return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; |   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 @@ | |||||||
| const os = require('os'); | let os = require('os'); | ||||||
|  |  | ||||||
| export function getPlatform(): string { | export function getPlatform(): string { | ||||||
|   // darwin and linux match already |   // darwin and linux match already | ||||||
|   | |||||||
| @@ -4,6 +4,9 @@ | |||||||
|     // "incremental": true,                   /* Enable incremental compilation */ |     // "incremental": true,                   /* Enable incremental compilation */ | ||||||
|     "target": "es6",                          /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ |     "target": "es6",                          /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ | ||||||
|     "module": "commonjs",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ |     "module": "commonjs",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ | ||||||
|  |     "lib": [ | ||||||
|  |       "es6" | ||||||
|  |     ], | ||||||
|     // "allowJs": true,                       /* Allow javascript files to be compiled. */ |     // "allowJs": true,                       /* Allow javascript files to be compiled. */ | ||||||
|     // "checkJs": true,                       /* Report errors in .js files. */ |     // "checkJs": true,                       /* Report errors in .js files. */ | ||||||
|     // "jsx": "preserve",                     /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ |     // "jsx": "preserve",                     /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ | ||||||
| @@ -45,8 +48,7 @@ | |||||||
|     // "typeRoots": [],                       /* List of folders to include type definitions from. */ |     // "typeRoots": [],                       /* List of folders to include type definitions from. */ | ||||||
|     // "types": [],                           /* Type declaration files to be included in compilation. */ |     // "types": [],                           /* Type declaration files to be included in compilation. */ | ||||||
|     // "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ |     // "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ | ||||||
|     "esModuleInterop": true,                  /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ |     "esModuleInterop": true                   /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ | ||||||
|     "sourceMap": true, |  | ||||||
|     // "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */ |     // "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */ | ||||||
|     // "allowUmdGlobalAccess": true,          /* Allow accessing UMD globals from modules. */ |     // "allowUmdGlobalAccess": true,          /* Allow accessing UMD globals from modules. */ | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user