mirror of
				https://github.com/actions/setup-go.git
				synced 2025-10-31 07:30:31 +00:00 
			
		
		
		
	Compare commits
	
		
			29 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | f6164bd8c8 | ||
|   | 2bb2aab2fd | ||
|   | edcbc0c2cd | ||
|   | fb9a043dd8 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 5b0ae0e97d | ||
|   | bfdd3570ce | ||
|   | 44e221478f | ||
|   | 424fc82d43 | ||
|   | 82388ea9d4 | ||
|   | fdeec47002 | ||
|   | 3e9d5483e6 | ||
|   | 02f7ea9f09 | ||
|   | 5805cf725b | ||
|   | 35030c1fd2 | ||
|   | 59d644db2a | ||
|   | 76929df236 | ||
|   | b06835a88c | ||
|   | b8a24202e2 | ||
|   | e234d99c78 | ||
|   | 0ea1f64ec9 | ||
|   | 331ce1d993 | ||
|   | 1087a81afd | ||
|   | ecd878f81d | ||
|   | eca066937b | ||
|   | e816064dae | ||
|   | bba6fe1d58 | ||
|   | 3b4dc6cbed | ||
|   | afe68ffd57 | ||
|   | 6eb700292f | 
							
								
								
									
										38
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | --- | ||||||
|  | name: Bug report | ||||||
|  | about: Create a bug report | ||||||
|  | title: '' | ||||||
|  | labels: bug, needs triage | ||||||
|  | assignees: '' | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | <!--- Please direct any generic questions related to actions to our support community forum at https://github.community/c/code-to-cloud/github-actions/41 ---> | ||||||
|  | <!--- Before opening up a new bug report, please make sure to check for similar existing issues --> | ||||||
|  |  | ||||||
|  | **Description:** | ||||||
|  | A clear and concise description of what the bug is. | ||||||
|  |  | ||||||
|  | **Action version:** | ||||||
|  | Specify the action version | ||||||
|  |  | ||||||
|  | **Platform:** | ||||||
|  | - [ ] Ubuntu | ||||||
|  | - [ ] macOS | ||||||
|  | - [ ] Windows | ||||||
|  |  | ||||||
|  | **Runner type:** | ||||||
|  | - [ ] Hosted | ||||||
|  | - [ ] Self-hosted | ||||||
|  |  | ||||||
|  | **Tools version:** | ||||||
|  | <!--- Please specify go version --> | ||||||
|  |  | ||||||
|  | **Repro steps:**   | ||||||
|  | A description with steps to reproduce the issue. If your have a public example or repo to share, please provide the link. | ||||||
|  |  | ||||||
|  | **Expected behavior:** | ||||||
|  | A description of what you expected to happen. | ||||||
|  |  | ||||||
|  | **Actual behavior:** | ||||||
|  | A description of what is actually happening. | ||||||
							
								
								
									
										1
									
								
								.github/ISSUE_TEMPLATE/config.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.github/ISSUE_TEMPLATE/config.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | blank_issues_enabled: false | ||||||
							
								
								
									
										18
									
								
								.github/ISSUE_TEMPLATE/feature_request.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								.github/ISSUE_TEMPLATE/feature_request.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | --- | ||||||
|  | name: Feature request | ||||||
|  | about: Suggest an idea for this project | ||||||
|  | title: '' | ||||||
|  | labels: feature request, needs triage | ||||||
|  | assignees: '' | ||||||
|  | --- | ||||||
|  | <!--- Please direct any generic questions related to actions to our support community forum at https://github.community/c/code-to-cloud/github-actions/41 ---> | ||||||
|  | <!--- Before opening up a new feature request, please make sure to check for similar existing issues and pull requests --> | ||||||
|  |  | ||||||
|  | **Description:** | ||||||
|  | Describe your proposal. | ||||||
|  |  | ||||||
|  | **Justification:** | ||||||
|  | Justification or a use case for your proposal. | ||||||
|  |  | ||||||
|  | **Are you willing to submit a PR?** | ||||||
|  | <!--- We accept contributions! --> | ||||||
							
								
								
									
										9
									
								
								.github/pull_request_template.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								.github/pull_request_template.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | **Description:** | ||||||
|  | Describe your changes. | ||||||
|  |  | ||||||
|  | **Related issue:** | ||||||
|  | Add link to the related issue. | ||||||
|  |  | ||||||
|  | **Check list:** | ||||||
|  | - [ ] Mark if documentation changes are required. | ||||||
|  | - [ ] Mark if tests were added or updated to cover the changes. | ||||||
							
								
								
									
										51
									
								
								.github/workflows/check-dist.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								.github/workflows/check-dist.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | |||||||
|  | # `dist/index.js` is a special file in Actions. | ||||||
|  | # When you reference an action with `uses:` in a workflow, | ||||||
|  | # `index.js` is the code that will run. | ||||||
|  | # For our project, we generate this file through a build process from other source files. | ||||||
|  | # We need to make sure the checked-in `index.js` actually matches what we expect it to be. | ||||||
|  | name: Check dist/ | ||||||
|  |  | ||||||
|  | on: | ||||||
|  |   push: | ||||||
|  |     branches: | ||||||
|  |       - main | ||||||
|  |     paths-ignore: | ||||||
|  |       - '**.md' | ||||||
|  |   pull_request: | ||||||
|  |     paths-ignore: | ||||||
|  |       - '**.md' | ||||||
|  |   workflow_dispatch: | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |   check-dist: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |  | ||||||
|  |     steps: | ||||||
|  |       - uses: actions/checkout@v2 | ||||||
|  |  | ||||||
|  |       - name: Set Node.js 16.x | ||||||
|  |         uses: actions/setup-node@v2 | ||||||
|  |         with: | ||||||
|  |           node-version: 16.x | ||||||
|  |  | ||||||
|  |       - name: Install dependencies | ||||||
|  |         run: npm ci | ||||||
|  |  | ||||||
|  |       - name: Rebuild the dist/ directory | ||||||
|  |         run: npm run build | ||||||
|  |  | ||||||
|  |       - name: Compare the expected and actual dist/ directories | ||||||
|  |         run: | | ||||||
|  |           if [ "$(git diff --ignore-space-at-eol dist/ | wc -l)" -gt "0" ]; then | ||||||
|  |             echo "Detected uncommitted changes after build.  See status below:" | ||||||
|  |             git diff | ||||||
|  |             exit 1 | ||||||
|  |           fi | ||||||
|  |         id: diff | ||||||
|  |  | ||||||
|  |       # If index.js was different than expected, upload the expected version as an artifact | ||||||
|  |       - uses: actions/upload-artifact@v2 | ||||||
|  |         if: ${{ failure() && steps.diff.conclusion == 'failure' }} | ||||||
|  |         with: | ||||||
|  |           name: dist | ||||||
|  |           path: dist/ | ||||||
							
								
								
									
										16
									
								
								.github/workflows/licensed.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								.github/workflows/licensed.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,8 +1,12 @@ | |||||||
| name: Licensed | name: Licensed | ||||||
|  |  | ||||||
| on: | on: | ||||||
|   push: {branches: main} |   push: | ||||||
|   pull_request: {branches: main} |     branches: | ||||||
|  |       - main | ||||||
|  |   pull_request: | ||||||
|  |     branches: | ||||||
|  |       - main | ||||||
|  |  | ||||||
| jobs: | jobs: | ||||||
|   test: |   test: | ||||||
| @@ -10,11 +14,15 @@ jobs: | |||||||
|     name: Check licenses |     name: Check licenses | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v2 |       - uses: actions/checkout@v2 | ||||||
|  |       - name: Set Node.js 16.x | ||||||
|  |         uses: actions/setup-node@v2 | ||||||
|  |         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/2.12.2/licensed-2.12.2-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 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 | ||||||
|   | |||||||
							
								
								
									
										27
									
								
								.github/workflows/release-new-action-version.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								.github/workflows/release-new-action-version.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | name: Release new action version | ||||||
|  | on: | ||||||
|  |   release: | ||||||
|  |     types: [released] | ||||||
|  |   workflow_dispatch: | ||||||
|  |     inputs: | ||||||
|  |       TAG_NAME: | ||||||
|  |         description: 'Tag name that the major tag will point to' | ||||||
|  |         required: true | ||||||
|  |  | ||||||
|  | env: | ||||||
|  |   TAG_NAME: ${{ github.event.inputs.TAG_NAME || github.event.release.tag_name }} | ||||||
|  | permissions: | ||||||
|  |   contents: write | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |   update_tag: | ||||||
|  |     name: Update the major tag to include the ${{ github.event.inputs.TAG_NAME || github.event.release.tag_name }} changes | ||||||
|  |     environment: | ||||||
|  |       name: releaseNewActionVersion | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     steps: | ||||||
|  |       - name: Update the ${{ env.TAG_NAME }} tag | ||||||
|  |         uses: actions/publish-action@v0.1.0 | ||||||
|  |         with: | ||||||
|  |           source-tag: ${{ env.TAG_NAME }} | ||||||
|  |           slack-webhook: ${{ secrets.SLACK_WEBHOOK }} | ||||||
							
								
								
									
										39
									
								
								.github/workflows/versions.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								.github/workflows/versions.yml
									
									
									
									
										vendored
									
									
								
							| @@ -33,6 +33,23 @@ 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@v2 | ||||||
|  |       - name: Setup Go and check latest | ||||||
|  |         uses: ./ | ||||||
|  |         with: | ||||||
|  |           go-version: ${{ matrix.go-version }} | ||||||
|  |           check-latest: true | ||||||
|  |       - name: Verify Go | ||||||
|  |         run: go version | ||||||
|  |  | ||||||
|   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 }} | ||||||
| @@ -61,14 +78,16 @@ 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.7, 1.8.6] |         go: [1.9, 1.8.6] | ||||||
|     steps: |     steps: | ||||||
|     - name: Checkout |       - name: Checkout | ||||||
|       uses: actions/checkout@v2 |         uses: actions/checkout@v2 | ||||||
|     - name: setup-go ${{ matrix.go }} |  | ||||||
|       uses: ./ |       - name: setup-go ${{ matrix.go }} | ||||||
|       with: |         uses: ./ | ||||||
|         go-version: ${{ matrix.go }} |         with: | ||||||
|     - name: verify go |           go-version: ${{ matrix.go }} | ||||||
|       run: __tests__/verify-go.sh ${{ matrix.go }} |  | ||||||
|       shell: bash |       - name: verify go | ||||||
|  |         run: __tests__/verify-go.sh ${{ matrix.go }} | ||||||
|  |         shell: bash | ||||||
|   | |||||||
							
								
								
									
										31
									
								
								.github/workflows/workflow.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										31
									
								
								.github/workflows/workflow.yml
									
									
									
									
										vendored
									
									
								
							| @@ -16,23 +16,24 @@ jobs: | |||||||
|       matrix: |       matrix: | ||||||
|         operating-system: [ubuntu-latest, windows-latest] |         operating-system: [ubuntu-latest, windows-latest] | ||||||
|     steps: |     steps: | ||||||
|     - name: Checkout |       - name: Checkout | ||||||
|       uses: actions/checkout@v2 |         uses: actions/checkout@v2 | ||||||
|  |  | ||||||
|     - name: Setup node 12 |       - name: Setup node 16 | ||||||
|       uses: actions/setup-node@v1 |         uses: actions/setup-node@v2 | ||||||
|       with: |         with: | ||||||
|         node-version: 12 |           node-version: 16 | ||||||
|  |           cache: npm | ||||||
|  |  | ||||||
|     - name: npm install |       - name: npm ci | ||||||
|       run: npm install |         run: npm ci | ||||||
|  |  | ||||||
|     - name: Lint |       - name: Lint | ||||||
|       run: npm run format-check |         run: npm run format-check | ||||||
|  |  | ||||||
|     - name: npm test |       - name: npm test | ||||||
|       run: npm test |         run: npm test | ||||||
|  |  | ||||||
|     - name: audit packages |       - name: audit packages | ||||||
|       run: npm audit --audit-level=high |         run: npm audit --audit-level=high | ||||||
|       if: matrix.operating-system == 'ubuntu-latest' |         if: matrix.operating-system == 'ubuntu-latest' | ||||||
|   | |||||||
							
								
								
									
										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.2.6 | version: 1.6.0 | ||||||
| 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
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								.licenses/npm/@actions/http-client-1.0.11.dep.yml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | --- | ||||||
|  | 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
									
								
								CODEOWNERS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								CODEOWNERS
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | * @actions/spark | ||||||
							
								
								
									
										73
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										73
									
								
								README.md
									
									
									
									
									
								
							| @@ -16,51 +16,71 @@ This action sets up a go environment for use in actions by: | |||||||
| The V2 offers: | The V2 offers: | ||||||
| - Adds GOBIN to the PATH | - Adds GOBIN to the PATH | ||||||
| - Proxy Support | - Proxy Support | ||||||
| - stable input  | - `stable` input  | ||||||
|  | - Check latest version | ||||||
| - Bug Fixes (including issues around version matching and semver) | - Bug Fixes (including issues around version matching and semver) | ||||||
|  |  | ||||||
| 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). | 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). | ||||||
|  |  | ||||||
| Matching by semver spec: | Matching by [semver spec](https://github.com/npm/node-semver): | ||||||
| ```yaml | ```yaml | ||||||
| steps: | steps: | ||||||
| - uses: actions/checkout@v2 |   - uses: actions/checkout@v2 | ||||||
| - uses: actions/setup-go@v2 |   - 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 | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| Matching an unstable pre-release: | Matching an unstable pre-release: | ||||||
| ```yaml | ```yaml | ||||||
| steps: | steps: | ||||||
| - uses: actions/checkout@v2 |   - uses: actions/checkout@v2 | ||||||
| - uses: actions/setup-go@v2 |   - uses: actions/setup-go@v2 | ||||||
|   with: |     with: | ||||||
|     stable: 'false' |       stable: 'false' | ||||||
|     go-version: '1.14.0-rc1' # The Go version to download (if necessary) and use. |       go-version: '1.14.0-rc1' # The Go version to download (if necessary) and use. | ||||||
| - run: go version |   - run: go version | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| # Usage | # Usage | ||||||
|  |  | ||||||
| See [action.yml](action.yml) | See [action.yml](action.yml) | ||||||
|  |  | ||||||
| Basic: | ## Basic: | ||||||
| ```yaml | ```yaml | ||||||
| steps: | steps: | ||||||
| - uses: actions/checkout@master |   - uses: actions/checkout@v2 | ||||||
| - uses: actions/setup-go@v1 |   - uses: actions/setup-go@v2 | ||||||
|   with: |     with: | ||||||
|     go-version: '1.9.3' # The Go version to download (if necessary) and use. |       go-version: '1.16.1' # 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@v2 | ||||||
|  |   - uses: actions/setup-go@v2 | ||||||
|  |     with: | ||||||
|  |       go-version: '1.14' | ||||||
|  |       check-latest: true | ||||||
|  |   - run: go run hello.go | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ## Matrix Testing: | ||||||
| ```yaml | ```yaml | ||||||
| jobs: | jobs: | ||||||
|   build: |   build: | ||||||
|     runs-on: ubuntu-16.04 |     runs-on: ubuntu-latest | ||||||
|     strategy: |     strategy: | ||||||
|       matrix: |       matrix: | ||||||
|         go: [ '1.14', '1.13' ] |         go: [ '1.14', '1.13' ] | ||||||
| @@ -68,12 +88,19 @@ jobs: | |||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v2 |       - uses: actions/checkout@v2 | ||||||
|       - name: Setup go |       - name: Setup go | ||||||
|         uses: actions/setup-go@v1 |         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 | ||||||
|  | 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 | ||||||
|  |  | ||||||
| # License | # License | ||||||
|  |  | ||||||
| The scripts and documentation in this project are released under the [MIT License](LICENSE) | The scripts and documentation in this project are released under the [MIT License](LICENSE) | ||||||
|   | |||||||
| @@ -1,4 +1,29 @@ | |||||||
| [ | [ | ||||||
|  |     { | ||||||
|  |       "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,6 +19,7 @@ describe('setup-go', () => { | |||||||
|   let os = {} as any; |   let os = {} as any; | ||||||
|  |  | ||||||
|   let inSpy: jest.SpyInstance; |   let inSpy: jest.SpyInstance; | ||||||
|  |   let getBooleanInputSpy: 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; | ||||||
| @@ -35,16 +36,19 @@ describe('setup-go', () => { | |||||||
|   let execSpy: jest.SpyInstance; |   let execSpy: jest.SpyInstance; | ||||||
|   let getManifestSpy: jest.SpyInstance; |   let getManifestSpy: jest.SpyInstance; | ||||||
|  |  | ||||||
|   beforeAll(() => { |   beforeAll(async () => { | ||||||
|     process.env['GITHUB_PATH'] = ''; // Stub out ENV file functionality so we can verify it writes to standard out |     process.env['GITHUB_ENV'] = ''; // Stub out Environment file functionality so we can verify it writes to standard out (toolkit is backwards compatible) | ||||||
|     console.log('::stop-commands::stoptoken'); // Disable executing of runner commands when running tests in actions |   }, 100000); | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   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]); | ||||||
|  |  | ||||||
|     // node |     // node | ||||||
|     os = {}; |     os = {}; | ||||||
| @@ -81,7 +85,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 | ||||||
| @@ -96,7 +100,7 @@ describe('setup-go', () => { | |||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   afterAll(async () => { |   afterAll(async () => { | ||||||
|     console.log('::stoptoken::'); // Re-enable executing of runner commands when running tests in actions |     jest.restoreAllMocks(); | ||||||
|   }, 100000); |   }, 100000); | ||||||
|  |  | ||||||
|   it('can find 1.9.7 from manifest on osx', async () => { |   it('can find 1.9.7 from manifest on osx', async () => { | ||||||
| @@ -143,7 +147,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', true); |     let match: im.IGoVersion | undefined = await im.findMatch('1.13.0'); | ||||||
|     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'); | ||||||
| @@ -156,7 +160,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', true); |     let match: im.IGoVersion | undefined = await im.findMatch('1.13'); | ||||||
|     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'); | ||||||
| @@ -169,7 +173,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', true); |     let match: im.IGoVersion | undefined = await im.findMatch('^1.13.6'); | ||||||
|     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 +186,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', true); |     let match: im.IGoVersion | undefined = await im.findMatch('1'); | ||||||
|     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,10 +199,7 @@ 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( |     let match: im.IGoVersion | undefined = await im.findMatch('1.14.0-rc.1'); | ||||||
|       '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'); | ||||||
| @@ -214,7 +215,7 @@ describe('setup-go', () => { | |||||||
|     findSpy.mockImplementation(() => toolPath); |     findSpy.mockImplementation(() => toolPath); | ||||||
|     await main.run(); |     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 () => { |   it('evaluates to stable with no input', async () => { | ||||||
| @@ -226,7 +227,7 @@ describe('setup-go', () => { | |||||||
|     findSpy.mockImplementation(() => toolPath); |     findSpy.mockImplementation(() => toolPath); | ||||||
|     await main.run(); |     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('finds a version of go already in the cache', async () => { |   it('finds a version of go already in the cache', async () => { | ||||||
| @@ -299,7 +300,6 @@ 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; | ||||||
| @@ -337,7 +337,6 @@ 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; | ||||||
| @@ -375,7 +374,6 @@ 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; | ||||||
| @@ -395,7 +393,7 @@ describe('setup-go', () => { | |||||||
|     await main.run(); |     await main.run(); | ||||||
|  |  | ||||||
|     let expPath = path.join(toolPath, 'bin'); |     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(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(); | ||||||
| @@ -497,6 +495,16 @@ describe('setup-go', () => { | |||||||
|     expect(annotation.message).toBe('undefined: fmt.Printl'); |     expect(annotation.message).toBe('undefined: fmt.Printl'); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|  |   it('matches on unix path down the tree', async () => { | ||||||
|  |     let line = 'foo/main.go:13:2: undefined: fmt.Printl'; | ||||||
|  |     let annotation = testMatch(line); | ||||||
|  |     expect(annotation).toBeDefined(); | ||||||
|  |     expect(annotation.line).toBe(13); | ||||||
|  |     expect(annotation.column).toBe(2); | ||||||
|  |     expect(annotation.file).toBe('foo/main.go'); | ||||||
|  |     expect(annotation.message).toBe('undefined: fmt.Printl'); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|   it('matches on rooted unix path', async () => { |   it('matches on rooted unix path', async () => { | ||||||
|     let line = '/assert.go:4:1: missing return at end of function'; |     let line = '/assert.go:4:1: missing return at end of function'; | ||||||
|     let annotation = testMatch(line); |     let annotation = testMatch(line); | ||||||
| @@ -549,11 +557,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-beta1, 1.10rc1 => 1.10.0-rc1 |   // 1.10beta1 => 1.10.0-beta.1, 1.10rc1 => 1.10.0-rc.1 | ||||||
|   // 1.8.5beta1 => 1.8.5-beta1, 1.8.5rc1 => 1.8.5-rc1 |   // 1.8.5beta1 => 1.8.5-beta.1, 1.8.5rc1 => 1.8.5-rc.1 | ||||||
|   it('converts prerelease versions', async () => { |   it('converts prerelease versions', async () => { | ||||||
|     expect(im.makeSemver('1.10beta1')).toBe('1.10.0-beta1'); |     expect(im.makeSemver('1.10beta1')).toBe('1.10.0-beta.1'); | ||||||
|     expect(im.makeSemver('1.10rc1')).toBe('1.10.0-rc1'); |     expect(im.makeSemver('1.10rc1')).toBe('1.10.0-rc.1'); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('converts dot zero versions', async () => { |   it('converts dot zero versions', async () => { | ||||||
| @@ -563,4 +571,166 @@ 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'); | ||||||
|  |       exSpy.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'); | ||||||
|  |       exSpy.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 setup 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'); | ||||||
|  |       exSpy.mockImplementation(async () => '/some/other/temp/path'); | ||||||
|  |       cacheSpy.mockImplementation(async () => toolPath); | ||||||
|  |  | ||||||
|  |       await main.run(); | ||||||
|  |  | ||||||
|  |       let expPath = path.join(toolPath, 'bin'); | ||||||
|  |  | ||||||
|  |       expect(dlSpy).toHaveBeenCalled(); | ||||||
|  |       expect(exSpy).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'); | ||||||
|  |       exSpy.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(exSpy).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}`); | ||||||
|  |     }); | ||||||
|  |   }); | ||||||
| }); | }); | ||||||
|   | |||||||
| @@ -4,12 +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.' | ||||||
|   stable: |   check-latest: | ||||||
|     description: 'Whether to download only stable versions' |     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: 'true' |     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 }} | ||||||
| runs: | runs: | ||||||
|   using: 'node12' |   using: 'node16' | ||||||
|   main: 'dist/index.js' |   main: 'dist/index.js' | ||||||
|   | |||||||
							
								
								
									
										1001
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1001
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -4,7 +4,7 @@ | |||||||
|             "owner": "go", |             "owner": "go", | ||||||
|             "pattern": [ |             "pattern": [ | ||||||
|                 { |                 { | ||||||
|                     "regexp": "^\\s*(\\.{0,2}[\\/\\\\].+\\.go):(?:(\\d+):(\\d+):)? (.*)", |                     "regexp": "^\\s*(.+\\.go):(?:(\\d+):(\\d+):)? (.*)", | ||||||
|                     "file": 1, |                     "file": 1, | ||||||
|                     "line": 2, |                     "line": 2, | ||||||
|                     "column": 3, |                     "column": 3, | ||||||
| @@ -13,4 +13,4 @@ | |||||||
|             ] |             ] | ||||||
|         } |         } | ||||||
|     ] |     ] | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										16378
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										16378
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										12
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								package.json
									
									
									
									
									
								
							| @@ -23,22 +23,22 @@ | |||||||
|   "author": "GitHub", |   "author": "GitHub", | ||||||
|   "license": "MIT", |   "license": "MIT", | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "@actions/core": "^1.2.6", |     "@actions/core": "^1.6.0", | ||||||
|     "@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", | ||||||
|     "semver": "^6.1.1" |     "semver": "^6.1.1" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|     "@types/jest": "^24.0.13", |     "@types/jest": "^27.0.2", | ||||||
|     "@types/node": "^12.0.4", |     "@types/node": "^16.11.25", | ||||||
|     "@types/semver": "^6.0.0", |     "@types/semver": "^6.0.0", | ||||||
|     "@zeit/ncc": "^0.21.0", |     "@zeit/ncc": "^0.21.0", | ||||||
|     "jest": "^25.2.1", |     "jest": "^27.2.5", | ||||||
|     "jest-circus": "^24.7.1", |     "jest-circus": "^27.2.5", | ||||||
|     "nock": "^10.0.6", |     "nock": "^10.0.6", | ||||||
|     "prettier": "^1.17.1", |     "prettier": "^1.17.1", | ||||||
|     "ts-jest": "^24.0.2", |     "ts-jest": "^27.0.5", | ||||||
|     "typescript": "^3.8.3" |     "typescript": "^3.8.3" | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -30,12 +30,27 @@ export interface IGoVersionInfo { | |||||||
|  |  | ||||||
| export async function getGo( | export async function getGo( | ||||||
|   versionSpec: string, |   versionSpec: string, | ||||||
|   stable: boolean, |   checkLatest: 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); | ||||||
| @@ -52,7 +67,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, stable, auth); |     info = await getInfoFromManifest(versionSpec, true, auth); | ||||||
|     if (info) { |     if (info) { | ||||||
|       downloadPath = await installGoVersion(info, auth); |       downloadPath = await installGoVersion(info, auth); | ||||||
|     } else { |     } else { | ||||||
| @@ -79,7 +94,7 @@ export async function getGo( | |||||||
|   // Download from storage.googleapis.com |   // Download from storage.googleapis.com | ||||||
|   // |   // | ||||||
|   if (!downloadPath) { |   if (!downloadPath) { | ||||||
|     info = await getInfoFromDist(versionSpec, stable); |     info = await getInfoFromDist(versionSpec); | ||||||
|     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}.` | ||||||
| @@ -97,6 +112,20 @@ 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 | ||||||
| @@ -122,10 +151,10 @@ async function installGoVersion( | |||||||
| } | } | ||||||
|  |  | ||||||
| export async function extractGoArchive(archivePath: string): Promise<string> { | export async function extractGoArchive(archivePath: string): Promise<string> { | ||||||
|   const arch = os.arch(); |   const platform = os.platform(); | ||||||
|   let extPath: string; |   let extPath: string; | ||||||
|  |  | ||||||
|   if (arch === 'win32') { |   if (platform === 'win32') { | ||||||
|     extPath = await tc.extractZip(archivePath); |     extPath = await tc.extractZip(archivePath); | ||||||
|   } else { |   } else { | ||||||
|     extPath = await tc.extractTar(archivePath); |     extPath = await tc.extractTar(archivePath); | ||||||
| @@ -161,11 +190,10 @@ 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, stable); |   version = await findMatch(versionSpec); | ||||||
|   if (!version) { |   if (!version) { | ||||||
|     return null; |     return null; | ||||||
|   } |   } | ||||||
| @@ -181,8 +209,7 @@ 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(); | ||||||
| @@ -203,18 +230,8 @@ 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 ( |     if (semver.satisfies(version, versionSpec)) { | ||||||
|       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}` | ||||||
| @@ -254,20 +271,30 @@ 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-beta1, 1.10rc1 => 1.10.0-rc1 | // 1.10beta1 => 1.10.0-beta.1, 1.10rc1 => 1.10.0-rc.1 | ||||||
| // 1.8.5beta1 => 1.8.5-beta1, 1.8.5rc1 => 1.8.5-rc1 | // 1.8.5beta1 => 1.8.5-beta.1, 1.8.5rc1 => 1.8.5-rc.1 | ||||||
| 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 verPart: string = parts[0]; |   let semVersion = semver.coerce(parts[0])?.version; | ||||||
|   let prereleasePart = parts.length > 1 ? `-${parts[1]}` : ''; |   if (!semVersion) { | ||||||
|  |     throw new Error( | ||||||
|   let verParts: string[] = verPart.split('.'); |       `The version: ${version} can't be changed to SemVer notation` | ||||||
|   if (verParts.length == 2) { |     ); | ||||||
|     verPart += '.0'; |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   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; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -14,17 +14,14 @@ export async function run() { | |||||||
|     // |     // | ||||||
|     let versionSpec = core.getInput('go-version'); |     let versionSpec = core.getInput('go-version'); | ||||||
|  |  | ||||||
|     // stable will be true unless false is the exact input |     core.info(`Setup go version spec ${versionSpec}`); | ||||||
|     // 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 installDir = await installer.getGo(versionSpec, stable, auth); |       const checkLatest = core.getBooleanInput('check-latest'); | ||||||
|  |       const installDir = await installer.getGo(versionSpec, checkLatest, auth); | ||||||
|  |  | ||||||
|       core.exportVariable('GOROOT', installDir); |       core.exportVariable('GOROOT', installDir); | ||||||
|       core.addPath(path.join(installDir, 'bin')); |       core.addPath(path.join(installDir, 'bin')); | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| let os = require('os'); | const os = require('os'); | ||||||
|  |  | ||||||
| export function getPlatform(): string { | export function getPlatform(): string { | ||||||
|   // darwin and linux match already |   // darwin and linux match already | ||||||
|   | |||||||
| @@ -4,9 +4,6 @@ | |||||||
|     // "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'. */ | ||||||
| @@ -48,7 +45,8 @@ | |||||||
|     // "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