Skip to content

Commit d28ff61

Browse files
author
Nicolas Dorseuil
committed
gh action to deploy middleware and server in sync
1 parent a976931 commit d28ff61

File tree

6 files changed

+115
-7
lines changed

6 files changed

+115
-7
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
name: Gradual Deploy to Cloudflare
2+
description: Use gradual deployment to deploy to Cloudflare. This action will upload the middleware and server versions to Cloudflare and kept them bound together
3+
inputs:
4+
apiToken:
5+
description: 'Cloudflare API token'
6+
required: true
7+
accountId:
8+
description: 'Cloudflare account ID'
9+
required: true
10+
environment:
11+
description: 'Cloudflare environment to deploy to (staging, production, preview)'
12+
required: true
13+
middlewareVersionId:
14+
description: 'Middleware version ID to deploy'
15+
required: true
16+
serverVersionId:
17+
description: 'Server version ID to deploy'
18+
required: true
19+
outputs:
20+
deployment-url:
21+
description: "Deployment URL"
22+
value: ${{ steps.deploy_middleware.outputs.deployment-url }}
23+
runs:
24+
using: 'composite'
25+
steps:
26+
- id: wrangler_status
27+
name: Check wrangler deployment status
28+
uses: cloudflare/[email protected]
29+
with:
30+
apiToken: ${{ inputs.apiToken }}
31+
accountId: ${{ inputs.accountId }}
32+
workingDirectory: ./
33+
wranglerVersion: '4.10.0'
34+
environment: ${{ inputs.environment }}
35+
command: deployments status --config ./packages/gitbook-v2/openNext/customWorkers/defaultWrangler.jsonc
36+
37+
# This step is used to get the version ID that is currently deployed to Cloudflare.
38+
- id: extract_current_version
39+
name: Extract current version
40+
shell: bash
41+
run: |
42+
version_id=$(echo "${{ steps.wrangler_status.outputs.command-output }}" | grep -A 3 "(100%)" | grep -oP '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')
43+
echo "version_id=$version_id" >> $GITHUB_OUTPUT
44+
45+
- id: deploy_server
46+
name: Deploy server to Cloudflare at 0%
47+
uses: cloudflare/[email protected]
48+
with:
49+
apiToken: ${{ inputs.apiToken }}
50+
accountId: ${{ inputs.accountId }}
51+
workingDirectory: ./
52+
wranglerVersion: '4.10.0'
53+
environment: ${{ inputs.environment }}
54+
command: versions deploy ${{ steps.extract_current_version.outputs.version_id }}@100% ${{ inputs.serverVersionId }}@0% -y --config ./packages/gitbook-v2/openNext/customWorkers/defaultWrangler.jsonc
55+
56+
# Since we use version overrides headers, we can directly deploy the middleware to 100%.
57+
- id: deploy_middleware
58+
name: Deploy middleware to Cloudflare at 100%
59+
uses: cloudflare/[email protected]
60+
with:
61+
apiToken: ${{ inputs.apiToken }}
62+
accountId: ${{ inputs.accountId }}
63+
workingDirectory: ./
64+
wranglerVersion: '4.10.0'
65+
environment: ${{ inputs.environment }}
66+
command: versions deploy ${{ inputs.middlewareVersionId }}@100% -y --config ./packages/gitbook-v2/openNext/customWorkers/middlewareWrangler.jsonc
67+
68+
- name: Deploy server to Cloudflare at 100%
69+
uses: cloudflare/[email protected]
70+
with:
71+
apiToken: ${{ inputs.apiToken }}
72+
accountId: ${{ inputs.accountId }}
73+
workingDirectory: ./
74+
wranglerVersion: '4.10.0'
75+
environment: ${{ inputs.environment }}
76+
command: versions deploy ${{ inputs.serverVersionId }}@100% -y --config ./packages/gitbook-v2/openNext/customWorkers/defaultWrangler.jsonc
77+
78+
- name: Outputs
79+
shell: bash
80+
env:
81+
DEPLOYMENT_URL: ${{ steps.deploy_middleware.outputs.deployment-url }}
82+
run: |
83+
echo "URL: ${{ steps.deploy_middleware.outputs.deployment-url }}"

.github/composite/deploy-cloudflare/action.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,20 @@ runs:
105105
version_id=$(echo '${{ steps.upload_middleware.outputs.command-output }}' | grep "Worker Version ID" | awk '{print $4}')
106106
echo "version_id=$version_id" >> $GITHUB_OUTPUT
107107
108+
- name: Deploy server and middleware to Cloudflare
109+
if: ${{ inputs.deploy == 'true' }}
110+
uses: ./.github/actions/gradual-deploy-cloudflare
111+
with:
112+
apiToken: ${{ inputs.apiToken }}
113+
accountId: ${{ inputs.accountId }}
114+
opServiceAccount: ${{ inputs.opServiceAccount }}
115+
opItem: ${{ inputs.opItem }}
116+
environment: ${{ inputs.environment }}
117+
serverVersionId: ${{ steps.extract_server_version_id.outputs.version_id }}
118+
middlewareVersionId: ${{ steps.extract_middleware_version_id.outputs.version_id }}
119+
deploy: ${{ inputs.deploy }}
120+
121+
108122
- name: Outputs
109123
shell: bash
110124
env:

packages/gitbook-v2/openNext/customWorkers/default.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@ export default {
66
async fetch(request, env, ctx) {
77
return runWithCloudflareRequestContext(request, env, ctx, async () => {
88
// - `Request`s are handled by the Next server
9-
console.log('Request URL:', request);
10-
if (request.url.includes('404')) {
11-
await env.MIDDLEWARE_REFERENCE.send('whatever');
12-
}
139
return handler(request, env, ctx);
1410
});
1511
},

packages/gitbook-v2/openNext/customWorkers/middleware.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ export default class extends WorkerEntrypoint {
2020

2121
if (this.env.STAGE !== 'preview') {
2222
return this.env.DEFAULT_WORKER?.fetch(reqOrResp, {
23+
headers: {
24+
'Cloudflare-Workers-Version-Overrides': `gitbook-open-v2-${this.env.STAGE}="${this.env.WORKER_VERSION_ID}"`,
25+
},
2326
cf: {
2427
cacheEverything: false,
2528
},

packages/gitbook-v2/openNext/customWorkers/middlewareWrangler.jsonc

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@
4646
"preview": {
4747
"vars": {
4848
"STAGE": "preview",
49-
"PREVIEW_HOSTNAME": "TO_REPLACE"
49+
"PREVIEW_HOSTNAME": "TO_REPLACE",
50+
"WORKER_VERSION_ID": "TO_REPLACE"
5051
},
5152
"r2_buckets": [
5253
{
@@ -72,6 +73,10 @@
7273
// and we don't need tags invalidation on preview
7374
},
7475
"staging": {
76+
"vars": {
77+
"STAGE": "staging",
78+
"WORKER_VERSION_ID": "TO_REPLACE"
79+
},
7580
"routes": [
7681
{
7782
"pattern": "open-2c.gitbook-staging.com/*",
@@ -133,7 +138,9 @@
133138
"MAX_REVALIDATE_CONCURRENCY": "100",
134139
// Temporary variable to find the issue once deployed
135140
// TODO: remove this once the issue is fixed
136-
"DEBUG_CLOUDFLARE": "true"
141+
"DEBUG_CLOUDFLARE": "true",
142+
"WORKER_VERSION_ID": "TO_REPLACE",
143+
"STAGE": "production"
137144
},
138145
"routes": [
139146
{

packages/gitbook-v2/openNext/customWorkers/script/updateWrangler.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,14 @@ const versionId = args[0];
1313
// The preview URL is in the format https://<versionId>-gitbook-open-v2-server-preview.gitbook.workers.dev
1414
const previewHostname = `${versionId.split('-')[0]}-gitbook-open-v2-server-preview.gitbook.workers.dev`;
1515

16-
const updatedFile = file.replace(
16+
let updatedFile = file.replace(
1717
/"PREVIEW_HOSTNAME": "TO_REPLACE"/,
1818
`"PREVIEW_HOSTNAME": "${previewHostname}"`
1919
);
2020

21+
updatedFile = updatedFile.replaceAll(
22+
/"WORKER_VERSION_ID": "TO_REPLACE"/g,
23+
`"WORKER_VERSION_ID": "${versionId}"`
24+
);
25+
2126
fs.writeFileSync(wranglerConfigPath, updatedFile);

0 commit comments

Comments
 (0)