Skip to content

Commit c90e715

Browse files
committed
Merge branch 'dev' into main: deploy scheduled cron function & org-scoped blueprints
2 parents fb87701 + 2a4b9d9 commit c90e715

3 files changed

Lines changed: 76 additions & 4 deletions

File tree

‎.github/workflows/deploy.yml‎

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,33 @@ jobs:
3838
SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }}
3939
SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }}
4040

41+
- name: Promote Stack to Organization Scope
42+
run: |
43+
mkdir -p .sanity
44+
echo '{"projectId":"${{ vars.SANITY_STUDIO_PROJECT_ID }}"}' > .sanity/blueprint.config.json
45+
pnpm exec sanity blueprints promote --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }} --force || true
46+
env:
47+
SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }}
48+
4149
- name: Deploy Sanity Blueprints Functions
4250
run: |
43-
pnpm exec sanity blueprints deploy --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }}
51+
ORG_ID=$(node -e "
52+
fetch('https://api.sanity.io/v2021-06-07/projects/${{ vars.SANITY_STUDIO_PROJECT_ID }}', {
53+
headers: { Authorization: 'Bearer ${{ secrets.SANITY_AUTH_TOKEN }}' }
54+
})
55+
.then(r => r.json())
56+
.then(d => {
57+
if (!d.organizationId) throw new Error('No organizationId in project response: ' + JSON.stringify(d));
58+
console.log(d.organizationId);
59+
})
60+
.catch(err => { console.error(err); process.exit(1); });
61+
")
62+
echo "Resolved Organization ID: $ORG_ID"
63+
mkdir -p .sanity
64+
echo "{\"organizationId\":\"$ORG_ID\"}" > .sanity/blueprint.config.json
65+
pnpm exec sanity blueprints deploy --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }}
4466
env:
4567
SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }}
46-
SANITY_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }}
4768
SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }}
4869
SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }}
4970
YOUTUBE_API_KEY: ${{ secrets.YOUTUBE_API_KEY }}
@@ -75,12 +96,33 @@ jobs:
7596
SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }}
7697
SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }}
7798

99+
- name: Promote Stack to Organization Scope
100+
run: |
101+
mkdir -p .sanity
102+
echo '{"projectId":"${{ vars.SANITY_STUDIO_PROJECT_ID }}"}' > .sanity/blueprint.config.json
103+
pnpm exec sanity blueprints promote --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }} --force || true
104+
env:
105+
SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }}
106+
78107
- name: Deploy Sanity Blueprints Functions
79108
run: |
80-
pnpm exec sanity blueprints deploy --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }}
109+
ORG_ID=$(node -e "
110+
fetch('https://api.sanity.io/v2021-06-07/projects/${{ vars.SANITY_STUDIO_PROJECT_ID }}', {
111+
headers: { Authorization: 'Bearer ${{ secrets.SANITY_AUTH_TOKEN }}' }
112+
})
113+
.then(r => r.json())
114+
.then(d => {
115+
if (!d.organizationId) throw new Error('No organizationId in project response: ' + JSON.stringify(d));
116+
console.log(d.organizationId);
117+
})
118+
.catch(err => { console.error(err); process.exit(1); });
119+
")
120+
echo "Resolved Organization ID: $ORG_ID"
121+
mkdir -p .sanity
122+
echo "{\"organizationId\":\"$ORG_ID\"}" > .sanity/blueprint.config.json
123+
pnpm exec sanity blueprints deploy --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }}
81124
env:
82125
SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }}
83-
SANITY_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }}
84126
SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }}
85127
SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }}
86128
YOUTUBE_API_KEY: ${{ secrets.YOUTUBE_API_KEY }}

‎apps/sanity/functions/sync-nightly-dataset/index.ts‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ export const handler = scheduledEventHandler(async ({ context }) => {
2323
const targetDataset = "dev";
2424
const sourceDataset = "production";
2525

26+
if (
27+
process.env.SANITY_STUDIO_DATASET &&
28+
process.env.SANITY_STUDIO_DATASET !== "production"
29+
) {
30+
console.log(
31+
`[Sync Nightly Dataset] Stack is "${process.env.SANITY_STUDIO_DATASET}". Nightly dataset sync only executes on production. Skipping.`,
32+
);
33+
return;
34+
}
35+
2636
console.log(
2737
`[Sync Nightly Dataset] Resetting dataset "${targetDataset}" from source "${sourceDataset}" for project ${projectId}...`,
2838
);

‎sanity.blueprint.ts‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import {
22
defineBlueprint,
33
defineDocumentFunction,
4+
defineScheduledFunction,
45
} from "@sanity/blueprints";
56

67
export default defineBlueprint({
78
resources: [
89
defineDocumentFunction({
910
name: "syndicate-content",
1011
displayName: "Syndicate Content (Dev.to & Hashnode)",
12+
project: process.env.SANITY_STUDIO_PROJECT_ID || "hfh83o0w",
1113
event: {
1214
on: ["create", "update"],
1315
filter: '_type in ["post", "podcast"] && !(_id in path("drafts.**"))',
@@ -19,6 +21,7 @@ export default defineBlueprint({
1921
defineDocumentFunction({
2022
name: "sync-youtube-transcript",
2123
displayName: "Sync YouTube Transcripts & Video Intelligence",
24+
project: process.env.SANITY_STUDIO_PROJECT_ID || "hfh83o0w",
2225
event: {
2326
on: ["create", "update"],
2427
filter: 'defined(youtube) && !(_id in path("drafts.**"))',
@@ -30,5 +33,22 @@ export default defineBlueprint({
3033
YOUTUBE_API_KEY: process.env.YOUTUBE_API_KEY || "",
3134
},
3235
}),
36+
defineScheduledFunction({
37+
name: "sync-nightly-dataset",
38+
displayName: "Nightly Dataset Sync (Production -> Dev)",
39+
src: "./apps/sanity/functions/sync-nightly-dataset",
40+
event: {
41+
expression: "0 4 * * *", // 4:00 AM UTC
42+
},
43+
runtime: "nodejs22.x",
44+
timeout: 300,
45+
env: {
46+
SANITY_AUTH_TOKEN: process.env.SANITY_AUTH_TOKEN || "",
47+
SANITY_STUDIO_PROJECT_ID:
48+
process.env.SANITY_STUDIO_PROJECT_ID || "hfh83o0w",
49+
SANITY_STUDIO_DATASET:
50+
process.env.SANITY_STUDIO_DATASET || "production",
51+
},
52+
}),
3353
],
3454
});

0 commit comments

Comments
 (0)