aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/bun-release-canary.yml29
-rw-r--r--.github/workflows/bun-release.yml38
-rwxr-xr-xpackages/bun-release/bun.lockbbin35027 -> 35327 bytes
-rw-r--r--packages/bun-release/package.json4
-rw-r--r--packages/bun-release/scripts/upload-s3.ts101
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
index a2d8b1353..ef251aca9 100755
--- a/packages/bun-release/bun.lockb
+++ b/packages/bun-release/bun.lockb
Binary files differ
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;
+}