初版,测试从go官网下载和解压go安装包
Some checks failed
Continuous Integration / GitHub Actions Test (push) Failing after 10s

This commit is contained in:
soul-walker 2024-03-12 22:29:51 +08:00
parent 051c5d02b9
commit 7f63364913
11 changed files with 154 additions and 26 deletions

32
.gitea/workflows/ci.yml Normal file
View File

@ -0,0 +1,32 @@
name: Continuous Integration
on:
pull_request:
branches:
- main
push:
branches:
- main
permissions:
contents: read
jobs:
test-action:
name: GitHub Actions Test
runs-on: local-test
steps:
- name: Checkout
id: checkout
uses: http://120.46.212.6:3000/joylink/checkout@v4
- name: Test Local Action
id: test-action
uses: ./
with:
go-version: '1.21.8'
- name: Print Output
id: output
run: echo "${{ steps.test-action.outputs.go-version }}"

View File

@ -37,8 +37,8 @@ describe('action', () => {
// Set the action's inputs as return values from core.getInput() // Set the action's inputs as return values from core.getInput()
getInputMock.mockImplementation(name => { getInputMock.mockImplementation(name => {
switch (name) { switch (name) {
case 'milliseconds': case 'go-version':
return '500' return '1.21.8'
default: default:
return '' return ''
} }

View File

@ -1,6 +1,6 @@
name: 'The name of your action here' name: 'Setup Go environment'
description: 'Provide a description here' description: 'Setup a Go environment and add it to the PATH'
author: 'Your name or organization here' author: 'walker-sheng'
# Add your action's branding here. This will appear on the GitHub Marketplace. # Add your action's branding here. This will appear on the GitHub Marketplace.
branding: branding:
@ -9,15 +9,21 @@ branding:
# Define your inputs here. # Define your inputs here.
inputs: inputs:
milliseconds: go-version:
description: 'Your input description here' description:
'The Go version to download (if necessary) and use. Supports semver spec
and ranges. Be sure to enclose this option in single quotation marks.'
required: true required: true
default: '1000' architecture:
description:
'Target architecture for Go to use. Examples: x86, x64. Will use system
architecture by default.'
# Define your outputs here. # Define your outputs here.
outputs: outputs:
time: go-version:
description: 'Your output description here' description:
'The installed Go version. Useful when given a version range as input.'
runs: runs:
using: node20 using: node20

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="106" height="20" role="img" aria-label="Coverage: 100%"><title>Coverage: 100%</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="106" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="63" height="20" fill="#555"/><rect x="63" width="43" height="20" fill="#4c1"/><rect width="106" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="325" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="530">Coverage</text><text x="325" y="140" transform="scale(.1)" fill="#fff" textLength="530">Coverage</text><text aria-hidden="true" x="835" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="330">100%</text><text x="835" y="140" transform="scale(.1)" fill="#fff" textLength="330">100%</text></g></svg> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="116" height="20" role="img" aria-label="Coverage: 56.81%"><title>Coverage: 56.81%</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="116" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="63" height="20" fill="#555"/><rect x="63" width="53" height="20" fill="#e05d44"/><rect width="116" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="325" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="530">Coverage</text><text x="325" y="140" transform="scale(.1)" fill="#fff" textLength="530">Coverage</text><text aria-hidden="true" x="885" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="430">56.81%</text><text x="885" y="140" transform="scale(.1)" fill="#fff" textLength="430">56.81%</text></g></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
dist/index.js generated vendored

Binary file not shown.

BIN
dist/index.js.map generated vendored

Binary file not shown.

BIN
dist/licenses.txt generated vendored

Binary file not shown.

53
package-lock.json generated
View File

@ -9,7 +9,9 @@
"version": "0.0.0", "version": "0.0.0",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/core": "^1.10.1" "@actions/core": "^1.10.1",
"@actions/http-client": "^2.2.1",
"@actions/tool-cache": "^2.0.1"
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^29.5.12", "@types/jest": "^29.5.12",
@ -51,15 +53,58 @@
"uuid": "^8.3.2" "uuid": "^8.3.2"
} }
}, },
"node_modules/@actions/exec": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz",
"integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==",
"dependencies": {
"@actions/io": "^1.0.1"
}
},
"node_modules/@actions/http-client": { "node_modules/@actions/http-client": {
"version": "2.2.0", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.0.tgz", "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.1.tgz",
"integrity": "sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==", "integrity": "sha512-KhC/cZsq7f8I4LfZSJKgCvEwfkE8o1538VoBeoGzokVLLnbFDEAdFD3UhoMklxo2un9NJVBdANOresx7vTHlHw==",
"dependencies": { "dependencies": {
"tunnel": "^0.0.6", "tunnel": "^0.0.6",
"undici": "^5.25.4" "undici": "^5.25.4"
} }
}, },
"node_modules/@actions/io": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz",
"integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q=="
},
"node_modules/@actions/tool-cache": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@actions/tool-cache/-/tool-cache-2.0.1.tgz",
"integrity": "sha512-iPU+mNwrbA8jodY8eyo/0S/QqCKDajiR8OxWTnSk/SnYg0sj8Hp4QcUEVC1YFpHWXtrfbQrE13Jz4k4HXJQKcA==",
"dependencies": {
"@actions/core": "^1.2.6",
"@actions/exec": "^1.0.0",
"@actions/http-client": "^2.0.1",
"@actions/io": "^1.1.1",
"semver": "^6.1.0",
"uuid": "^3.3.2"
}
},
"node_modules/@actions/tool-cache/node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@actions/tool-cache/node_modules/uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
"bin": {
"uuid": "bin/uuid"
}
},
"node_modules/@ampproject/remapping": { "node_modules/@ampproject/remapping": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",

View File

@ -33,7 +33,8 @@
"package": "npx ncc build src/index.ts -o dist --source-map --license licenses.txt", "package": "npx ncc build src/index.ts -o dist --source-map --license licenses.txt",
"package:watch": "npm run package -- --watch", "package:watch": "npm run package -- --watch",
"test": "npx jest", "test": "npx jest",
"all": "npm run format:write && npm run lint && npm run test && npm run coverage && npm run package" "all": "npm run format:write && npm run lint && npm run coverage && npm run package",
"all-all": "npm run format:write && npm run lint && npm run test && npm run coverage && npm run package"
}, },
"license": "MIT", "license": "MIT",
"jest": { "jest": {
@ -66,7 +67,9 @@
] ]
}, },
"dependencies": { "dependencies": {
"@actions/core": "^1.10.1" "@actions/core": "^1.10.1",
"@actions/http-client": "^2.2.1",
"@actions/tool-cache": "^2.0.1"
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^29.5.12", "@types/jest": "^29.5.12",

31
src/install.ts Normal file
View File

@ -0,0 +1,31 @@
import * as core from '@actions/core'
import * as tc from '@actions/tool-cache'
import os from 'os'
const GoBinBaseUrl = 'https://go.dev/dl/go'
export async function getInstalledGoPath(
version: string,
arch = os.arch()
): Promise<string> {
const goDownloadUrl = `${GoBinBaseUrl}${version}.${os.platform()}-${arch}.tar.gz`
core.info(`Downloading go from ${goDownloadUrl}`)
const downloadPath = await tc.downloadTool(goDownloadUrl)
core.info(`Extracting Go from ${downloadPath}`)
const extPath = await extractGoArchive(downloadPath)
core.info(`Successfully extracted go to ${extPath}`)
return extPath
}
export async function extractGoArchive(archivePath: string): Promise<string> {
const platform = os.platform()
let extPath: string
if (platform === 'win32') {
extPath = await tc.extractZip(archivePath)
} else {
extPath = await tc.extractTar(archivePath)
}
return extPath
}

View File

@ -1,5 +1,6 @@
import * as core from '@actions/core' import * as core from '@actions/core'
import { wait } from './wait' import os from 'os'
import { getInstalledGoPath } from './install'
/** /**
* The main function for the action. * The main function for the action.
@ -7,20 +8,30 @@ import { wait } from './wait'
*/ */
export async function run(): Promise<void> { export async function run(): Promise<void> {
try { try {
const ms: string = core.getInput('milliseconds') const version: string = resolveVersionInput()
// Debug logs are only output if the `ACTIONS_STEP_DEBUG` secret is true // Debug logs are only output if the `ACTIONS_STEP_DEBUG` secret is true
core.debug(`Waiting ${ms} milliseconds ...`) core.debug(`The input go version is: ${version}`)
// Log the current timestamp, wait, then log the new timestamp let arch = core.getInput('architecture')
core.debug(new Date().toTimeString()) if (!arch) {
await wait(parseInt(ms, 10)) arch = os.arch()
core.debug(new Date().toTimeString()) }
await getInstalledGoPath(version, arch)
// Set outputs for other workflow steps to use // Set outputs for other workflow steps to use
core.setOutput('time', new Date().toTimeString()) core.setOutput('go-version', version)
} catch (error) { } catch (error) {
// Fail the workflow run if an error occurs // Fail the workflow run if an error occurs
if (error instanceof Error) core.setFailed(error.message) if (error instanceof Error) core.setFailed(error.message)
} }
} }
function resolveVersionInput(): string {
const version = core.getInput('go-version')
if (version) {
return version
}
throw new Error(`没有指定go版本`)
}