Skip to content

Commit 5b45b3e

Browse files
committed
fix(sanity): scope blueprint to project document functions and add nightly sync workflow
1 parent f81920b commit 5b45b3e

3 files changed

Lines changed: 66 additions & 34 deletions

File tree

‎.github/workflows/deploy.yml‎

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,24 @@ jobs:
2828
- name: Install dependencies
2929
run: pnpm install --frozen-lockfile
3030

31-
- name: Deploy Sanity via Blueprints (Studio & Functions)
31+
- name: Deploy Sanity Studio
32+
run: npx sanity deploy -y
33+
working-directory: apps/sanity
34+
env:
35+
SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }}
36+
SANITY_STUDIO_HOSTNAME: ${{ vars.SANITY_STUDIO_HOSTNAME }}
37+
SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }}
38+
SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }}
39+
40+
- name: Deploy Sanity Blueprints Functions
3241
run: |
33-
npx sanity blueprints promote --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }} --force || true
34-
npx sanity blueprints deploy --stack ${{ vars.SANITY_STUDIO_DATASET }} || \
35-
npx sanity blueprints deploy --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }} || \
36-
npx sanity deploy -y
42+
npx sanity blueprints deploy --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }}
3743
working-directory: apps/sanity
3844
env:
3945
SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }}
4046
SANITY_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }}
4147
SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }}
4248
SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }}
43-
SANITY_STUDIO_HOSTNAME: ${{ vars.SANITY_STUDIO_HOSTNAME }}
4449
YOUTUBE_API_KEY: ${{ secrets.YOUTUBE_API_KEY }}
4550

4651
deploy-production:
@@ -61,18 +66,22 @@ jobs:
6166
- name: Install dependencies
6267
run: pnpm install --frozen-lockfile
6368

64-
- name: Deploy Sanity via Blueprints (Studio & Functions)
69+
- name: Deploy Sanity Studio
70+
run: npx sanity deploy -y
71+
working-directory: apps/sanity
72+
env:
73+
SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }}
74+
SANITY_STUDIO_HOSTNAME: ${{ vars.SANITY_STUDIO_HOSTNAME }}
75+
SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }}
76+
SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }}
77+
78+
- name: Deploy Sanity Blueprints Functions
6579
run: |
66-
npx sanity blueprints promote --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }} --force || true
67-
npx sanity blueprints deploy --stack ${{ vars.SANITY_STUDIO_DATASET }} || \
68-
npx sanity blueprints deploy --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }} || \
69-
npx sanity deploy -y
80+
npx sanity blueprints deploy --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }}
7081
working-directory: apps/sanity
7182
env:
7283
SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }}
7384
SANITY_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }}
7485
SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }}
7586
SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }}
76-
SANITY_STUDIO_HOSTNAME: ${{ vars.SANITY_STUDIO_HOSTNAME }}
7787
YOUTUBE_API_KEY: ${{ secrets.YOUTUBE_API_KEY }}
78-
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
name: Nightly Dataset Sync (production -> dev)
2+
3+
on:
4+
schedule:
5+
- cron: "0 4 * * *" # Every day at 04:00 UTC
6+
workflow_dispatch:
7+
8+
jobs:
9+
sync-dataset:
10+
runs-on: ubuntu-latest
11+
environment: production
12+
13+
steps:
14+
- name: Reset dev dataset from production
15+
run: |
16+
PROJECT_ID="${{ vars.SANITY_STUDIO_PROJECT_ID }}"
17+
[ -z "$PROJECT_ID" ] && PROJECT_ID="hfh83o0w"
18+
TOKEN="${{ secrets.SANITY_AUTH_TOKEN }}"
19+
API_HOST="https://api.sanity.io"
20+
API_VERSION="v2025-09-30"
21+
22+
echo "Deleting existing 'dev' dataset..."
23+
curl -s -X DELETE "$API_HOST/$API_VERSION/projects/$PROJECT_ID/datasets/dev" \
24+
-H "Authorization: Bearer $TOKEN" || true
25+
26+
echo "Cloning 'production' dataset to 'dev'..."
27+
RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" -X PUT \
28+
"$API_HOST/$API_VERSION/projects/$PROJECT_ID/datasets/production/copy" \
29+
-H "Authorization: Bearer $TOKEN" \
30+
-H "Content-Type: application/json" \
31+
-d '{"targetDataset":"dev","skipHistory":true}')
32+
33+
HTTP_STATUS=$(echo "$RESPONSE" | grep "HTTP_STATUS:" | cut -d: -f2)
34+
BODY=$(echo "$RESPONSE" | grep -v "HTTP_STATUS:")
35+
36+
echo "Status: $HTTP_STATUS"
37+
echo "Response: $BODY"
38+
39+
if [ "$HTTP_STATUS" -ge 200 ] && [ "$HTTP_STATUS" -lt 300 ]; then
40+
echo "Dataset sync initiated successfully!"
41+
else
42+
echo "Dataset sync failed with status $HTTP_STATUS"
43+
exit 1
44+
fi

‎apps/sanity/sanity.blueprint.ts‎

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,10 @@
11
import {
22
defineBlueprint,
33
defineDocumentFunction,
4-
defineScheduledFunction,
5-
defineStudio,
64
} from "@sanity/blueprints";
75

86
export default defineBlueprint({
97
resources: [
10-
defineStudio({
11-
name: "studio",
12-
title: "CodingCatDev Studio",
13-
project: process.env.SANITY_STUDIO_PROJECT_ID || "hfh83o0w",
14-
root: ".",
15-
slug: process.env.SANITY_STUDIO_HOSTNAME || "codingcat-prod",
16-
autoUpdates: {
17-
enabled: true,
18-
},
19-
}),
208
defineDocumentFunction({
219
name: "syndicate-content",
2210
displayName: "Syndicate Content (Dev.to & Hashnode)",
@@ -40,14 +28,5 @@ export default defineBlueprint({
4028
YOUTUBE_API_KEY: process.env.YOUTUBE_API_KEY || "",
4129
},
4230
}),
43-
defineScheduledFunction({
44-
name: "sync-nightly-dataset",
45-
displayName: "Nightly Dataset Sync (production -> dev)",
46-
event: {
47-
expression: "0 4 * * *",
48-
},
49-
runtime: "nodejs22.x",
50-
timeout: 300,
51-
}),
5231
],
5332
});

0 commit comments

Comments
 (0)