From e6a8865f72a794d3193320e15033ac2d7536f6de Mon Sep 17 00:00:00 2001 From: xHyroM Date: Thu, 28 Jul 2022 07:50:56 +0200 Subject: [PATCH] feat: custom download url, custom repository --- .github/workflows/test.yml | 54 +++++++++++++++++++++++++++++----- README.md | 18 ++++++++++++ action.yml | 11 ++++++- dist/index.js | 6 ++-- dist/utils/getAsset.js | 6 +++- dist/utils/getGithubRelease.js | 23 +++++++++++++-- src/index.ts | 6 ++-- src/utils/getAsset.ts | 9 ++++-- src/utils/getGithubRelease.ts | 23 +++++++++++++-- 9 files changed, 135 insertions(+), 21 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 231f6db..710eb23 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,8 +15,6 @@ jobs: os: [ubuntu-latest, macos-latest] bun-version: ["latest", "0.1.4"] - misc-test-builds: - [false] steps: - uses: actions/checkout@v2 @@ -26,20 +24,17 @@ jobs: with: bun-version: ${{ matrix.bun-version }} github-token: ${{ secrets.GITHUB_TOKEN }} - misc-test-builds: ${{ matrix.misc-test-builds }} - name: Try bun run: | bun --version - test-canary: + test-version-canary: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest] bun-version: ["canary"] - misc-test-builds: - [false] steps: - uses: actions/checkout@v2 @@ -49,8 +44,53 @@ jobs: with: bun-version: ${{ matrix.bun-version }} github-token: ${{ secrets.GITHUB_TOKEN }} - misc-test-builds: ${{ matrix.misc-test-builds }} - name: Try bun run: | bun --version + test-custom-download-url: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest] + bun-version: + ["latest"] + custom-download-url: + ["https://github.com/oven-sh/bun/suites/7555351912/artifacts/311939881"] + + steps: + - uses: actions/checkout@v2 + + - name: Setup Bun - Test Builds * ${{ matrix.misc-test-builds }} + uses: ./ + with: + bun-version: ${{ matrix.bun-version }} + github-token: ${{ secrets.GITHUB_TOKEN }} + custom-download-url: ${{ matrix.custom-download-url }} + + - name: Try bun + run: | + bun --version + test-custom-repository: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest] + bun-version: + ["latest"] + repository: + ["https://github.com/oven-sh/misc-test-builds"] + + steps: + - uses: actions/checkout@v2 + + - name: Setup Bun - Test Builds * ${{ matrix.misc-test-builds }} + uses: ./ + with: + bun-version: ${{ matrix.bun-version }} + github-token: ${{ secrets.GITHUB_TOKEN }} + repository: ${{ matrix.repository }} + + - name: Try bun + run: | + bun --version \ No newline at end of file diff --git a/README.md b/README.md index 7d33582..9d38fa4 100644 --- a/README.md +++ b/README.md @@ -31,3 +31,21 @@ Set up your GitHub Actions workflow with a specific version of Bun. bun-version: canary github-token: ${{ secrets.GITHUB_TOKEN }} ``` + +### Custom repository + +```yaml +- uses: xhyrom/setup-bun@v0.1.6 + with: + repository: https://github.com/oven-sh/misc-test-builds + github-token: ${{ secrets.GITHUB_TOKEN }} +``` + +### Custom download url + +```yaml +- uses: xhyrom/setup-bun@v0.1.6 + with: + custom-download-url: https://github.com/oven-sh/bun/suites/7555351912/artifacts/311939881 + github-token: ${{ secrets.GITHUB_TOKEN }} +``` \ No newline at end of file diff --git a/action.yml b/action.yml index 610fa88..a9122f7 100644 --- a/action.yml +++ b/action.yml @@ -10,11 +10,20 @@ inputs: bun-version: description: "The Bun version to install." default: "latest" + required: false github-token: description: "The github token secret can be passed in using {{ secrets.GITHUB_TOKEN }}" default: ${{ github.token }} + required: false misc-test-builds: - description: "Install builds from https://github.com/oven-sh/misc-test-builds (not recommended!)" + description: "Deprecated, use repository input instead. Install builds from https://github.com/oven-sh/misc-test-builds (not recommended!)" + required: false + repository: + description: "Repository from which the bun is downloaded. Defaults to https://github.com/oven-sh/bun" + default: "https://github.com/oven-sh/bun" + required: false + custom-download-url: + description: "Full url to download bun, for example if you want to download an artifact." required: false outputs: diff --git a/dist/index.js b/dist/index.js index 0754a23..5d1ead8 100644 --- a/dist/index.js +++ b/dist/index.js @@ -14,10 +14,12 @@ const main = async () => { try { const version = getInput('bun-version'); const token = getInput('github-token'); - const miscTestBuilds = (getInput('misc-test-builds') === 'true'); + const repository = getInput('repository'); + const miscTestBuilds = (getInput('misc-test-builds') === 'true') || (repository.includes('oven-sh/misc-test-builds')); + const customDownloadUrl = getInput('custom-download-url') || null; if (!version) return exit('Invalid bun version.'); - const release = await getGithubRelease(version, token, miscTestBuilds); + const release = await getGithubRelease(version, token, repository, customDownloadUrl, miscTestBuilds); if ((release === null || release === void 0 ? void 0 : release.message) === 'Not Found') return exit('Invalid bun version.', miscTestBuilds); info(`Going to install release ${release.version}`); diff --git a/dist/utils/getAsset.js b/dist/utils/getAsset.js index cf201f6..a73aed0 100644 --- a/dist/utils/getAsset.js +++ b/dist/utils/getAsset.js @@ -1,5 +1,5 @@ import { exit } from '../index.js'; -export default (assets) => { +export const getArchitecture = () => { let arch; switch (process.arch) { case 'arm64': @@ -13,6 +13,10 @@ export default (assets) => { } if (!['linux', 'darwin'].some(platform => process.platform === platform)) throw new Error(`Unsupported platform ${process.platform}.`); + return arch; +}; +export default (assets) => { + const arch = getArchitecture(); const assetName = `bun-${process.platform}-${arch}.zip`; const asset = assets.find(asset => asset.name === assetName); if (!asset) diff --git a/dist/utils/getGithubRelease.js b/dist/utils/getGithubRelease.js index 25d54b3..7e2c607 100644 --- a/dist/utils/getGithubRelease.js +++ b/dist/utils/getGithubRelease.js @@ -1,11 +1,28 @@ import fetch from 'node-fetch'; -export default async (version, token, miscTestBuilds) => { - const repository = miscTestBuilds ? 'oven-sh/misc-test-builds' : 'oven-sh/bun'; +import { getArchitecture } from './getAsset'; +export default async (version, token, fullRepository, customDownloadUrl, miscTestBuilds) => { + const repository = miscTestBuilds ? 'oven-sh/misc-test-builds' : fullRepository.split('/').slice(3).join('/'); let url; - if (version === 'latest' || miscTestBuilds) + if (customDownloadUrl) + url = customDownloadUrl; + else if (version === 'latest' || miscTestBuilds) url = `https://api.github.com/repos/${repository}/releases/latest`; else url = `https://api.github.com/repos/${repository}/releases/tags/${version.includes('canary') ? version : `bun-v${version}`}`; + if (customDownloadUrl) { + return { + name: 'custom', + version: version + Math.random().toString(36).slice(-8), + html_url: customDownloadUrl, + tag_name: 'custom', + assets: [ + { + name: `bun-${process.platform}-${getArchitecture()}`, + browser_download_url: customDownloadUrl + } + ] + }; + } const release = await (await fetch(url, { headers: { 'Content-Type': 'application/json', diff --git a/src/index.ts b/src/index.ts index 1fbc1ef..f0c1940 100644 --- a/src/index.ts +++ b/src/index.ts @@ -15,11 +15,13 @@ const main = async() => { try { const version = getInput('bun-version'); const token = getInput('github-token'); - const miscTestBuilds = (getInput('misc-test-builds') === 'true'); + const repository = getInput('repository'); + const miscTestBuilds = (getInput('misc-test-builds') === 'true') || (repository.includes('oven-sh/misc-test-builds')); + const customDownloadUrl = getInput('custom-download-url') || null; if (!version) return exit('Invalid bun version.'); - const release = await getGithubRelease(version, token, miscTestBuilds); + const release = await getGithubRelease(version, token, repository, customDownloadUrl, miscTestBuilds); if (release?.message === 'Not Found') return exit('Invalid bun version.', miscTestBuilds); info(`Going to install release ${release.version}`); diff --git a/src/utils/getAsset.ts b/src/utils/getAsset.ts index a158daa..5777b04 100644 --- a/src/utils/getAsset.ts +++ b/src/utils/getAsset.ts @@ -1,7 +1,7 @@ import { exit } from '../index.js'; import { Asset } from './getGithubRelease.js'; -export default (assets: Asset[]) => { +export const getArchitecture = () => { let arch; switch (process.arch) { case 'arm64': @@ -15,8 +15,13 @@ export default (assets: Asset[]) => { } if (!['linux', 'darwin'].some(platform => process.platform === platform)) - throw new Error(`Unsupported platform ${process.platform}.`); + throw new Error(`Unsupported platform ${process.platform}.`); + return arch; +} + +export default (assets: Asset[]) => { + const arch = getArchitecture(); const assetName = `bun-${process.platform}-${arch}.zip`; const asset = assets.find(asset => asset.name === assetName); diff --git a/src/utils/getGithubRelease.ts b/src/utils/getGithubRelease.ts index 0db0658..43a2e5c 100644 --- a/src/utils/getGithubRelease.ts +++ b/src/utils/getGithubRelease.ts @@ -1,4 +1,5 @@ import fetch from 'node-fetch'; +import { getArchitecture } from './getAsset'; export interface Asset { name: string; @@ -14,12 +15,28 @@ export interface Release { version: string; } -export default async(version: string, token: string, miscTestBuilds: boolean): Promise => { - const repository = miscTestBuilds ? 'oven-sh/misc-test-builds' : 'oven-sh/bun' +export default async(version: string, token: string, fullRepository: string, customDownloadUrl: string | null, miscTestBuilds: boolean): Promise => { + const repository = miscTestBuilds ? 'oven-sh/misc-test-builds' : fullRepository.split('/').slice(3).join('/'); + let url; - if (version === 'latest' || miscTestBuilds) url = `https://api.github.com/repos/${repository}/releases/latest`; + if (customDownloadUrl) url = customDownloadUrl; + else if (version === 'latest' || miscTestBuilds) url = `https://api.github.com/repos/${repository}/releases/latest`; else url = `https://api.github.com/repos/${repository}/releases/tags/${version.includes('canary') ? version : `bun-v${version}`}`; + if (customDownloadUrl) { + return { + name: 'custom', + version: version + Math.random().toString(36).slice(-8), + html_url: customDownloadUrl, + tag_name: 'custom', + assets: [ + { + name: `bun-${process.platform}-${getArchitecture()}`, + browser_download_url: customDownloadUrl + } + ] + }; + } const release: any = await (await fetch(url, { headers: { 'Content-Type': 'application/json',