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