From 7078e5e35f49179ddc7ab9b9b2b5f676c6779e95 Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiyat Date: Sat, 23 Mar 2024 06:47:45 +0330 Subject: [PATCH] publish impl (not done yet) --- packages/backend/nitro.config.ts | 24 ++++++++--------- .../backend/server/routes/publish.post.ts | 16 +++++++++++ .../backend/server/routes/webhook.post.ts | 13 ++++++--- packages/backend/server/types.ts | 6 +++++ packages/backend/server/utils/bucket.ts | 7 +++++ packages/backend/utils/workflows.ts | 7 ----- packages/backend/wrangler.toml | 10 +++---- packages/cli/index.ts | 27 ++++++++++++++++--- packages/cli/tsup.config.ts | 3 +++ 9 files changed, 81 insertions(+), 32 deletions(-) create mode 100644 packages/backend/server/routes/publish.post.ts create mode 100644 packages/backend/server/types.ts create mode 100644 packages/backend/server/utils/bucket.ts delete mode 100644 packages/backend/utils/workflows.ts diff --git a/packages/backend/nitro.config.ts b/packages/backend/nitro.config.ts index e23d657f..b75231c8 100644 --- a/packages/backend/nitro.config.ts +++ b/packages/backend/nitro.config.ts @@ -1,10 +1,9 @@ -import { KVNamespace, R2Bucket } from '@cloudflare/workers-types'; +import { R2Bucket } from '@cloudflare/workers-types'; import ncb from 'nitro-cloudflare-dev' declare module "nitro-cloudflare-dev" { interface Env { - PKGS: R2Bucket - WORKFLOWS: KVNamespace + BUCKET: R2Bucket } } @@ -22,20 +21,19 @@ export default defineNitroConfig({ modules: [ncb], srcDir: "server", storage: { - 'workflows': { - driver: 'cloudflare-kv-binding', - base: 'workflows', - binding: 'WORKFLOWS' + 'bucket': { + driver: 'cloudflareR2Binding', + base: 'bucket', + binding: 'BUCKET' }, }, devStorage: { - 'workflows': { - driver: 'cloudflare-kv-binding', - base: 'workflows', - binding: 'WORKFLOWS' - } + 'bucket': { + driver: 'cloudflareR2Binding', + base: 'bucket', + binding: 'BUCKET' + }, }, - runtimeConfig: { appId: "", webhookSecret: "", diff --git a/packages/backend/server/routes/publish.post.ts b/packages/backend/server/routes/publish.post.ts new file mode 100644 index 00000000..4d93c208 --- /dev/null +++ b/packages/backend/server/routes/publish.post.ts @@ -0,0 +1,16 @@ +import { WorkflowData } from "../types" + +export default eventHandler(async (event) => { + const key = getRequestHeader(event, 'sb-key') + const {getItem, hasItem, removeItem} = useBucket() + + // if (!await hasItem(key)) { + // return new Response("", {status: 401}) + // } + + const workflowData = JSON.parse(await getItem(key)) as WorkflowData + console.log(workflowData) + console.log(readRawBody(event)) + + // await removeItem(key) +}) diff --git a/packages/backend/server/routes/webhook.post.ts b/packages/backend/server/routes/webhook.post.ts index e5a2b732..950d9498 100644 --- a/packages/backend/server/routes/webhook.post.ts +++ b/packages/backend/server/routes/webhook.post.ts @@ -1,7 +1,7 @@ import type { HandlerFunction } from "@octokit/webhooks/dist-types/types"; import { objectHash, sha256 } from "ohash"; import { App } from "octokit"; -import { useWorkflows } from "../../utils/workflows"; +import { WorkflowData } from "../types"; export default eventHandler(async (event) => { const { appId, privateKey, webhookSecret } = useRuntimeConfig(event); @@ -12,7 +12,7 @@ export default eventHandler(async (event) => { secret: webhookSecret, }, }); - const { setItem, removeItem } = useWorkflows(); + const { setItem, removeItem } = useBucket(); const workflowHandler: HandlerFunction<"workflow_job", unknown> = async ({ payload, @@ -24,8 +24,15 @@ export default eventHandler(async (event) => { }; const key = sha256(objectHash(metadata)); if (payload.action === 'queued') { + const [orgOrAuthor, repo] = payload.repository.full_name.split('/') + const data: WorkflowData = { + orgOrAuthor, + repo, + sha: payload.workflow_job.head_sha, + branch: payload.workflow_job.head_branch + } // Publishing is only available throughout the lifetime of a worklow_job - await setItem(key, {}); + await setItem(key, JSON.stringify(data)); } else if (payload.action === 'completed') { // Publishing is not available anymore await removeItem(key); diff --git a/packages/backend/server/types.ts b/packages/backend/server/types.ts new file mode 100644 index 00000000..9fd15010 --- /dev/null +++ b/packages/backend/server/types.ts @@ -0,0 +1,6 @@ +export type WorkflowData = { + orgOrAuthor: string, + repo: string, + sha: string, + branch: string +} diff --git a/packages/backend/server/utils/bucket.ts b/packages/backend/server/utils/bucket.ts new file mode 100644 index 00000000..8cbd46f9 --- /dev/null +++ b/packages/backend/server/utils/bucket.ts @@ -0,0 +1,7 @@ +import { R2Bucket } from "@cloudflare/workers-types"; + +type Binary = Parameters[1]; + +export function useBucket() { + return useStorage("bucket"); +} diff --git a/packages/backend/utils/workflows.ts b/packages/backend/utils/workflows.ts deleted file mode 100644 index bdc716dc..00000000 --- a/packages/backend/utils/workflows.ts +++ /dev/null @@ -1,7 +0,0 @@ -interface Workflow { - -} - -export function useWorkflows() { - return useStorage('workflows') -} diff --git a/packages/backend/wrangler.toml b/packages/backend/wrangler.toml index a46ef270..00a90550 100644 --- a/packages/backend/wrangler.toml +++ b/packages/backend/wrangler.toml @@ -11,12 +11,12 @@ compatibility_date = "2024-03-14" # [site] # bucket = ".output/public" -kv_namespaces = [ - { binding = "WORKFLOWS", id = "Workflows" } -] +# kv_namespaces = [ +# { binding = "WORKFLOWS", id = "Workflows" } +# ] [[r2_buckets]] -binding = 'PKGS' # <~ valid JavaScript variable name -bucket_name = 'Packages' +binding = 'BUCKET' # <~ valid JavaScript variable name +bucket_name = 'Bucket' diff --git a/packages/cli/index.ts b/packages/cli/index.ts index da2a6da7..3e5e0c4d 100644 --- a/packages/cli/index.ts +++ b/packages/cli/index.ts @@ -5,16 +5,23 @@ import {objectHash, sha256} from 'ohash' import { Octokit } from "@octokit/action"; import "./environments"; +declare global { + var API_URL: string +} + +const publishUrl = new URL('/publish', API_URL) + if (process.env.GITHUB_ACTIONS !== 'true') { console.error('Stackblitz Continuous Releases are only available in Github Actions.') process.exit(1) } const {GITHUB_SERVER_URL, GITHUB_REPOSITORY, GITHUB_RUN_ID, GITHUB_RUN_ATTEMPT, GITHUB_ACTOR_ID} = process.env -const octokit = new Octokit(); +// const octokit = new Octokit(); // const eventPayload = await import(process.env.GITHUB_EVENT_PATH, { // with: { type: "json" }, // }); +console.log(process.env) // Note: If you need to use a workflow run's URL from within a job, you can combine these variables: $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID const url = `${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}` @@ -27,8 +34,7 @@ const metadata = { const key = sha256(objectHash(metadata)) -console.log(key) -fetch('/',{body}) + // console.log(octokit) // console.log(eventPayload) @@ -43,7 +49,20 @@ const main = defineCommand({ publish: () => { return { meta: {}, - run: () => {}, + run: async () => { + await fetch(publishUrl,{ + method: "POST", + headers: { + 'sb-key': key + }, + body: new ReadableStream({ + start(c) { + c.enqueue(new Uint8Array([1,2,3])) + c.close() + } + }) + }) + }, }; }, link: () => { diff --git a/packages/cli/tsup.config.ts b/packages/cli/tsup.config.ts index 4f9560d0..10d586a4 100644 --- a/packages/cli/tsup.config.ts +++ b/packages/cli/tsup.config.ts @@ -6,6 +6,9 @@ export default defineConfig({ minify: false, splitting: false, sourcemap: "inline", + define: { + API_URL: JSON.stringify(process.env.API_URL ?? 'https://localhost:3000') + }, clean: true, bundle: true, dts: false,