diff options
-rw-r--r-- | .github/workflows/bun-release-canary.yml | 29 | ||||
-rw-r--r-- | .github/workflows/bun-release.yml | 38 | ||||
-rwxr-xr-x | packages/bun-release/bun.lockb | bin | 35027 -> 35327 bytes | |||
-rw-r--r-- | packages/bun-release/package.json | 4 | ||||
-rw-r--r-- | packages/bun-release/scripts/upload-s3.ts | 101 |
5 files changed, 171 insertions, 1 deletions
diff --git a/.github/workflows/bun-release-canary.yml b/.github/workflows/bun-release-canary.yml index 2acd920a9..5a07b03d4 100644 --- a/.github/workflows/bun-release-canary.yml +++ b/.github/workflows/bun-release-canary.yml @@ -39,6 +39,7 @@ jobs: npm: name: Release to NPM runs-on: ubuntu-latest + needs: sign defaults: run: working-directory: packages/bun-release @@ -144,3 +145,31 @@ jobs: labels: ${{ steps.metadata.outputs.labels }} build-args: | BUN_VERSION=canary + s3: + name: Upload to S3 + runs-on: ubuntu-latest + needs: sign + defaults: + run: + working-directory: packages/bun-release + steps: + - id: checkout + name: Checkout + uses: actions/checkout@v3 + - id: setup-bun + name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: canary + - id: bun-install + name: Install Dependencies + run: bun install + - id: bun-run + name: Release + run: bun upload-s3 -- canary + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + AWS_KEY_ID: ${{ secrets.AWS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY}} + AWS_BUCKET: ${{ secrets.AWS_BUCKET }} + AWS_ENDPOINT: ${{ secrets.AWS_ENDPOINT }} diff --git a/.github/workflows/bun-release.yml b/.github/workflows/bun-release.yml index c57b1aeba..ba30d8ecc 100644 --- a/.github/workflows/bun-release.yml +++ b/.github/workflows/bun-release.yml @@ -52,6 +52,7 @@ jobs: npm: name: Release to NPM runs-on: ubuntu-latest + needs: sign defaults: run: working-directory: packages/bun-release @@ -83,6 +84,7 @@ jobs: npm-types: name: Release types to NPM runs-on: ubuntu-latest + needs: sign defaults: run: working-directory: packages/bun-types @@ -174,6 +176,7 @@ jobs: homebrew: name: Release to Homebrew runs-on: ubuntu-latest + needs: sign steps: - id: checkout name: Checkout @@ -211,3 +214,38 @@ jobs: commit_user_name: robobun commit_user_email: robobun@oven.sh commit_author: robobun <robobun@oven.sh> + s3: + name: Upload to S3 + runs-on: ubuntu-latest + needs: sign + defaults: + run: + working-directory: packages/bun-release + steps: + - id: checkout + name: Checkout + uses: actions/checkout@v3 + - id: setup-env + name: Setup Environment + run: | + TAG="${{ github.event.inputs.tag }}" + TAG="${TAG:-"${{ github.event.release.tag_name }}"}" + echo "Setup tag: ${TAG}" + echo "TAG=${TAG}" >> ${GITHUB_ENV} + - id: setup-bun + name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: canary + - id: bun-install + name: Install Dependencies + run: bun install + - id: bun-run + name: Release + run: bun upload-s3 -- "${{ env.TAG }}" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + AWS_KEY_ID: ${{ secrets.AWS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY}} + AWS_BUCKET: ${{ secrets.AWS_BUCKET }} + AWS_ENDPOINT: ${{ secrets.AWS_ENDPOINT }} diff --git a/packages/bun-release/bun.lockb b/packages/bun-release/bun.lockb Binary files differindex a2d8b1353..ef251aca9 100755 --- a/packages/bun-release/bun.lockb +++ b/packages/bun-release/bun.lockb diff --git a/packages/bun-release/package.json b/packages/bun-release/package.json index 759c35ede..ccbf51aa1 100644 --- a/packages/bun-release/package.json +++ b/packages/bun-release/package.json @@ -1,6 +1,7 @@ { "private": true, "dependencies": { + "aws4fetch": "^1.0.17", "esbuild": "^0.17.3", "jszip": "^3.10.1", "octokit": "^2.0.14" @@ -14,6 +15,7 @@ "format": "prettier --write src scripts", "get-version": "bun scripts/get-version.ts", "upload-npm": "bun scripts/upload-npm.ts", - "upload-assets": "bun scripts/upload-assets.ts" + "upload-assets": "bun scripts/upload-assets.ts", + "upload-s3": "bun scripts/upload-s3.ts" } } diff --git a/packages/bun-release/scripts/upload-s3.ts b/packages/bun-release/scripts/upload-s3.ts new file mode 100644 index 000000000..d163f7f96 --- /dev/null +++ b/packages/bun-release/scripts/upload-s3.ts @@ -0,0 +1,101 @@ +import { AwsClient } from "aws4fetch"; +import { getBuild, getRelease, getSemver } from "../src/github"; + +const [tag] = process.argv.slice(2); +const bucketUrl = new URL(env("AWS_BUCKET"), env("AWS_ENDPOINT")); +const aws = new AwsClient({ + accessKeyId: env("AWS_ACCESS_KEY_ID"), + secretAccessKey: env("AWS_SECRET_ACCESS_KEY"), +}); + +const latest = await getRelease(); +const release = await getRelease(tag); +console.log("Found release:", release.tag_name); + +let paths: string[]; +if (latest.tag_name === release.tag_name) { + paths = ["releases/latest", `releases/${release.tag_name}`]; +} else if (release.tag_name === "canary") { + try { + const build = await getSemver("canary", await getBuild()); + paths = ["releases/canary", `releases/${build}`]; + } catch (error) { + console.warn(error); + paths = ["releases/canary"]; + } +} else { + paths = [`releases/${release.tag_name}`]; +} +console.log("Found paths:", paths); + +for (const asset of release.assets) { + const url = asset.browser_download_url; + const response = await fetch(url); + if (!response.ok) { + throw new Error( + `Failed to download asset: ${response.status} ${url}` + ); + } + const name = asset.name; + let contentType: string; + switch (name.split(".").pop()) { + case "zip": + contentType = "application/zip"; + break; + case "txt": + case "asc": + contentType = "text/plain"; + break; + default: + contentType = response.headers.get("Content-Type") || ""; + } + const body = await response.arrayBuffer(); + for (const path of paths) { + const key = `${path}/${name}`; + console.log("Uploading:", key); + await uploadToS3({ + key, + body, + headers: { + "Content-Type": contentType, + "Content-Disposition": `attachment; filename="${name}"`, + }, + }); + } +} + +console.log("Done"); + +async function uploadToS3({ + key, + body, + headers, +}: { + key: string; + body: BodyInit; + headers?: { + "Content-Type": string; + "Content-Disposition"?: string; + "Cache-Control"?: string; + }; +}): Promise<void> { + const { href } = new URL(key, bucketUrl); + const response = await aws.fetch(href, { + method: "PUT", + body, + headers, + }); + if (!response.ok) { + throw new Error( + `Failed to upload to S3: ${response.status} ${response.statusText}` + ); + } +} + +function env(name: string): string { + const value = process.env[name]; + if (!value) { + throw new Error(`Environment variable not found: "${name}"`); + } + return value; +} |