Compare commits

...
26 Commits
Author SHA1 Message Date
aparnajyothi-y be3c94b385 Add Publish Immutable Action (#584) 2025-04-16 22:16:48 -05:00
Priya Gupta b4b75a2513 v3 - upgrade @actions/cache (#579)
* Upgrade-actions/cache for v3

* Upgrade actions/upload-artifact from v3 to v4

* audit fix

* Replaced macos-latest with macos-13

* fix check failures
2025-04-13 22:13:57 -05:00
Dmitry Shibanov 6edd4406fa fix log for stable aliases (#303) 2022-12-12 15:45:36 +01:00
Milos Pantic 38dbe75f81 Add stable and oldstable aliases (#300) 2022-12-12 10:58:49 +01:00
Marko Zivic 30c39bfe0c Merge pull request #301 from jongwooo/chore/use-cache-in-check-dist
Use cache in check-dist.yml
2022-12-07 10:16:09 +01:00
Jongwoo Han 8377b69a56 Use cache in check-dist.yml
Signed-off-by: jongwooo <jongwooo.han@gmail.com>
2022-12-07 00:59:49 +09:00
Marko Zivic d0a58c1c4d Merge pull request #294 from JamesMGreene/patch-1
Update to latest `actions/publish-action`
2022-11-24 08:26:51 +01:00
James M. Greene 3dcd9d6eb3 Update to latest actions/publish-action
To avoid Actions core deprecation messages.

https://github.com/actions/publish-action/releases/tag/v0.2.1
2022-11-22 10:26:58 -06:00
Marko Zivic e983b65a44 Merge pull request #283 from koba1t/add_support_gowork_for_go-version-file
add support go.work file for go-version-file
2022-11-08 11:45:09 +01:00
Dmitry Shibanov 27b43e1b0d Pass the token input through on GHES (#277) 2022-11-02 12:21:18 +01:00
koba1t 7678c83214 add support gowork for go-version-file 2022-11-01 21:25:30 +09:00
n33pm c4a742cab1 fix(): cache resolve version input (#267) 2022-10-17 18:33:22 +02:00
Marko Zivic f556e5b7e0 Merge pull request #273 from rentziass/rentziass/update-actions-core
Update @actions/core to 1.10.0
2022-10-07 13:50:39 +02:00
Francesco Renzi 514ae57904 Update @actions/core to 1.10.0 2022-10-06 12:08:35 +01:00
Marko Zivic 30b9ddff11 Merge pull request #264 from e-korolevskii/258-not-throw-err-no-cache-folders
Not throw err no cache folder
2022-09-09 14:32:33 +02:00
Evgenii Korolevskii c4e169859f prettier format 2022-09-08 15:11:06 +02:00
Evgenii Korolevskii db58e98a43 format 2022-09-08 14:53:17 +02:00
Evgenii Korolevskii 2905db4069 update build 2022-09-08 13:26:20 +02:00
Evgenii Korolevskii 57452eb902 fix debug lines in test 2022-09-08 13:24:00 +02:00
Evgenii Korolevskii 5547b9ed8d fix(cache): Not throw err if no cache folders 2022-09-08 13:18:41 +02:00
Evgenii Korolevskii be45b2722d build 2022-09-08 12:29:13 +02:00
Milos Pantic 4c32251b06 Update package lock version (#261) 2022-09-05 13:22:20 +02:00
Aleksey Zhukov e68a999c97 Fix broken code of conduct link (#260) 2022-09-05 12:39:44 +02:00
Marko Zivic b855b20887 Merge pull request #257 from panticmilos/vmpantic/update-package-version
Update version in package json
2022-09-01 09:50:51 +02:00
Milos Pantic bf059911e8 Fix package json action version 2022-08-31 17:34:04 +02:00
panticmilos 884d2909a6 Update version in package json 2022-08-31 16:12:17 +02:00
65 changed files with 119764 additions and 83983 deletions

No files matched your search

+2 -1
View File
@@ -27,6 +27,7 @@ jobs:
uses: actions/setup-node@v3
with:
node-version: 16.x
cache: npm
- name: Install dependencies
run: npm ci
@@ -44,7 +45,7 @@ jobs:
id: diff
# If index.js was different than expected, upload the expected version as an artifact
- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v4
if: ${{ failure() && steps.diff.conclusion == 'failure' }}
with:
name: dist
@@ -0,0 +1,20 @@
name: 'Publish Immutable Action Version'
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
packages: write
steps:
- name: Checking out
uses: actions/checkout@v4
- name: Publish
id: publish
uses: actions/publish-immutable-action@v0.0.4
@@ -21,7 +21,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Update the ${{ env.TAG_NAME }} tag
uses: actions/publish-action@v0.1.0
uses: actions/publish-action@v0.2.1
with:
source-tag: ${{ env.TAG_NAME }}
slack-webhook: ${{ secrets.SLACK_WEBHOOK }}
+75 -5
View File
@@ -12,6 +12,57 @@ on:
- cron: 0 0 * * *
jobs:
stable:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- uses: actions/checkout@v3
- name: Setup Go Stable
uses: ./
with:
go-version: stable
- name: Verify Go
run: go version
oldstable:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- uses: actions/checkout@v3
- name: Setup Go oldStable
uses: ./
with:
go-version: oldstable
- name: Verify Go
run: go version
aliases-arch:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
version: [stable, oldstable]
architecture: [x64, x32]
exclude:
- os: macos-latest
architecture: x32
steps:
- uses: actions/checkout@v3
- name: Setup Go ${{ matrix.version }} ${{ matrix.architecture }}
uses: ./
with:
go-version: ${{ matrix.version }}
architecture: ${{ matrix.architecture }}
- name: Verify Go
run: go version
local-cache:
name: Setup local-cache version
runs-on: ${{ matrix.os }}
@@ -55,7 +106,7 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
os: [ubuntu-latest, windows-latest, macos-13]
steps:
- uses: actions/checkout@v3
- name: Setup Go and check latest
@@ -66,13 +117,29 @@ jobs:
run: __tests__/verify-go.sh 1.14
shell: bash
go-version-file-with-gowork:
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.work
- name: verify go
run: __tests__/verify-go.sh 1.19
shell: bash
setup-versions-from-manifest:
name: Setup ${{ matrix.go }} ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [macos-latest, windows-latest, ubuntu-latest]
os: [macos-13, windows-latest, ubuntu-latest]
go: [1.12.16, 1.13.11, 1.14.3]
steps:
- name: Checkout
@@ -93,8 +160,11 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [macos-latest, windows-latest, ubuntu-latest]
go: [1.9, 1.8.6]
os: [macos-13, windows-latest, ubuntu-latest]
go: [1.11.12, 1.8.6]
exclude:
- os: macos-13
go: 1.8.6
steps:
- name: Checkout
uses: actions/checkout@v3
@@ -123,4 +193,4 @@ jobs:
go-version: ${{ matrix.go-version }}
architecture: x64
- name: Verify Go
run: go version
run: go version
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
+45 -2
View File
@@ -16,6 +16,7 @@ The V3 edition of the action offers:
- Proxy support
- Check latest version
- Caching packages dependencies
- stable and oldstable aliases
- 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).
@@ -95,6 +96,33 @@ steps:
check-latest: true
- run: go run hello.go
```
## Using stable/oldstable aliases
If `stable` is provided, action will get the latest stable version from the [`go-versions`](https://github.com/actions/go-versions/blob/main/versions-manifest.json) repository manifest.
If `oldstable` is provided, when current release is 1.19.x, action will resolve version as 1.18.x, where x is the latest patch release.
**Note:** using these aliases will result in same version as using corresponding minor release with `check-latest` input set to `true`
```yaml
steps:
- uses: actions/checkout@v3
- uses: actions/setup-go@v3
with:
go-version: 'stable'
- run: go run hello.go
```
```yaml
steps:
- uses: actions/checkout@v3
- uses: actions/setup-go@v3
with:
go-version: 'oldstable'
- run: go run hello.go
```
## Caching dependency files and build outputs:
The action has a built-in functionality for caching and restoring go modules and build outputs. It uses [actions/cache](https://github.com/actions/cache) under the hood but requires less configuration settings. The `cache` input is optional, and caching is turned off by default.
@@ -127,7 +155,7 @@ steps:
```
## 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.
The `go-version-file` input accepts a path to a `go.mod` file or a `go.work` file that contains 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
@@ -169,6 +197,21 @@ The `go-version` input supports the following syntax:
For more information about semantic versioning, please refer to [semver](https://github.com/npm/node-semver) documentation.
## Using `setup-go` on GHES
`setup-go` comes pre-installed on the appliance with GHES if Actions is enabled. When dynamically downloading Go distributions, `setup-go` downloads distributions from [`actions/go-versions`](https://github.com/actions/go-versions) on github.com (outside of the appliance). These calls to `actions/go-versions` are made via unauthenticated requests, which are limited to [60 requests per hour per IP](https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting). If more requests are made within the time frame, then you will start to see rate-limit errors during downloading that looks like: `##[error]API rate limit exceeded for...`. After that error the action will try to download versions directly from https://storage.googleapis.com/golang, but it also can have rate limit so it's better to put token.
To get a higher rate limit, you can [generate a personal access token on github.com](https://github.com/settings/tokens/new) and pass it as the `token` input for the action:
```yaml
uses: actions/setup-go@v3
with:
token: ${{ secrets.GH_DOTCOM_TOKEN }}
go-version: 1.18
```
If the runner is not able to access github.com, any Go versions requested during a workflow run must come from the runner's tool cache. See "[Setting up the tool cache on self-hosted runners without internet access](https://docs.github.com/en/enterprise-server@3.2/admin/github-actions/managing-access-to-actions-from-githubcom/setting-up-the-tool-cache-on-self-hosted-runners-without-internet-access)" for more information.
# License
The scripts and documentation in this project are released under the [MIT License](LICENSE)
@@ -179,4 +222,4 @@ Contributions are welcome! See [Contributor's Guide](docs/contributors.md)
## Code of Conduct
:wave: Be nice. See [our code of conduct](CONDUCT)
:wave: Be nice. See [our code of conduct](CODE_OF_CONDUCT.md)
+16 -3
View File
@@ -17,6 +17,7 @@ describe('restoreCache', () => {
let infoSpy = jest.spyOn(core, 'info');
let setOutputSpy = jest.spyOn(core, 'setOutput');
const versionSpec = '1.13.1';
const packageManager = 'default';
const cacheDependencyPath = 'path';
@@ -40,7 +41,11 @@ describe('restoreCache', () => {
//Act + Assert
expect(async () => {
await cacheRestore.restoreCache(packageManager, cacheDependencyPath);
await cacheRestore.restoreCache(
versionSpec,
packageManager,
cacheDependencyPath
);
}).rejects.toThrowError(
'Some specified paths were not resolved, unable to cache dependencies.'
);
@@ -61,7 +66,11 @@ describe('restoreCache', () => {
});
//Act + Assert
await cacheRestore.restoreCache(packageManager, cacheDependencyPath);
await cacheRestore.restoreCache(
versionSpec,
packageManager,
cacheDependencyPath
);
expect(infoSpy).toBeCalledWith(`Cache is not found`);
});
@@ -80,7 +89,11 @@ describe('restoreCache', () => {
});
//Act + Assert
await cacheRestore.restoreCache(packageManager, cacheDependencyPath);
await cacheRestore.restoreCache(
versionSpec,
packageManager,
cacheDependencyPath
);
expect(setOutputSpy).toBeCalledWith('cache-hit', true);
});
});
+3
View File
@@ -0,0 +1,3 @@
go 1.19
use .
+54 -12
View File
@@ -41,6 +41,7 @@ describe('setup-go', () => {
let mkdirpSpy: jest.SpyInstance;
let execSpy: jest.SpyInstance;
let getManifestSpy: jest.SpyInstance;
let getAllVersionsSpy: jest.SpyInstance;
beforeAll(async () => {
process.env['GITHUB_ENV'] = ''; // Stub out Environment file functionality so we can verify it writes to standard out (toolkit is backwards compatible)
@@ -83,6 +84,7 @@ describe('setup-go', () => {
cacheSpy = jest.spyOn(tc, 'cacheDir');
getSpy = jest.spyOn(im, 'getVersionsDist');
getManifestSpy = jest.spyOn(tc, 'getManifestFromRepo');
getAllVersionsSpy = jest.spyOn(im, 'getManifest');
// io
whichSpy = jest.spyOn(io, 'which');
@@ -295,7 +297,6 @@ describe('setup-go', () => {
findSpy.mockImplementation(() => toolPath);
await main.run();
let expPath = path.join(toolPath, 'bin');
expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`);
});
@@ -462,9 +463,6 @@ describe('setup-go', () => {
inputs['go-version'] = versionSpec;
inputs['token'] = 'faketoken';
let expectedUrl =
'https://github.com/actions/go-versions/releases/download/1.12.14-20200616.18/go-1.12.14-linux-x64.tar.gz';
// ... but not in the local cache
findSpy.mockImplementation(() => '');
@@ -526,7 +524,7 @@ describe('setup-go', () => {
});
mkdirpSpy.mockImplementation(async () => {});
existsSpy.mockImplementation(path => {
existsSpy.mockImplementation(() => {
return false;
});
@@ -704,11 +702,9 @@ describe('setup-go', () => {
findSpy.mockImplementation(() => '');
dlSpy.mockImplementation(async () => '/some/temp/path');
const toolPath = path.normalize('/cache/go/1.17.5/x64');
const toolPath = path.normalize('/cache/go/1.17.6/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();
@@ -785,6 +781,7 @@ describe('setup-go', () => {
getManifestSpy.mockImplementation(() => {
throw new Error('Unable to download manifest');
});
getAllVersionsSpy.mockImplementationOnce(() => undefined);
dlSpy.mockImplementation(async () => '/some/temp/path');
let toolPath = path.normalize('/cache/go/1.13.7/x64');
@@ -830,11 +827,17 @@ require (
replace example.com/thatmodule => ../thatmodule
exclude example.com/thismodule v1.3.0
`;
const goWorkContents = `go 1.19
use .
`;
it('reads version from go.mod', async () => {
inputs['go-version-file'] = 'go.mod';
existsSpy.mockImplementation(path => true);
existsSpy.mockImplementation(() => true);
readFileSpy.mockImplementation(() => Buffer.from(goModContents));
await main.run();
@@ -844,9 +847,21 @@ exclude example.com/thismodule v1.3.0
expect(logSpy).toHaveBeenCalledWith('matching 1.14...');
});
it('reads version from go.work', async () => {
inputs['go-version-file'] = 'go.work';
existsSpy.mockImplementation(() => true);
readFileSpy.mockImplementation(() => Buffer.from(goWorkContents));
await main.run();
expect(logSpy).toHaveBeenCalledWith('Setup go version spec 1.19');
expect(logSpy).toHaveBeenCalledWith('Attempting to download 1.19...');
expect(logSpy).toHaveBeenCalledWith('matching 1.19...');
});
it('reads version from .go-version', async () => {
inputs['go-version-file'] = '.go-version';
existsSpy.mockImplementation(path => true);
existsSpy.mockImplementation(() => true);
readFileSpy.mockImplementation(() => Buffer.from(`1.13.0${osm.EOL}`));
await main.run();
@@ -859,7 +874,7 @@ exclude example.com/thismodule v1.3.0
it('is overwritten by go-version', async () => {
inputs['go-version'] = '1.13.1';
inputs['go-version-file'] = 'go.mod';
existsSpy.mockImplementation(path => true);
existsSpy.mockImplementation(() => true);
readFileSpy.mockImplementation(() => Buffer.from(goModContents));
await main.run();
@@ -871,7 +886,7 @@ exclude example.com/thismodule v1.3.0
it('reports a read failure', async () => {
inputs['go-version-file'] = 'go.mod';
existsSpy.mockImplementation(path => false);
existsSpy.mockImplementation(() => false);
await main.run();
@@ -914,5 +929,32 @@ exclude example.com/thismodule v1.3.0
);
}
}, 100000);
it.each(['stable', 'oldstable'])(
'acquires latest go version with %s go-version input',
async (alias: string) => {
const arch = 'x64';
os.platform = 'darwin';
os.arch = arch;
inputs['go-version'] = alias;
inputs['architecture'] = os.arch;
// ... but not in the local cache
findSpy.mockImplementation(() => '');
dlSpy.mockImplementation(async () => '/some/temp/path');
let toolPath = path.normalize(`/cache/go/${alias}/${arch}`);
cacheSpy.mockImplementation(async () => toolPath);
await main.run();
const releaseIndex = alias === 'stable' ? 0 : 1;
expect(logSpy).toHaveBeenCalledWith(
`${alias} version resolved as ${goTestManifest[releaseIndex].version}`
);
}
);
});
});
+5 -5
View File
@@ -5,13 +5,13 @@ inputs:
go-version:
description: 'The Go version to download (if necessary) and use. Supports semver spec and ranges.'
go-version-file:
description: 'Path to the go.mod file.'
description: 'Path to the go.mod or go.work file.'
check-latest:
description: 'Set this option to true if you want the action to always check for the latest available version that satisfies the version spec'
default: false
token:
description: Used to pull node distributions from go-versions. Since there's a default, this is typically not supplied by the user.
default: ${{ github.token }}
description: Used to pull node distributions from go-versions. Since there's a default, this is typically not supplied by the user. When running this action on github.com, the default value is sufficient. When running on GHES, you can pass a personal access token for github.com if you are experiencing rate limiting.
default: ${{ github.server_url == 'https://github.com' && github.token || '' }}
cache:
description: Used to specify whether caching is needed. Set to true, if you'd like to enable caching.
default: false
@@ -21,8 +21,8 @@ inputs:
description: 'Target architecture for Go to use. Examples: x86, x64. Will use system architecture by default.'
outputs:
go-version:
description: 'The installed Go version. Useful when given a version range as input.'
cache-hit:
description: 'The installed Go version. Useful when given a version range as input.'
cache-hit:
description: 'A boolean value to indicate if a cache was hit'
runs:
using: 'node16'
+59054 -41474
View File
File diff suppressed because it is too large. Load diff
+59285 -41547
View File
File diff suppressed because it is too large. Load diff
+1058 -908
View File
File diff suppressed because it is too large. Load diff
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "setup-go",
"version": "1.0.0",
"version": "3.3.0",
"private": true,
"description": "setup go action",
"main": "lib/setup-go.js",
@@ -23,8 +23,8 @@
"author": "GitHub",
"license": "MIT",
"dependencies": {
"@actions/cache": "^3.0.0",
"@actions/core": "^1.6.0",
"@actions/cache": "^4.0.3",
"@actions/core": "^1.10.0",
"@actions/exec": "^1.1.0",
"@actions/glob": "^0.2.0",
"@actions/http-client": "^2.0.1",
@@ -42,6 +42,6 @@
"nock": "^10.0.6",
"prettier": "^1.17.1",
"ts-jest": "^27.0.5",
"typescript": "^3.8.3"
"typescript": "^4.3.3"
}
}
+1 -1
View File
@@ -9,12 +9,12 @@ import {PackageManagerInfo} from './package-managers';
import {getCacheDirectoryPath, getPackageManagerInfo} from './cache-utils';
export const restoreCache = async (
versionSpec: string,
packageManager: string,
cacheDependencyPath?: string
) => {
const packageManagerInfo = await getPackageManagerInfo(packageManager);
const platform = process.env.RUNNER_OS;
const versionSpec = core.getInput('go-version');
const cachePaths = await getCacheDirectoryPath(packageManagerInfo);
+11 -3
View File
@@ -16,7 +16,14 @@ export async function run() {
try {
await cachePackages();
} catch (error) {
core.setFailed(error.message);
let message = 'Unknown error!';
if (error instanceof Error) {
message = error.message;
}
if (typeof error === 'string') {
message = error;
}
core.setFailed(message);
}
}
@@ -40,7 +47,8 @@ const cachePackages = async () => {
);
if (nonExistingPaths.length === cachePaths.length) {
throw new Error(`There are no cache folders on the disk`);
core.warning('There are no cache folders on the disk');
return;
}
if (nonExistingPaths.length) {
@@ -65,7 +73,7 @@ const cachePackages = async () => {
core.info(`Cache saved with the key: ${primaryKey}`);
};
export function logWarning(message: string): void {
function logWarning(message: string): void {
const warningPrefix = '[warning]';
core.info(`${warningPrefix}${message}`);
}
+119 -13
View File
@@ -6,6 +6,7 @@ import * as httpm from '@actions/http-client';
import * as sys from './system';
import fs from 'fs';
import os from 'os';
import {StableReleaseAlias} from './utils';
type InstallationType = 'dist' | 'manifest';
@@ -35,15 +36,43 @@ export async function getGo(
auth: string | undefined,
arch = os.arch()
) {
let manifest: tc.IToolRelease[] | undefined;
let osPlat: string = os.platform();
if (
versionSpec === StableReleaseAlias.Stable ||
versionSpec === StableReleaseAlias.OldStable
) {
manifest = await getManifest(auth);
let stableVersion = await resolveStableVersionInput(
versionSpec,
arch,
osPlat,
manifest
);
if (!stableVersion) {
stableVersion = await resolveStableVersionDist(versionSpec, arch);
if (!stableVersion) {
throw new Error(
`Unable to find Go version '${versionSpec}' for platform ${osPlat} and architecture ${arch}.`
);
}
}
core.info(`${versionSpec} version resolved as ${stableVersion}`);
versionSpec = stableVersion;
}
if (checkLatest) {
core.info('Attempting to resolve the latest version from the manifest...');
const resolvedVersion = await resolveVersionFromManifest(
versionSpec,
true,
auth,
arch
arch,
manifest
);
if (resolvedVersion) {
versionSpec = resolvedVersion;
@@ -69,7 +98,7 @@ export async function getGo(
// Try download from internal distribution (popular versions only)
//
try {
info = await getInfoFromManifest(versionSpec, true, auth, arch);
info = await getInfoFromManifest(versionSpec, true, auth, arch, manifest);
if (info) {
downloadPath = await installGoVersion(info, auth, arch);
} else {
@@ -118,10 +147,17 @@ async function resolveVersionFromManifest(
versionSpec: string,
stable: boolean,
auth: string | undefined,
arch: string
arch: string,
manifest: tc.IToolRelease[] | undefined
): Promise<string | undefined> {
try {
const info = await getInfoFromManifest(versionSpec, stable, auth, arch);
const info = await getInfoFromManifest(
versionSpec,
stable,
auth,
arch,
manifest
);
return info?.resolvedVersion;
} catch (err) {
core.info('Unable to resolve a version from the manifest...');
@@ -174,21 +210,26 @@ export async function extractGoArchive(archivePath: string): Promise<string> {
return extPath;
}
export async function getManifest(auth: string | undefined) {
return tc.getManifestFromRepo('actions', 'go-versions', auth, 'main');
}
export async function getInfoFromManifest(
versionSpec: string,
stable: boolean,
auth: string | undefined,
arch = os.arch()
arch = os.arch(),
manifest?: tc.IToolRelease[] | undefined
): Promise<IGoVersionInfo | null> {
let info: IGoVersionInfo | null = null;
const releases = await tc.getManifestFromRepo(
'actions',
'go-versions',
auth,
'main'
);
if (!manifest) {
core.debug('No manifest cached');
manifest = await getManifest(auth);
}
core.info(`matching ${versionSpec}...`);
const rel = await tc.findFromManifest(versionSpec, stable, releases, arch);
const rel = await tc.findFromManifest(versionSpec, stable, manifest, arch);
if (rel && rel.files.length > 0) {
info = <IGoVersionInfo>{};
@@ -316,10 +357,75 @@ export function makeSemver(version: string): string {
export function parseGoVersionFile(versionFilePath: string): string {
const contents = fs.readFileSync(versionFilePath).toString();
if (path.basename(versionFilePath) === 'go.mod') {
if (
path.basename(versionFilePath) === 'go.mod' ||
path.basename(versionFilePath) === 'go.work'
) {
const match = contents.match(/^go (\d+(\.\d+)*)/m);
return match ? match[1] : '';
}
return contents.trim();
}
async function resolveStableVersionDist(versionSpec: string, arch: string) {
let archFilter = sys.getArch(arch);
let platFilter = sys.getPlatform();
const dlUrl: string = 'https://golang.org/dl/?mode=json&include=all';
let candidates: IGoVersion[] | null = await module.exports.getVersionsDist(
dlUrl
);
if (!candidates) {
throw new Error(`golang download url did not return results`);
}
const fixedCandidates = candidates.map(item => {
return {
...item,
version: makeSemver(item.version)
};
});
const stableVersion = await resolveStableVersionInput(
versionSpec,
archFilter,
platFilter,
fixedCandidates
);
return stableVersion;
}
export async function resolveStableVersionInput(
versionSpec: string,
arch: string,
platform: string,
manifest: tc.IToolRelease[] | IGoVersion[]
) {
const releases = manifest
.map(item => {
const index = item.files.findIndex(
item => item.arch === arch && item.filename.includes(platform)
);
if (index === -1) {
return '';
}
return item.version;
})
.filter(item => !!item && !semver.prerelease(item));
if (versionSpec === StableReleaseAlias.Stable) {
return releases[0];
} else {
const versions = releases.map(
release => `${semver.major(release)}.${semver.minor(release)}`
);
const uniqueVersions = Array.from(new Set(versions));
const oldstableVersion = releases.find(item =>
item.startsWith(uniqueVersions[1])
);
return oldstableVersion;
}
}
+7 -4
View File
@@ -4,7 +4,7 @@ import * as installer from './installer';
import * as semver from 'semver';
import path from 'path';
import {restoreCache} from './cache-restore';
import {isGhes, isCacheFeatureAvailable} from './cache-utils';
import {isCacheFeatureAvailable} from './cache-utils';
import cp from 'child_process';
import fs from 'fs';
import os from 'os';
@@ -28,9 +28,10 @@ export async function run() {
if (versionSpec) {
let token = core.getInput('token');
let auth = !token || isGhes() ? undefined : `token ${token}`;
let auth = !token ? undefined : `token ${token}`;
const checkLatest = core.getBooleanInput('check-latest');
const installDir = await installer.getGo(
versionSpec,
checkLatest,
@@ -38,10 +39,12 @@ export async function run() {
arch
);
const installDirVersion = path.basename(path.dirname(installDir));
core.addPath(path.join(installDir, 'bin'));
core.info('Added go to the path');
const version = installer.makeSemver(versionSpec);
const version = installer.makeSemver(installDirVersion);
// 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');
@@ -56,7 +59,7 @@ export async function run() {
if (cache && isCacheFeatureAvailable()) {
const packageManager = 'default';
const cacheDependencyPath = core.getInput('cache-dependency-path');
await restoreCache(packageManager, cacheDependencyPath);
await restoreCache(versionSpec, packageManager, cacheDependencyPath);
}
// add problem matchers
+4
View File
@@ -0,0 +1,4 @@
export enum StableReleaseAlias {
Stable = 'stable',
OldStable = 'oldstable'
}