Skip to content

Commit 7edcd74

Browse files
authored
Merge pull request #21149 from emberjs/kg-update-app-templates
2 parents 38a1438 + d631cee commit 7edcd74

2 files changed

Lines changed: 196 additions & 0 deletions

File tree

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#!/usr/bin/env node
2+
import fs from "node:fs";
3+
import path from "node:path";
4+
5+
const [appDir, targetDir] = process.argv.slice(2);
6+
7+
if (!appDir || !targetDir) {
8+
console.error("Usage: update-smoke-test-template.sh <appDir> <targetDir>");
9+
process.exit(1);
10+
}
11+
12+
function readJson(filePath) {
13+
return JSON.parse(fs.readFileSync(filePath, "utf8"));
14+
}
15+
16+
function writeJson(filePath, data) {
17+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + "\n");
18+
}
19+
20+
const resolvedAppDir = path.resolve(appDir);
21+
const resolvedTargetDir = path.resolve(targetDir);
22+
23+
fs.rmSync(path.join(resolvedAppDir, ".ember-cli"), { force: true });
24+
25+
const pkgPath = path.join(resolvedAppDir, "package.json");
26+
const pkg = readJson(pkgPath);
27+
pkg.scripts = pkg.scripts || {};
28+
pkg.scripts.test = "ember test";
29+
30+
if (pkg.devDependencies && pkg.devDependencies["@glimmer/component"]) {
31+
pkg.devDependencies["@glimmer/component"] = "workspace:^";
32+
} else if (pkg.dependencies && pkg.dependencies["@glimmer/component"]) {
33+
pkg.dependencies["@glimmer/component"] = "workspace:^";
34+
} else {
35+
pkg.devDependencies = pkg.devDependencies || {};
36+
pkg.devDependencies["@glimmer/component"] = "workspace:^";
37+
}
38+
39+
if (pkg.devDependencies && pkg.devDependencies["ember-source"]) {
40+
pkg.devDependencies["ember-source"] = "workspace:*";
41+
}
42+
43+
writeJson(pkgPath, pkg);
44+
45+
const envPath = path.join(resolvedAppDir, "config", "environment.js");
46+
const source = fs.readFileSync(envPath, "utf8");
47+
if (!source.includes("_OVERRIDE_DEPRECATION_VERSION")) {
48+
const block = [
49+
"/* The following enables the infrastructure allow us to test as if deprecations",
50+
" have been turned into errors at a specific version.",
51+
"*/",
52+
"_OVERRIDE_DEPRECATION_VERSION: process.env.OVERRIDE_DEPRECATION_VERSION,"
53+
];
54+
const updated = source.replace(
55+
/EmberENV:\s*\{\s*\n([ \t]*)/,
56+
(match, indent) => {
57+
const pad = `${indent} `;
58+
const injected = block.map((line) => pad + line).join("\n");
59+
return match + injected + "\n" + indent;
60+
}
61+
);
62+
if (updated === source) {
63+
throw new Error("Failed to locate EmberENV block for injection.");
64+
}
65+
fs.writeFileSync(envPath, updated);
66+
}
67+
68+
fs.rmSync(resolvedTargetDir, { recursive: true, force: true });
69+
fs.renameSync(resolvedAppDir, resolvedTargetDir);
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
name: Update ember-test-app on ember-cli minor release
2+
3+
on:
4+
workflow_dispatch:
5+
schedule:
6+
- cron: '0 9 * * 1' # weekly on Monday; job will self-gate to every 10 weeks
7+
8+
permissions:
9+
contents: write
10+
issues: write
11+
pull-requests: write
12+
13+
jobs:
14+
gate:
15+
name: Gate to every 10 weeks
16+
runs-on: ubuntu-latest
17+
steps:
18+
- name: Check schedule
19+
run: |
20+
set -euo pipefail
21+
week=$(date +%V)
22+
if [ $((10#$week % 10)) -ne 0 ]; then
23+
echo "Skipping: ISO week $week is not a 10-week interval."
24+
exit 0
25+
fi
26+
27+
update-app-template:
28+
name: Regenerate smoke-tests app template
29+
runs-on: ubuntu-latest
30+
needs: gate
31+
steps:
32+
- uses: actions/checkout@v4
33+
- name: Setup Node.js
34+
uses: actions/setup-node@v4
35+
with:
36+
node-version: 20
37+
- name: Generate ember-test-app using classic blueprint
38+
run: |
39+
set -euo pipefail
40+
tmpdir=$(mktemp -d)
41+
echo "Using temp dir: $tmpdir"
42+
cd "$tmpdir"
43+
pnpm dlx ember-cli@latest new ember-test-app -b @ember-tooling/classic-build-app-blueprint --no-welcome --skip-git --skip-npm --ember-data=false
44+
node "$GITHUB_WORKSPACE/.github/scripts/update-smoke-test-template.mjs" \
45+
"$tmpdir/ember-test-app" \
46+
"$GITHUB_WORKSPACE/smoke-tests/app-template"
47+
48+
- name: Create PR
49+
uses: peter-evans/create-pull-request@v7
50+
with:
51+
branch: smoke-tests/update-app-template
52+
delete-branch: false
53+
commit-message: "Update ember-test-app template"
54+
title: "Update ember-test-app template (ember-cli latest)"
55+
body: |
56+
Regenerated the smoke-tests app-template using ember-cli latest.
57+
58+
update-v2-app-template:
59+
name: Regenerate smoke-tests v2 app template
60+
runs-on: ubuntu-latest
61+
needs: gate
62+
steps:
63+
- uses: actions/checkout@v4
64+
- name: Setup Node.js
65+
uses: actions/setup-node@v4
66+
with:
67+
node-version: 20
68+
- name: Generate v2-app-template
69+
run: |
70+
set -euo pipefail
71+
tmpdir=$(mktemp -d)
72+
echo "Using temp dir: $tmpdir"
73+
cd "$tmpdir"
74+
pnpm dlx ember-cli@latest new v2-app-template --no-welcome --skip-git --skip-npm --ember-data=false
75+
node "$GITHUB_WORKSPACE/.github/scripts/update-smoke-test-template.mjs" \
76+
"$tmpdir/v2-app-template" \
77+
"$GITHUB_WORKSPACE/smoke-tests/v2-app-template"
78+
79+
- name: Create PR
80+
uses: peter-evans/create-pull-request@v7
81+
with:
82+
branch: smoke-tests/update-v2-app-template
83+
delete-branch: false
84+
commit-message: "Update v2-app-template"
85+
title: "Update v2-app-template (ember-cli latest)"
86+
body: |
87+
Regenerated the smoke-tests v2-app-template using ember-cli latest.
88+
89+
report-failure:
90+
name: Report failure
91+
runs-on: ubuntu-latest
92+
needs:
93+
- update-app-template
94+
- update-v2-app-template
95+
if: failure()
96+
steps:
97+
- name: Create issue
98+
uses: actions/github-script@v7
99+
with:
100+
script: |
101+
const title = "Smoke-test app template update failed";
102+
const body = [
103+
"The scheduled smoke-test app template update workflow failed.",
104+
"",
105+
`Run: ${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}`,
106+
"",
107+
`Attempt: ${process.env.GITHUB_RUN_ATTEMPT}`
108+
].join("\\n");
109+
110+
const { data: existing } = await github.rest.search.issuesAndPullRequests({
111+
q: `repo:${context.repo.owner}/${context.repo.repo} is:issue is:open in:title "${title}"`
112+
});
113+
114+
if (existing.items.length > 0) {
115+
core.info(`Existing issue found: #${existing.items[0].number}`);
116+
return;
117+
}
118+
119+
const { data: issue } = await github.rest.issues.create({
120+
owner: context.repo.owner,
121+
repo: context.repo.repo,
122+
title,
123+
body,
124+
assignees: ["kategengler"]
125+
});
126+
127+
core.info(`Created issue #${issue.number}`);

0 commit comments

Comments
 (0)