mirror of
https://git.studyfor.work/actions/gitea-tool-cache.git
synced 2026-01-11 16:06:03 +08:00
first commit
This commit is contained in:
commit
6e207856a2
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
node_modules/
|
||||
# dist/
|
||||
*.log
|
||||
cache/
|
||||
coverage/
|
||||
143
README.md
Normal file
143
README.md
Normal file
@ -0,0 +1,143 @@
|
||||
# gitea-tool-cache
|
||||
|
||||
## 注意
|
||||
|
||||
1、需要指定具体版本号
|
||||
|
||||
2、因为我没有 mac,所以没有 mac 环境
|
||||
|
||||
## Usage
|
||||
|
||||
See [action.yml](action.yml)
|
||||
|
||||
<!-- start usage -->
|
||||
|
||||
```yaml
|
||||
- uses: kongxiangyiren/gitea-tool-cache@v1
|
||||
with:
|
||||
# 需要指定具体版本号
|
||||
node-version: 18.18.0
|
||||
go-version: 1.21.1
|
||||
```
|
||||
|
||||
<!-- end usage -->
|
||||
|
||||
**Basic:**
|
||||
|
||||
```yaml
|
||||
jobs:
|
||||
linux:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
# 使用gitea-tool-cache需要指定具体的版本号
|
||||
node: ['18.18.0']
|
||||
go: ['1.21.1']
|
||||
dotnet: ['6.0.100']
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: https://gitea.cn/actions/checkout@v4
|
||||
- id: tool-cache
|
||||
uses: kongxiangyiren/gitea-tool-cache@v1
|
||||
with:
|
||||
# 需要指定具体版本号
|
||||
node-version: ${{ matrix.node }}
|
||||
go-version: ${{ matrix.go }}
|
||||
dotnet-version: ${{ matrix.dotnet }}
|
||||
- uses: https://gitea.cn/actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ matrix.node }}
|
||||
- run: node -v
|
||||
- uses: https://gitea.cn/actions/setup-go@v2
|
||||
with:
|
||||
go-version: ${{ matrix.go }}
|
||||
- run: go version
|
||||
- name: Setup .NET Core
|
||||
uses: https://gitea.cn/actions/setup-dotnet@v1
|
||||
env:
|
||||
# dotnet 安装位置
|
||||
DOTNET_INSTALL_DIR: ${{ steps.tool-cache.outputs.dotnet-path }}
|
||||
with:
|
||||
dotnet-version: ${{ matrix.dotnet }}
|
||||
- run: dotnet --version
|
||||
```
|
||||
|
||||
## 只要安装 node
|
||||
|
||||
```yaml
|
||||
jobs:
|
||||
linux:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
# 使用gitea-tool-cache需要指定具体的版本号
|
||||
node: ['18.18.0']
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: https://gitea.cn/actions/checkout@v4
|
||||
- name: 安装环境
|
||||
uses: kongxiangyiren/gitea-tool-cache@v1
|
||||
with:
|
||||
# 需要指定具体版本号
|
||||
node-version: ${{ matrix.node }}
|
||||
- uses: https://gitea.cn/actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ matrix.node }}
|
||||
- run: node -v
|
||||
```
|
||||
|
||||
## 只要安装 go
|
||||
|
||||
```yaml
|
||||
jobs:
|
||||
linux:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
# 使用gitea-tool-cache需要指定具体的版本号
|
||||
go: ['1.21.1']
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: https://gitea.cn/actions/checkout@v4
|
||||
- name: 安装环境
|
||||
uses: kongxiangyiren/gitea-tool-cache@v1
|
||||
with:
|
||||
# 需要指定具体版本号
|
||||
go-version: ${{ matrix.go }}
|
||||
- uses: https://gitea.cn/actions/setup-go@v2
|
||||
with:
|
||||
go-version: ${{ matrix.go }}
|
||||
- run: go version
|
||||
```
|
||||
|
||||
## 只要安装 dotnet
|
||||
|
||||
```yaml
|
||||
jobs:
|
||||
linux:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
# 使用gitea-tool-cache需要指定具体的版本号
|
||||
dotnet: ['6.0.100']
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: https://gitea.cn/actions/checkout@v4
|
||||
- id: tool-cache
|
||||
uses: kongxiangyiren/gitea-tool-cache@v1
|
||||
with:
|
||||
# 需要指定具体版本号
|
||||
dotnet-version: ${{ matrix.dotnet }}
|
||||
- name: Setup .NET Core
|
||||
uses: https://gitea.cn/actions/setup-dotnet@v1
|
||||
env:
|
||||
# dotnet 安装位置
|
||||
DOTNET_INSTALL_DIR: ${{ steps.tool-cache.outputs.dotnet-path }}
|
||||
with:
|
||||
dotnet-version: ${{ matrix.dotnet }}
|
||||
- run: dotnet --version
|
||||
```
|
||||
82
__tests__/index.test.ts
Normal file
82
__tests__/index.test.ts
Normal file
@ -0,0 +1,82 @@
|
||||
import * as core from '@actions/core';
|
||||
import osm from 'os';
|
||||
import { rmSync } from 'fs';
|
||||
import { dotnetInstall, goInstall, nodeInstall } from '../src/lib';
|
||||
import { join } from 'path';
|
||||
// 超时时间
|
||||
jest.setTimeout(200000);
|
||||
describe('gitea-tool-cache', () => {
|
||||
let inputs = {} as any;
|
||||
let os = {} as any;
|
||||
let inSpy: jest.SpyInstance;
|
||||
let platSpy: jest.SpyInstance;
|
||||
let archSpy: jest.SpyInstance;
|
||||
|
||||
beforeAll(() => {
|
||||
process.env['RUNNER_TOOL_CACHE'] = join(process.cwd(), './cache/toolcache');
|
||||
process.env['RUNNER_TEMP'] = join(process.cwd(), './cache/temp');
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
process.env['RUNNER_TOOL_CACHE'] = join(process.cwd(), './cache/toolcache');
|
||||
process.env['RUNNER_TEMP'] = join(process.cwd(), './cache/temp');
|
||||
// @actions/core
|
||||
inputs = {};
|
||||
inSpy = jest.spyOn(core, 'getInput');
|
||||
inSpy.mockImplementation(name => inputs[name]);
|
||||
|
||||
os = {};
|
||||
platSpy = jest.spyOn(osm, 'platform');
|
||||
platSpy.mockImplementation(() => os['platform']);
|
||||
archSpy = jest.spyOn(osm, 'arch');
|
||||
archSpy.mockImplementation(() => os['arch']);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
//jest.resetAllMocks();
|
||||
jest.clearAllMocks();
|
||||
//jest.restoreAllMocks();
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
jest.restoreAllMocks();
|
||||
}, 200000);
|
||||
|
||||
// 测试时需要把别的注释掉
|
||||
it('installs windows', async () => {
|
||||
rmSync('./cache', { recursive: true, force: true });
|
||||
os['platform'] = 'win32';
|
||||
os['arch'] = 'x64';
|
||||
// node
|
||||
// inputs['node-version'] = '18.18.0';
|
||||
// await nodeInstall();
|
||||
// // go
|
||||
// inputs['go-version'] = '1.21.1';
|
||||
// await goInstall();
|
||||
// dotnet
|
||||
inputs['dotnet-version'] = '6.0.100';
|
||||
await dotnetInstall();
|
||||
});
|
||||
|
||||
// it('installs linux', async () => {
|
||||
// os['platform'] = 'linux';
|
||||
// os['arch'] = 'x64';
|
||||
// inputs['node-version'] = '18.18.0';
|
||||
// await nodeInstall();
|
||||
// inputs['go-version'] = '1.21.1';
|
||||
// await goInstall();
|
||||
// inputs['dotnet-version'] = '5.0.401';
|
||||
// await dotnetInstall();
|
||||
// });
|
||||
|
||||
// it('installs darwin', async () => {
|
||||
// os['platform'] = 'darwin';
|
||||
// os['arch'] = 'x64';
|
||||
// inputs['node-version'] = '18.18.0';
|
||||
// await nodeInstall();
|
||||
// inputs['go-version'] = '1.21.1';
|
||||
// await goInstall();
|
||||
// inputs['dotnet-version'] = '5.0.401';
|
||||
// await dotnetInstall();
|
||||
// });
|
||||
});
|
||||
19
action.yml
Normal file
19
action.yml
Normal file
@ -0,0 +1,19 @@
|
||||
name: 'Gitea Tool Cache'
|
||||
description: 'A Gitea Action Tool Cache Image Download'
|
||||
author: 'kongxiangyiren'
|
||||
inputs:
|
||||
node-version:
|
||||
description: 'The node version to use'
|
||||
required: false
|
||||
go-version:
|
||||
description: 'The go version to use'
|
||||
required: false
|
||||
dotnet-version:
|
||||
description: 'The dotnet version to use'
|
||||
required: false
|
||||
outputs:
|
||||
dotnet-path:
|
||||
description: 'The path to the dotnet executable'
|
||||
runs:
|
||||
using: 'node16'
|
||||
main: 'dist/index.js'
|
||||
38580
dist/index.js
vendored
Normal file
38580
dist/index.js
vendored
Normal file
File diff suppressed because one or more lines are too long
13
jest.config.cjs
Normal file
13
jest.config.cjs
Normal file
@ -0,0 +1,13 @@
|
||||
/** @type {import("jest").Config} */
|
||||
module.exports = {
|
||||
clearMocks: true,
|
||||
moduleFileExtensions: ['js', 'ts'],
|
||||
testEnvironment: 'node',
|
||||
testMatch: ['**/*.test.ts'],
|
||||
testRunner: 'jest-circus/runner',
|
||||
transform: {
|
||||
'^.+\\.ts$': 'ts-jest'
|
||||
},
|
||||
verbose: true,
|
||||
// type": "module",
|
||||
}
|
||||
25
package.json
Normal file
25
package.json
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
"name": "gitea-tool-cache",
|
||||
"version": "1.0.0",
|
||||
"main": "dist/index.js",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"test": "chcp 65001 && jest --coverage",
|
||||
"build": "rimraf ./dist && ncc build -o dist src/index.ts"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tsconfig/node16": "^16.1.1",
|
||||
"@types/jest": "^29.5.12",
|
||||
"@types/node": "^16",
|
||||
"@vercel/ncc": "^0.38.1",
|
||||
"jest": "^29.7.0",
|
||||
"jest-circus": "^29.7.0",
|
||||
"rimraf": "^5.0.5",
|
||||
"ts-jest": "^29.1.2",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"@actions/tool-cache": "^2.0.1",
|
||||
"axios": "^1.6.7"
|
||||
}
|
||||
}
|
||||
9
src/index.ts
Normal file
9
src/index.ts
Normal file
@ -0,0 +1,9 @@
|
||||
import { nodeInstall, goInstall, dotnetInstall } from './lib';
|
||||
|
||||
function run() {
|
||||
// 不加await会并行执行,加快速度
|
||||
nodeInstall();
|
||||
goInstall();
|
||||
dotnetInstall();
|
||||
}
|
||||
run();
|
||||
80
src/lib/dotnet.ts
Normal file
80
src/lib/dotnet.ts
Normal file
@ -0,0 +1,80 @@
|
||||
import { join } from 'path';
|
||||
import { downloadTool, extractZip, extractTar, extractXar, cacheDir } from '@actions/tool-cache';
|
||||
import { addPath, getInput, setOutput } from '@actions/core';
|
||||
import { arch, platform as Platform } from 'os';
|
||||
import { existsSync, renameSync } from 'fs';
|
||||
import { get } from 'axios';
|
||||
|
||||
// 安装dotnet
|
||||
export async function dotnetInstall() {
|
||||
const platform = Platform();
|
||||
const dotnetVersion = getInput('dotnet-version');
|
||||
if (!dotnetVersion) {
|
||||
console.log('没有dotnet-version,跳过dotnet安装');
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
process.env['RUNNER_TOOL_CACHE'] &&
|
||||
existsSync(join(process.env['RUNNER_TOOL_CACHE'], 'dotnet', dotnetVersion, arch()))
|
||||
) {
|
||||
console.log('dotnet已经安装过了');
|
||||
return setOutput(
|
||||
'dotnet-path',
|
||||
join(process.env['RUNNER_TOOL_CACHE'], 'dotnet', dotnetVersion, arch())
|
||||
);
|
||||
}
|
||||
const versionList = dotnetVersion.split('.');
|
||||
const channelVersion = `${versionList[0]}.${versionList[1]}`;
|
||||
const releasesUrl = `https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/${channelVersion}/releases.json`;
|
||||
const releases = await get(releasesUrl).catch(err => {
|
||||
console.log(err);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (!releases || !releases.data) {
|
||||
console.log('获取dotnet版本失败');
|
||||
return false;
|
||||
}
|
||||
const releasesList = (releases.data as Record<string, any>).releases;
|
||||
const release = releasesList.find(
|
||||
(item: Record<string, any>) => item.sdk.version === dotnetVersion
|
||||
);
|
||||
if (!release) {
|
||||
console.log('没有找到dotnet版本');
|
||||
return false;
|
||||
}
|
||||
|
||||
const list = release.sdk.files.find((item: Record<string, any>) => {
|
||||
if (platform === 'win32') {
|
||||
return item.rid === 'win-' + arch() && item.url.endsWith('.zip');
|
||||
} else if (platform === 'darwin') {
|
||||
return item.rid === 'osx-' + arch() && item.url.endsWith('.pkg');
|
||||
} else {
|
||||
return item.rid === 'linux-' + arch() && item.url.endsWith('.tar.gz');
|
||||
}
|
||||
});
|
||||
if (!list) {
|
||||
console.log('没有找到dotnet版本');
|
||||
return false;
|
||||
}
|
||||
// console.log(list);
|
||||
|
||||
console.log(list.url);
|
||||
|
||||
const dotnetPath = await downloadTool(list.url);
|
||||
if (platform === 'win32') {
|
||||
renameSync(dotnetPath, dotnetPath + '.zip');
|
||||
const dotnetExtractedFolder = await extractZip(dotnetPath + '.zip', './cache/dotnet');
|
||||
const cachedPath = await cacheDir(dotnetExtractedFolder, 'dotnet', dotnetVersion);
|
||||
addPath(cachedPath);
|
||||
setOutput('dotnet-path', cachedPath);
|
||||
} else if (platform === 'darwin') {
|
||||
console.log('没有mac,暂未测试');
|
||||
} else {
|
||||
const dotnetExtractedFolder = await extractTar(dotnetPath, './cache/dotnet');
|
||||
const cachedPath = await cacheDir(dotnetExtractedFolder, 'dotnet', dotnetVersion);
|
||||
addPath(cachedPath);
|
||||
setOutput('dotnet-path', cachedPath);
|
||||
}
|
||||
}
|
||||
47
src/lib/go.ts
Normal file
47
src/lib/go.ts
Normal file
@ -0,0 +1,47 @@
|
||||
import { join } from 'path';
|
||||
import { downloadTool, extractZip, extractTar, extractXar, cacheDir } from '@actions/tool-cache';
|
||||
import { addPath, getInput } from '@actions/core';
|
||||
import { arch, platform as Platform } from 'os';
|
||||
import { existsSync, renameSync } from 'fs';
|
||||
|
||||
// 安装golang
|
||||
export async function goInstall() {
|
||||
const platform = Platform();
|
||||
const goVersion = getInput('go-version');
|
||||
if (!goVersion) {
|
||||
console.log('没有go-version,跳过go安装');
|
||||
return;
|
||||
}
|
||||
if (
|
||||
process.env['RUNNER_TOOL_CACHE'] &&
|
||||
existsSync(join(process.env['RUNNER_TOOL_CACHE'], 'go', goVersion, arch()))
|
||||
) {
|
||||
console.log('go已经安装过了');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (platform === 'win32') {
|
||||
console.log(`https://golang.google.cn/dl/go${goVersion}.windows-amd64.zip`);
|
||||
|
||||
const goPath = await downloadTool(
|
||||
`https://golang.google.cn/dl/go${goVersion}.windows-amd64.zip`
|
||||
);
|
||||
renameSync(goPath, goPath + '.zip');
|
||||
const goExtractedFolder = await extractZip(goPath + '.zip', './cache/go');
|
||||
const cachedPath = await cacheDir(join(goExtractedFolder, 'go'), 'go', goVersion);
|
||||
addPath(cachedPath);
|
||||
} else if (platform === 'darwin') {
|
||||
console.log('没有mac,暂未测试');
|
||||
} else {
|
||||
console.log(`https://golang.google.cn/dl/go${goVersion}.linux-amd64.tar.gz`);
|
||||
|
||||
const goPath = await downloadTool(
|
||||
`https://golang.google.cn/dl/go${goVersion}.linux-amd64.tar.gz`
|
||||
);
|
||||
const goExtractedFolder = await extractTar(goPath, './cache/go');
|
||||
|
||||
const cachedPath = await cacheDir(join(goExtractedFolder, 'go'), 'go', goVersion);
|
||||
addPath(cachedPath);
|
||||
}
|
||||
}
|
||||
3
src/lib/index.ts
Normal file
3
src/lib/index.ts
Normal file
@ -0,0 +1,3 @@
|
||||
export * from './node';
|
||||
export * from './go';
|
||||
export * from './dotnet';
|
||||
68
src/lib/node.ts
Normal file
68
src/lib/node.ts
Normal file
@ -0,0 +1,68 @@
|
||||
import { join } from 'path';
|
||||
import { downloadTool, extractZip, extractTar, extractXar, cacheDir } from '@actions/tool-cache';
|
||||
import { addPath, getInput } from '@actions/core';
|
||||
import { arch, platform as Platform } from 'os';
|
||||
import { existsSync, renameSync } from 'fs';
|
||||
|
||||
// 安装node
|
||||
export async function nodeInstall() {
|
||||
const platform = Platform();
|
||||
const nodeVersion = getInput('node-version');
|
||||
if (!nodeVersion) {
|
||||
console.log('没有node-version,跳过node安装');
|
||||
return;
|
||||
}
|
||||
const version = nodeVersion;
|
||||
|
||||
if (
|
||||
process.env['RUNNER_TOOL_CACHE'] &&
|
||||
existsSync(join(process.env['RUNNER_TOOL_CACHE'], 'node', version, arch()))
|
||||
) {
|
||||
console.log('node已经安装过了');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (platform === 'win32') {
|
||||
console.log(
|
||||
`https://registry.npmmirror.com/-/binary/node/v${version}/node-v${version}-win-${arch()}.zip`
|
||||
);
|
||||
|
||||
const nodePath = await downloadTool(
|
||||
`https://registry.npmmirror.com/-/binary/node/v${version}/node-v${version}-win-${arch()}.zip`
|
||||
);
|
||||
|
||||
renameSync(nodePath, nodePath + '.zip');
|
||||
|
||||
const nodeExtractedFolder = await extractZip(nodePath + '.zip', './cache/node');
|
||||
const cachedPath = await cacheDir(
|
||||
join(nodeExtractedFolder, `node-v${version}-win-${arch()}`),
|
||||
'node',
|
||||
version
|
||||
);
|
||||
addPath(cachedPath);
|
||||
} else if (platform === 'darwin') {
|
||||
console.log('没有mac,暂未测试');
|
||||
|
||||
// const nodePath = await downloadTool(
|
||||
// `https://registry.npmmirror.com/-/binary/node/v${version}/node-v${version}.pkg`
|
||||
// );
|
||||
// const nodeExtractedFolder = await extractXar(nodePath, './cache/node');
|
||||
} else {
|
||||
console.log(
|
||||
`https://registry.npmmirror.com/-/binary/node/v${version}/node-v${version}-linux-${arch()}.tar.gz`
|
||||
);
|
||||
|
||||
const nodePath = await downloadTool(
|
||||
`https://registry.npmmirror.com/-/binary/node/v${version}/node-v${version}-linux-${arch()}.tar.gz`
|
||||
);
|
||||
const nodeExtractedFolder = await extractTar(nodePath, './cache/node');
|
||||
|
||||
const cachedPath = await cacheDir(
|
||||
join(nodeExtractedFolder, `node-v${version}-linux-${arch()}`),
|
||||
'node',
|
||||
version
|
||||
);
|
||||
addPath(cachedPath);
|
||||
}
|
||||
}
|
||||
10
tsconfig.json
Normal file
10
tsconfig.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"extends": "@tsconfig/node16",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist",
|
||||
"types": ["node", "jest"],
|
||||
"module": "node16",
|
||||
"moduleResolution": "node16"
|
||||
},
|
||||
"include": ["src/**/*.ts", "**/*.test.ts"]
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user