@embrace-ai/infra-api-schema-sync 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +77 -1
- package/dist/src/dispatch-update.d.ts.map +1 -1
- package/dist/src/dispatch-update.js +114 -5
- package/dist/src/dispatch-update.js.map +1 -1
- package/dist/src/generate-schema-url.d.ts.map +1 -1
- package/dist/src/generate-schema-url.js +23 -6
- package/dist/src/generate-schema-url.js.map +1 -1
- package/package.json +1 -1
- package/src/dispatch-update.js +172 -5
- package/src/generate-schema-url.js +22 -8
- package/templates/workflows/emit-schema-update.yml +5 -6
- package/templates/workflows/graphql-schema-validate.yml +71 -18
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.0.3](https://github.com/Embrace-AI/infra-api-schema-sync/compare/v1.0.2...v1.0.3) (2025-10-08)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **dispatch:** check candidate repo for repository dispatch types ([#15](https://github.com/Embrace-AI/infra-api-schema-sync/issues/15)) ([9b3c97b](https://github.com/Embrace-AI/infra-api-schema-sync/commit/9b3c97bbfb11547b7720e0149b6553663f38f20a))
|
|
9
|
+
|
|
10
|
+
## [1.0.2](https://github.com/Embrace-AI/infra-api-schema-sync/compare/v1.0.1...v1.0.2) (2025-10-07)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* **cli:** use process.stderr for logs, and output logs to file ([#13](https://github.com/Embrace-AI/infra-api-schema-sync/issues/13)) ([84b30d0](https://github.com/Embrace-AI/infra-api-schema-sync/commit/84b30d05cc922912edf34c3c1f3e50f5cbc65644))
|
|
16
|
+
|
|
3
17
|
## [1.0.1](https://github.com/Embrace-AI/infra-api-schema-sync/compare/v1.0.0...v1.0.1) (2025-06-19)
|
|
4
18
|
|
|
5
19
|
|
package/README.md
CHANGED
|
@@ -1,4 +1,30 @@
|
|
|
1
|
-
#
|
|
1
|
+
# GraphQL API Schema Sync Tool
|
|
2
|
+
|
|
3
|
+
A CLI tool and GitHub Actions workflow templates for synchronizing GraphQL schema changes across multiple repositories in an organization.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Schema Fetching**: Download GraphQL schemas via introspection
|
|
8
|
+
- **Schema Validation**: Validate GraphQL queries against a schema
|
|
9
|
+
- **Smart Dispatch**: Automatically notify repositories that have the schema validation workflow
|
|
10
|
+
- **Workflow Templates**: Ready-to-use GitHub Actions workflows for emitting and consuming schema updates
|
|
11
|
+
|
|
12
|
+
## Key Capabilities
|
|
13
|
+
|
|
14
|
+
### Intelligent Repository Discovery
|
|
15
|
+
|
|
16
|
+
The `dispatch-update` command automatically:
|
|
17
|
+
|
|
18
|
+
- Scans all repositories in your organization
|
|
19
|
+
- Checks each repository for the `graphql-schema-updated` workflow
|
|
20
|
+
- Only dispatches to repositories that can handle the event
|
|
21
|
+
- Skips repositories without the workflow (avoiding 403 errors)
|
|
22
|
+
|
|
23
|
+
This ensures that:
|
|
24
|
+
|
|
25
|
+
- The main `embrace` repository receives schema updates
|
|
26
|
+
- Repositories without GraphQL dependencies are not notified
|
|
27
|
+
- You get clear feedback about which repos were notified vs. skipped
|
|
2
28
|
|
|
3
29
|
## Setup
|
|
4
30
|
|
|
@@ -78,6 +104,56 @@ pnpm test
|
|
|
78
104
|
pnpm build
|
|
79
105
|
```
|
|
80
106
|
|
|
107
|
+
## Usage
|
|
108
|
+
|
|
109
|
+
### CLI Commands
|
|
110
|
+
|
|
111
|
+
#### `dispatch-update`
|
|
112
|
+
|
|
113
|
+
Dispatch schema update events to repositories in your organization:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
pnpm exec api-tool dispatch-update \
|
|
117
|
+
--schema-url "https://api.dev.embrace.ai/v2/graphql/schema" \
|
|
118
|
+
--token "$GITHUB_TOKEN" \
|
|
119
|
+
--source-repo "Embrace-AI/my-api" \
|
|
120
|
+
--commit "$GITHUB_SHA" \
|
|
121
|
+
--branch "$GITHUB_REF_NAME" \
|
|
122
|
+
--org-name "Embrace-AI"
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**How it works:**
|
|
126
|
+
|
|
127
|
+
1. Fetches all repositories in the organization
|
|
128
|
+
2. Checks each repository for `.github/workflows/*.yml` files
|
|
129
|
+
3. Looks for workflows with `repository_dispatch` trigger and `graphql-schema-updated` event type
|
|
130
|
+
4. Only dispatches to repositories that have the workflow configured
|
|
131
|
+
5. Reports which repositories were notified and which were skipped
|
|
132
|
+
|
|
133
|
+
**Example output:**
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
🔍 Checking 50 repositories for workflow files...
|
|
137
|
+
|
|
138
|
+
✅ Found 2 repositories with workflow:
|
|
139
|
+
- Embrace-AI/embrace
|
|
140
|
+
- Embrace-AI/frontend
|
|
141
|
+
|
|
142
|
+
⏭️ Skipped 48 repositories without workflow:
|
|
143
|
+
- Embrace-AI/sse.js
|
|
144
|
+
- Embrace-AI/terraboard
|
|
145
|
+
...
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
#### Other Commands
|
|
149
|
+
|
|
150
|
+
- `fetch` - Fetch GraphQL schema from a URL
|
|
151
|
+
- `validate` - Validate queries against schema
|
|
152
|
+
- `summarize` - Generate markdown from validation report
|
|
153
|
+
- `generate-schema-url` - Generate dynamic schema URL
|
|
154
|
+
|
|
155
|
+
See workflow templates in `templates/workflows/` for complete examples.
|
|
156
|
+
|
|
81
157
|
## Releasing
|
|
82
158
|
|
|
83
159
|
This project uses Github Actions to release to npmjs.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch-update.d.ts","sourceRoot":"","sources":["../../src/dispatch-update.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dispatch-update.d.ts","sourceRoot":"","sources":["../../src/dispatch-update.js"],"names":[],"mappings":"AAqJO,wCAVJ;IAAwB,SAAS,EAAzB,MAAM;IACU,UAAU,EAA1B,MAAM;IACU,MAAM,EAAtB,MAAM;IACU,MAAM,EAAtB,MAAM;IACU,SAAS,EAAzB,MAAM;IACU,KAAK,EAArB,MAAM;IACU,OAAO,EAAvB,MAAM;IACU,UAAU,EAA1B,MAAM;IACW,MAAM,EAAvB,OAAO;CACjB;;;;;;;;;;GA6NA;AA2DM;;;;;;;;;;GAyDN"}
|
|
@@ -1,4 +1,91 @@
|
|
|
1
1
|
import { execSync } from "child_process";
|
|
2
|
+
import { parse as parseYaml } from "yaml";
|
|
3
|
+
const checkForSchemaWorkflow = async (repo, token, dryRun) => {
|
|
4
|
+
if (dryRun) {
|
|
5
|
+
return repo.includes("embrace");
|
|
6
|
+
}
|
|
7
|
+
try {
|
|
8
|
+
const response = await fetch(`https://api.github.com/repos/${repo}/contents/.github/workflows`, {
|
|
9
|
+
headers: {
|
|
10
|
+
Authorization: `Bearer ${token}`,
|
|
11
|
+
Accept: "application/vnd.github.v3+json",
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
if (response.status === 404) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
if (!response.ok) {
|
|
18
|
+
console.warn(` ⚠️ Could not check workflows for ${repo}: HTTP ${response.status}`);
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const files = await response.json();
|
|
22
|
+
for (const file of files) {
|
|
23
|
+
if (file.name.endsWith(".yml") || file.name.endsWith(".yaml")) {
|
|
24
|
+
try {
|
|
25
|
+
const fileResponse = await fetch(file.download_url, {
|
|
26
|
+
headers: {
|
|
27
|
+
Authorization: `Bearer ${token}`,
|
|
28
|
+
Accept: "application/vnd.github.v3.raw",
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
if (!fileResponse.ok) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const content = await fileResponse.text();
|
|
35
|
+
try {
|
|
36
|
+
const workflow = parseYaml(content);
|
|
37
|
+
if (!workflow?.on) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const triggers = workflow.on;
|
|
41
|
+
let hasRepositoryDispatch = false;
|
|
42
|
+
let types = null;
|
|
43
|
+
if (typeof triggers === "string" &&
|
|
44
|
+
triggers === "repository_dispatch") {
|
|
45
|
+
hasRepositoryDispatch = true;
|
|
46
|
+
}
|
|
47
|
+
else if (Array.isArray(triggers) &&
|
|
48
|
+
triggers.includes("repository_dispatch")) {
|
|
49
|
+
hasRepositoryDispatch = true;
|
|
50
|
+
}
|
|
51
|
+
else if (triggers?.repository_dispatch !== undefined) {
|
|
52
|
+
hasRepositoryDispatch = true;
|
|
53
|
+
types = triggers.repository_dispatch?.types;
|
|
54
|
+
}
|
|
55
|
+
if (!hasRepositoryDispatch) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (types !== null && types !== undefined) {
|
|
59
|
+
if (Array.isArray(types)) {
|
|
60
|
+
if (types.includes("graphql-schema-updated")) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else if (typeof types === "string" &&
|
|
65
|
+
types === "graphql-schema-updated") {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
catch (yamlError) {
|
|
73
|
+
console.warn(`⚠️ YAML parsing error in ${file.name}: ${yamlError.message}`);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.warn(` ⚠️ Error checking ${repo}: ${error.message}`);
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
2
89
|
export const dispatchUpdate = async (options) => {
|
|
3
90
|
try {
|
|
4
91
|
const { schemaUrl, sourceRepo, commit, branch, timestamp, token, orgName, repoFilter = ".*", dryRun = false, } = options;
|
|
@@ -43,7 +130,7 @@ export const dispatchUpdate = async (options) => {
|
|
|
43
130
|
let allRepos;
|
|
44
131
|
if (dryRun && (token === "fake-token" || token.startsWith("fake"))) {
|
|
45
132
|
console.log("DRY RUN: Using simulated repositories");
|
|
46
|
-
allRepos = `${orgName}/
|
|
133
|
+
allRepos = `${orgName}/embrace\n${sourceRepo}\n`;
|
|
47
134
|
}
|
|
48
135
|
else {
|
|
49
136
|
allRepos = await fetchAllRepos();
|
|
@@ -58,17 +145,39 @@ export const dispatchUpdate = async (options) => {
|
|
|
58
145
|
else {
|
|
59
146
|
filteredRepos = allRepos;
|
|
60
147
|
}
|
|
61
|
-
const
|
|
148
|
+
const candidateRepos = filteredRepos
|
|
62
149
|
.split("\n")
|
|
63
150
|
.filter((repo) => repo.trim() && repo !== sourceRepo)
|
|
64
151
|
.filter((repo) => repo.length > 0);
|
|
65
|
-
if (
|
|
66
|
-
console.log("⚠️ No
|
|
152
|
+
if (candidateRepos.length === 0) {
|
|
153
|
+
console.log("⚠️ No candidate repositories found");
|
|
67
154
|
return { success: 0, errors: 0, total: 0 };
|
|
68
155
|
}
|
|
69
|
-
console.log(
|
|
156
|
+
console.log(`🔍 Checking ${candidateRepos.length} repositories for workflow files...`);
|
|
157
|
+
const targetRepos = [];
|
|
158
|
+
const skippedRepos = [];
|
|
159
|
+
for (const repo of candidateRepos) {
|
|
160
|
+
const hasWorkflow = await checkForSchemaWorkflow(repo, token, dryRun);
|
|
161
|
+
if (hasWorkflow) {
|
|
162
|
+
targetRepos.push(repo);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
skippedRepos.push(repo);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
console.log("");
|
|
169
|
+
console.log(`✅ Found ${targetRepos.length} repositories with workflow:`);
|
|
70
170
|
targetRepos.forEach((repo) => console.log(` - ${repo}`));
|
|
171
|
+
if (skippedRepos.length > 0) {
|
|
172
|
+
console.log("");
|
|
173
|
+
console.log(`⏭️ Skipped ${skippedRepos.length} repositories without workflow:`);
|
|
174
|
+
skippedRepos.forEach((repo) => console.log(` - ${repo}`));
|
|
175
|
+
}
|
|
71
176
|
console.log("");
|
|
177
|
+
if (targetRepos.length === 0) {
|
|
178
|
+
console.log("⚠️ No repositories found with graphql-schema-updated workflow");
|
|
179
|
+
return { success: 0, errors: 0, total: 0 };
|
|
180
|
+
}
|
|
72
181
|
if (dryRun) {
|
|
73
182
|
console.log("DRY RUN: Would dispatch to the above repositories");
|
|
74
183
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch-update.js","sourceRoot":"","sources":["../../src/dispatch-update.js"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dispatch-update.js","sourceRoot":"","sources":["../../src/dispatch-update.js"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-schema-url.d.ts","sourceRoot":"","sources":["../../src/generate-schema-url.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generate-schema-url.d.ts","sourceRoot":"","sources":["../../src/generate-schema-url.js"],"names":[],"mappings":"AAYO,yDALJ;IAAwB,KAAK,EAArB,MAAM;IACU,OAAO,EAAvB,MAAM;IACU,IAAI,EAApB,MAAM;CACd,GAAU,MAAM,CAwBlB;AAkGM,qDA2CN"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { execSync } from "child_process";
|
|
2
|
-
import
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import * as path from "path";
|
|
3
4
|
export const buildSchemaUrl = ({ stage = "dev", service, repo }) => {
|
|
4
5
|
if (!repo) {
|
|
5
6
|
repo = detectRepositoryName();
|
|
@@ -67,18 +68,34 @@ const extractServiceName = (repo) => {
|
|
|
67
68
|
export const generateSchemaUrl = (opts) => {
|
|
68
69
|
try {
|
|
69
70
|
const { stage, service, repo } = opts;
|
|
70
|
-
console.log("🔧 Generating schema URL...");
|
|
71
71
|
const detectedRepo = repo || detectRepositoryName();
|
|
72
72
|
const detectedService = service || extractServiceName(detectedRepo);
|
|
73
|
-
console.log(`📁 Repository: ${detectedRepo}`);
|
|
74
|
-
console.log(`🏷️ Service: ${detectedService}`);
|
|
75
|
-
console.log(`🚀 Stage: ${stage}`);
|
|
76
73
|
const url = buildSchemaUrl({
|
|
77
74
|
stage,
|
|
78
75
|
service: detectedService,
|
|
79
76
|
repo: detectedRepo,
|
|
80
77
|
});
|
|
81
|
-
|
|
78
|
+
const summaryPath = process.env.GITHUB_STEP_SUMMARY;
|
|
79
|
+
if (summaryPath) {
|
|
80
|
+
const md = [
|
|
81
|
+
"### Schema URL Generation",
|
|
82
|
+
"",
|
|
83
|
+
`- Repository: ${detectedRepo}`,
|
|
84
|
+
`- Service: ${detectedService}`,
|
|
85
|
+
`- Stage: ${stage}`,
|
|
86
|
+
`- URL: ${url}`,
|
|
87
|
+
"",
|
|
88
|
+
].join("\n");
|
|
89
|
+
try {
|
|
90
|
+
fs.appendFileSync(summaryPath, md);
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
console.warn("Failed to write summary:", e.message);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
process.stderr.write("::notice::Generated schema URL\n");
|
|
98
|
+
}
|
|
82
99
|
process.stdout.write(url);
|
|
83
100
|
return url;
|
|
84
101
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-schema-url.js","sourceRoot":"","sources":["../../src/generate-schema-url.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"generate-schema-url.js","sourceRoot":"","sources":["../../src/generate-schema-url.js"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/dispatch-update.js
CHANGED
|
@@ -1,4 +1,138 @@
|
|
|
1
1
|
import { execSync } from "child_process";
|
|
2
|
+
import { parse as parseYaml } from "yaml";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Check if a repository has a workflow that listens for graphql-schema-updated events
|
|
6
|
+
* @param {string} repo - Repository full name (org/repo)
|
|
7
|
+
* @param {string} token - GitHub token
|
|
8
|
+
* @param {boolean} dryRun - If true, simulate the check
|
|
9
|
+
* @returns {Promise<boolean>} True if the repo has the workflow
|
|
10
|
+
*/
|
|
11
|
+
const checkForSchemaWorkflow = async (repo, token, dryRun) => {
|
|
12
|
+
// In dry-run mode, simulate some repos having the workflow
|
|
13
|
+
if (dryRun) {
|
|
14
|
+
// Simulate that only the embrace repo has the workflow
|
|
15
|
+
return repo.includes("embrace");
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
// Fetch the .github/workflows directory contents
|
|
20
|
+
const response = await fetch(
|
|
21
|
+
`https://api.github.com/repos/${repo}/contents/.github/workflows`,
|
|
22
|
+
{
|
|
23
|
+
headers: {
|
|
24
|
+
Authorization: `Bearer ${token}`,
|
|
25
|
+
Accept: "application/vnd.github.v3+json",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
// If no workflows directory, skip this repo
|
|
31
|
+
if (response.status === 404) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
console.warn(
|
|
37
|
+
` ⚠️ Could not check workflows for ${repo}: HTTP ${response.status}`,
|
|
38
|
+
);
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const files = await response.json();
|
|
43
|
+
|
|
44
|
+
// Check each workflow file for the repository_dispatch trigger
|
|
45
|
+
for (const file of files) {
|
|
46
|
+
if (file.name.endsWith(".yml") || file.name.endsWith(".yaml")) {
|
|
47
|
+
try {
|
|
48
|
+
// Fetch the workflow file content
|
|
49
|
+
const fileResponse = await fetch(file.download_url, {
|
|
50
|
+
headers: {
|
|
51
|
+
Authorization: `Bearer ${token}`,
|
|
52
|
+
Accept: "application/vnd.github.v3.raw",
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
if (!fileResponse.ok) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const content = await fileResponse.text();
|
|
59
|
+
|
|
60
|
+
// Parse YAML and check for repository_dispatch with graphql-schema-updated
|
|
61
|
+
try {
|
|
62
|
+
const workflow = parseYaml(content);
|
|
63
|
+
|
|
64
|
+
// If no 'on' field, skip this workflow
|
|
65
|
+
if (!workflow?.on) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Handle different YAML structures for the 'on' field
|
|
70
|
+
// repository_dispatch can be:
|
|
71
|
+
// 1. on: repository_dispatch (boolean/null)
|
|
72
|
+
// 2. on: [repository_dispatch] (array)
|
|
73
|
+
// 3. on: { repository_dispatch: { types: [...] } } (object)
|
|
74
|
+
const triggers = workflow.on;
|
|
75
|
+
|
|
76
|
+
let hasRepositoryDispatch = false;
|
|
77
|
+
let types = null;
|
|
78
|
+
|
|
79
|
+
if (
|
|
80
|
+
typeof triggers === "string" &&
|
|
81
|
+
triggers === "repository_dispatch"
|
|
82
|
+
) {
|
|
83
|
+
hasRepositoryDispatch = true;
|
|
84
|
+
} else if (
|
|
85
|
+
Array.isArray(triggers) &&
|
|
86
|
+
triggers.includes("repository_dispatch")
|
|
87
|
+
) {
|
|
88
|
+
hasRepositoryDispatch = true;
|
|
89
|
+
} else if (triggers?.repository_dispatch !== undefined) {
|
|
90
|
+
hasRepositoryDispatch = true;
|
|
91
|
+
types = triggers.repository_dispatch?.types;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (!hasRepositoryDispatch) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// If types are specified, verify graphql-schema-updated is included
|
|
99
|
+
if (types !== null && types !== undefined) {
|
|
100
|
+
if (Array.isArray(types)) {
|
|
101
|
+
if (types.includes("graphql-schema-updated")) {
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
} else if (
|
|
105
|
+
typeof types === "string" &&
|
|
106
|
+
types === "graphql-schema-updated"
|
|
107
|
+
) {
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
// If types are specified but don't include our event, skip this workflow
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// If no types specified, repository_dispatch accepts all event types
|
|
115
|
+
return true;
|
|
116
|
+
} catch (yamlError) {
|
|
117
|
+
// If YAML parsing fails, skip this file
|
|
118
|
+
console.warn(
|
|
119
|
+
`⚠️ YAML parsing error in ${file.name}: ${yamlError.message}`,
|
|
120
|
+
);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
} catch {
|
|
124
|
+
// Skip files we can't read
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return false;
|
|
131
|
+
} catch (error) {
|
|
132
|
+
console.warn(` ⚠️ Error checking ${repo}: ${error.message}`);
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
};
|
|
2
136
|
|
|
3
137
|
/**
|
|
4
138
|
* Dispatch schema update events to repositories
|
|
@@ -93,7 +227,7 @@ export const dispatchUpdate = async (options) => {
|
|
|
93
227
|
let allRepos;
|
|
94
228
|
if (dryRun && (token === "fake-token" || token.startsWith("fake"))) {
|
|
95
229
|
console.log("DRY RUN: Using simulated repositories");
|
|
96
|
-
allRepos = `${orgName}/
|
|
230
|
+
allRepos = `${orgName}/embrace\n${sourceRepo}\n`;
|
|
97
231
|
} else {
|
|
98
232
|
allRepos = await fetchAllRepos();
|
|
99
233
|
}
|
|
@@ -110,20 +244,53 @@ export const dispatchUpdate = async (options) => {
|
|
|
110
244
|
}
|
|
111
245
|
|
|
112
246
|
// Remove empty lines and current repository from the list
|
|
113
|
-
const
|
|
247
|
+
const candidateRepos = filteredRepos
|
|
114
248
|
.split("\n")
|
|
115
249
|
.filter((repo) => repo.trim() && repo !== sourceRepo)
|
|
116
250
|
.filter((repo) => repo.length > 0);
|
|
117
251
|
|
|
118
|
-
if (
|
|
119
|
-
console.log("⚠️ No
|
|
252
|
+
if (candidateRepos.length === 0) {
|
|
253
|
+
console.log("⚠️ No candidate repositories found");
|
|
120
254
|
return { success: 0, errors: 0, total: 0 };
|
|
121
255
|
}
|
|
122
256
|
|
|
123
|
-
console.log(
|
|
257
|
+
console.log(
|
|
258
|
+
`🔍 Checking ${candidateRepos.length} repositories for workflow files...`,
|
|
259
|
+
);
|
|
260
|
+
|
|
261
|
+
// Check each repository for the graphql-schema-updated workflow
|
|
262
|
+
const targetRepos = [];
|
|
263
|
+
const skippedRepos = [];
|
|
264
|
+
|
|
265
|
+
for (const repo of candidateRepos) {
|
|
266
|
+
const hasWorkflow = await checkForSchemaWorkflow(repo, token, dryRun);
|
|
267
|
+
if (hasWorkflow) {
|
|
268
|
+
targetRepos.push(repo);
|
|
269
|
+
} else {
|
|
270
|
+
skippedRepos.push(repo);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
console.log("");
|
|
275
|
+
console.log(`✅ Found ${targetRepos.length} repositories with workflow:`);
|
|
124
276
|
targetRepos.forEach((repo) => console.log(` - ${repo}`));
|
|
277
|
+
|
|
278
|
+
if (skippedRepos.length > 0) {
|
|
279
|
+
console.log("");
|
|
280
|
+
console.log(
|
|
281
|
+
`⏭️ Skipped ${skippedRepos.length} repositories without workflow:`,
|
|
282
|
+
);
|
|
283
|
+
skippedRepos.forEach((repo) => console.log(` - ${repo}`));
|
|
284
|
+
}
|
|
125
285
|
console.log("");
|
|
126
286
|
|
|
287
|
+
if (targetRepos.length === 0) {
|
|
288
|
+
console.log(
|
|
289
|
+
"⚠️ No repositories found with graphql-schema-updated workflow",
|
|
290
|
+
);
|
|
291
|
+
return { success: 0, errors: 0, total: 0 };
|
|
292
|
+
}
|
|
293
|
+
|
|
127
294
|
if (dryRun) {
|
|
128
295
|
console.log("DRY RUN: Would dispatch to the above repositories");
|
|
129
296
|
return {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { execSync } from "child_process";
|
|
2
|
-
import
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import * as path from "path";
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Generate a dynamic GraphQL schema URL based on repository and deployment stage
|
|
@@ -133,23 +134,36 @@ export const generateSchemaUrl = (opts) => {
|
|
|
133
134
|
try {
|
|
134
135
|
const { stage, service, repo } = opts;
|
|
135
136
|
|
|
136
|
-
console.log("🔧 Generating schema URL...");
|
|
137
|
-
|
|
138
137
|
// Detect values if not provided
|
|
139
138
|
const detectedRepo = repo || detectRepositoryName();
|
|
140
139
|
const detectedService = service || extractServiceName(detectedRepo);
|
|
141
140
|
|
|
142
|
-
console.log(`📁 Repository: ${detectedRepo}`);
|
|
143
|
-
console.log(`🏷️ Service: ${detectedService}`);
|
|
144
|
-
console.log(`🚀 Stage: ${stage}`);
|
|
145
|
-
|
|
146
141
|
const url = buildSchemaUrl({
|
|
147
142
|
stage,
|
|
148
143
|
service: detectedService,
|
|
149
144
|
repo: detectedRepo,
|
|
150
145
|
});
|
|
151
146
|
|
|
152
|
-
|
|
147
|
+
const summaryPath = process.env.GITHUB_STEP_SUMMARY;
|
|
148
|
+
if (summaryPath) {
|
|
149
|
+
const md = [
|
|
150
|
+
"### Schema URL Generation",
|
|
151
|
+
"",
|
|
152
|
+
`- Repository: ${detectedRepo}`,
|
|
153
|
+
`- Service: ${detectedService}`,
|
|
154
|
+
`- Stage: ${stage}`,
|
|
155
|
+
`- URL: ${url}`,
|
|
156
|
+
"",
|
|
157
|
+
].join("\n");
|
|
158
|
+
try {
|
|
159
|
+
fs.appendFileSync(summaryPath, md);
|
|
160
|
+
} catch (e) {
|
|
161
|
+
console.warn("Failed to write summary:", e.message);
|
|
162
|
+
}
|
|
163
|
+
} else {
|
|
164
|
+
// Optional: Create a GitHub Actions notice without using console.*
|
|
165
|
+
process.stderr.write("::notice::Generated schema URL\n");
|
|
166
|
+
}
|
|
153
167
|
|
|
154
168
|
// Output just the URL for easy consumption by scripts
|
|
155
169
|
process.stdout.write(url);
|
|
@@ -6,7 +6,7 @@ on:
|
|
|
6
6
|
branches:
|
|
7
7
|
- main
|
|
8
8
|
paths:
|
|
9
|
-
-
|
|
9
|
+
- "**/*schema.ts"
|
|
10
10
|
workflow_dispatch: {}
|
|
11
11
|
|
|
12
12
|
env:
|
|
@@ -16,12 +16,12 @@ env:
|
|
|
16
16
|
# SCHEMA_URL: "https://api.dev.embrace.ai/v2/graphql/schema"
|
|
17
17
|
|
|
18
18
|
# Deployment stage - determines the environment URL pattern
|
|
19
|
-
DEPLOYMENT_STAGE: "dev"
|
|
19
|
+
DEPLOYMENT_STAGE: "dev" # Options: dev, prod, pr-* (e.g., pr-123)
|
|
20
20
|
# Optional: Override service name (auto-detected from repository name if not set)
|
|
21
21
|
# SERVICE_NAME: "your-service-name"
|
|
22
22
|
|
|
23
23
|
# Optional: Filter repositories by name pattern (regex)
|
|
24
|
-
REPO_FILTER: ".*"
|
|
24
|
+
REPO_FILTER: ".*" # Default: all repos. Example: "^(frontend|mobile|web)-.*" for specific patterns
|
|
25
25
|
permissions:
|
|
26
26
|
id-token: write
|
|
27
27
|
contents: read
|
|
@@ -41,7 +41,7 @@ jobs:
|
|
|
41
41
|
uses: actions/setup-node@v4
|
|
42
42
|
with:
|
|
43
43
|
node-version: 22.16.0
|
|
44
|
-
cache:
|
|
44
|
+
cache: "pnpm"
|
|
45
45
|
- name: Setup NPM
|
|
46
46
|
env:
|
|
47
47
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
@@ -49,7 +49,7 @@ jobs:
|
|
|
49
49
|
|
|
50
50
|
- name: Install GraphQL schema sync tool
|
|
51
51
|
# Update below to use the version you want
|
|
52
|
-
run: pnpm install -w @embrace-ai/infra-api-schema-sync@
|
|
52
|
+
run: pnpm install -w @embrace-ai/infra-api-schema-sync@latest
|
|
53
53
|
|
|
54
54
|
# Generate dynamic schema URL based on repository and stage
|
|
55
55
|
- name: Generate schema URL
|
|
@@ -67,7 +67,6 @@ jobs:
|
|
|
67
67
|
echo "url=$SCHEMA_URL" >> $GITHUB_OUTPUT
|
|
68
68
|
echo "🌐 Generated schema URL: $SCHEMA_URL"
|
|
69
69
|
|
|
70
|
-
|
|
71
70
|
# Fetch all organization repositories and dispatch to each
|
|
72
71
|
- name: Dispatch schema update events to all org repositories
|
|
73
72
|
env:
|
|
@@ -4,7 +4,12 @@ name: Validate GraphQL Schema Updates
|
|
|
4
4
|
on:
|
|
5
5
|
repository_dispatch:
|
|
6
6
|
types: [graphql-schema-updated]
|
|
7
|
-
workflow_dispatch:
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
inputs:
|
|
9
|
+
schema_url:
|
|
10
|
+
description: "Schema URL to validate against"
|
|
11
|
+
required: false
|
|
12
|
+
default: ""
|
|
8
13
|
|
|
9
14
|
jobs:
|
|
10
15
|
validate-schema:
|
|
@@ -20,7 +25,7 @@ jobs:
|
|
|
20
25
|
uses: actions/setup-node@v4
|
|
21
26
|
with:
|
|
22
27
|
node-version: 22.16.0
|
|
23
|
-
cache:
|
|
28
|
+
cache: "pnpm"
|
|
24
29
|
|
|
25
30
|
- name: Setup NPM
|
|
26
31
|
env:
|
|
@@ -29,7 +34,7 @@ jobs:
|
|
|
29
34
|
|
|
30
35
|
- name: Install GraphQL schema sync tool
|
|
31
36
|
# Update line below to use the version you want
|
|
32
|
-
run: pnpm install -w @embrace-ai/infra-api-schema-sync@
|
|
37
|
+
run: pnpm install -w @embrace-ai/infra-api-schema-sync@latest
|
|
33
38
|
|
|
34
39
|
- name: Configure aws credentials
|
|
35
40
|
uses: aws-actions/configure-aws-credentials@v4.2.1
|
|
@@ -37,16 +42,38 @@ jobs:
|
|
|
37
42
|
role-to-assume: ${{ secrets.AWS_DEPLOY_ROLE_DEV }}
|
|
38
43
|
aws-region: ${{ vars.AWS_REGION }}
|
|
39
44
|
|
|
45
|
+
- name: Determine schema URL
|
|
46
|
+
id: schema-url
|
|
47
|
+
run: |
|
|
48
|
+
if [ "${{ github.event_name }}" = "repository_dispatch" ]; then
|
|
49
|
+
# Use the schema URL from the dispatch event
|
|
50
|
+
SCHEMA_URL="${{ github.event.client_payload.schemaUrl }}"
|
|
51
|
+
echo "📡 Using schema URL from dispatch event: $SCHEMA_URL"
|
|
52
|
+
elif [ -n "${{ github.event.inputs.schema_url }}" ]; then
|
|
53
|
+
# Use the schema URL from workflow_dispatch input
|
|
54
|
+
SCHEMA_URL="${{ github.event.inputs.schema_url }}"
|
|
55
|
+
echo "🔧 Using schema URL from workflow input: $SCHEMA_URL"
|
|
56
|
+
else
|
|
57
|
+
echo "❌ Error: No schema URL provided"
|
|
58
|
+
exit 1
|
|
59
|
+
fi
|
|
60
|
+
echo "url=$SCHEMA_URL" >> $GITHUB_OUTPUT
|
|
61
|
+
|
|
40
62
|
- name: Display schema update context
|
|
41
63
|
run: |
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
64
|
+
if [ "${{ github.event_name }}" = "repository_dispatch" ]; then
|
|
65
|
+
echo "Schema update received from: ${{ github.event.client_payload.sourceRepo }}"
|
|
66
|
+
echo "Schema URL: ${{ github.event.client_payload.schemaUrl }}"
|
|
67
|
+
echo "Source commit: ${{ github.event.client_payload.commit }}"
|
|
68
|
+
echo "Source branch: ${{ github.event.client_payload.branch }}"
|
|
69
|
+
echo "Timestamp: ${{ github.event.client_payload.timestamp }}"
|
|
70
|
+
else
|
|
71
|
+
echo "Event type: ${{ github.event_name }}"
|
|
72
|
+
echo "Schema URL: ${{ steps.schema-url.outputs.url }}"
|
|
73
|
+
fi
|
|
47
74
|
|
|
48
75
|
- name: Fetch updated schema
|
|
49
|
-
run: pnpm exec api-tool fetch --url ${{
|
|
76
|
+
run: pnpm exec api-tool fetch --url ${{ steps.schema-url.outputs.url }} --output new-schema.graphql
|
|
50
77
|
|
|
51
78
|
- name: Validate queries against new schema
|
|
52
79
|
id: validate
|
|
@@ -55,9 +82,9 @@ jobs:
|
|
|
55
82
|
- name: Check for issues
|
|
56
83
|
id: check-issues
|
|
57
84
|
run: |
|
|
58
|
-
if [ -s report.json ] && [ "$(jq '
|
|
85
|
+
if [ -s report.json ] && [ "$(jq 'length' report.json)" -gt 0 ]; then
|
|
59
86
|
echo "has_issues=true" >> $GITHUB_OUTPUT
|
|
60
|
-
echo "issue_count=$(jq '
|
|
87
|
+
echo "issue_count=$(jq 'length' report.json)" >> $GITHUB_OUTPUT
|
|
61
88
|
else
|
|
62
89
|
echo "has_issues=false" >> $GITHUB_OUTPUT
|
|
63
90
|
echo "issue_count=0" >> $GITHUB_OUTPUT
|
|
@@ -71,17 +98,18 @@ jobs:
|
|
|
71
98
|
- name: Commit and create PR with issues
|
|
72
99
|
uses: peter-evans/create-pull-request@v6
|
|
73
100
|
with:
|
|
74
|
-
commit-message: "chore(api): GraphQL schema update from
|
|
101
|
+
commit-message: "chore(api): GraphQL schema update${{ github.event_name == 'repository_dispatch' && format(' from {0}', github.event.client_payload.sourceRepo) || '' }}"
|
|
75
102
|
branch: "graphql/schema-update-${{ github.run_id }}"
|
|
76
103
|
title: "GraphQL Schema Update (${{ steps.check-issues.outputs.issue_count }} issues)"
|
|
77
104
|
body: |
|
|
78
105
|
# GraphQL Schema Update Impact Report
|
|
79
106
|
|
|
80
|
-
**Schema Source:**
|
|
81
|
-
**Schema URL:** ${{
|
|
82
|
-
**Source Commit:**
|
|
83
|
-
**Source Branch:**
|
|
84
|
-
**Update Time:**
|
|
107
|
+
${{ github.event_name == 'repository_dispatch' && format('**Schema Source:** {0}', github.event.client_payload.sourceRepo) || '' }}
|
|
108
|
+
**Schema URL:** ${{ steps.schema-url.outputs.url }}
|
|
109
|
+
${{ github.event_name == 'repository_dispatch' && format('**Source Commit:** {0}', github.event.client_payload.commit) || '' }}
|
|
110
|
+
${{ github.event_name == 'repository_dispatch' && format('**Source Branch:** {0}', github.event.client_payload.branch) || '' }}
|
|
111
|
+
${{ github.event_name == 'repository_dispatch' && format('**Update Time:** {0}', github.event.client_payload.timestamp) || '' }}
|
|
112
|
+
**Trigger:** ${{ github.event_name }}
|
|
85
113
|
|
|
86
114
|
---
|
|
87
115
|
## ${{ steps.check-issues.outputs.has_issues == 'true' && 'Detected Issues' || '🎉 No Issues Found' }}
|
|
@@ -93,8 +121,33 @@ jobs:
|
|
|
93
121
|
3. Test your changes thoroughly
|
|
94
122
|
4. Merge this PR once all issues are resolved
|
|
95
123
|
|
|
124
|
+
- name: Display validation results (for manual runs)
|
|
125
|
+
if: github.event_name == 'workflow_dispatch'
|
|
126
|
+
run: |
|
|
127
|
+
echo "## 📊 GraphQL Schema Validation Results" >> $GITHUB_STEP_SUMMARY
|
|
128
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
129
|
+
echo "**Schema URL:** ${{ steps.schema-url.outputs.url }}" >> $GITHUB_STEP_SUMMARY
|
|
130
|
+
echo "**Event:** ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY
|
|
131
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
132
|
+
|
|
133
|
+
if [ "${{ steps.check-issues.outputs.has_issues }}" = "true" ]; then
|
|
134
|
+
echo "### ❌ Found ${{ steps.check-issues.outputs.issue_count }} issue(s)" >> $GITHUB_STEP_SUMMARY
|
|
135
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
136
|
+
if [ -f GRAPHQL_ISSUES.md ]; then
|
|
137
|
+
cat GRAPHQL_ISSUES.md >> $GITHUB_STEP_SUMMARY
|
|
138
|
+
fi
|
|
139
|
+
else
|
|
140
|
+
echo "### ✅ No compatibility issues found!" >> $GITHUB_STEP_SUMMARY
|
|
141
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
142
|
+
echo "The schema is compatible with all existing GraphQL queries." >> $GITHUB_STEP_SUMMARY
|
|
143
|
+
fi
|
|
144
|
+
|
|
96
145
|
- name: Create success comment
|
|
97
146
|
if: steps.check-issues.outputs.has_issues == 'false'
|
|
98
147
|
run: |
|
|
99
148
|
echo "✅ No GraphQL compatibility issues found!"
|
|
100
|
-
|
|
149
|
+
if [ "${{ github.event_name }}" = "repository_dispatch" ]; then
|
|
150
|
+
echo "Schema from ${{ github.event.client_payload.sourceRepo }} is compatible with existing queries."
|
|
151
|
+
else
|
|
152
|
+
echo "Schema from ${{ steps.schema-url.outputs.url }} is compatible with existing queries."
|
|
153
|
+
fi
|