Skip to content

Commit 41c4245

Browse files
committed
ローカル環境と本番環境のrevisions.ymlを分ける & script定義追加
1 parent d1c9dc7 commit 41c4245

6 files changed

Lines changed: 47 additions & 24 deletions

File tree

.github/workflows/node.js.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,4 @@ jobs:
4545
node-version: ${{ matrix.node-version }}
4646
cache: 'npm'
4747
- run: npm ci
48-
- run: npm run checkDocs
48+
- run: npx tsx ./scripts/checkDocs.ts

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
/.open-next
44
/cloudflare-env.d.ts
55

6-
# generated docs section file lists (regenerated by npm run generateDocsMeta)
6+
# documentation
77
/public/docs/**/sections.*
88
/public/docs/languages.*
9+
/public/docs/revisions-dev.yml
10+
/public/docs/commits-dev.yml
911

1012
# dependencies
1113
/node_modules

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,12 @@ GITHUB_CLIENT_SECRET=
3939

4040
別のターミナルで、
4141
```bash
42-
npx drizzle-kit migrate
42+
npm run db-migrate
4343
```
4444
でデータベースを初期化
4545

4646
```bash
47-
npx tsx ./scripts/checkDocs.ts --write
47+
npm run db-docs
4848
```
4949
でデータベースにドキュメントのページ情報を挿入します。
5050
(public/docs/以下にmarkdownを追加・削除したら再度実行する必要があります)
@@ -66,7 +66,7 @@ npm run lint
6666

6767
### データベースのスキーマ
6868

69-
* データベースのスキーマ(./app/schema/hoge.ts)を編集した場合、 `npx drizzle-kit generate` でmigrationファイルを作成し、 `npx drizzle-kit migrate` でデータベースに反映します。
69+
* データベースのスキーマ(./app/schema/hoge.ts)を編集した場合、 `npm run db-generate` (`npx drizzle-kit generate`) でmigrationファイルを作成し、 `npm run db-migrate` (`npx drizzle-kit migrate`) でデータベースに反映します。
7070
* 本番環境のデータベースのmigrateはmainにpushされた際にGitHub Actionで実行されます
7171
* スキーマのファイルを追加した場合は app/lib/drizzle.ts でimportを追加する必要があります(たぶん)
7272
* `npx prisma dev` で立ち上げたデータベースは `npx prisma dev ls` でデータベース名の確認・ `npx prisma dev rm default` で削除ができるらしい
@@ -128,8 +128,8 @@ npm run checkDocs
128128
* REPLのコード例は1セクションに最大1つまで。
129129
* コードエディターとコード実行ブロックはいくつでも置けます。
130130
* ページ0以外の各ページの最後はレベル2見出し「この章のまとめ」と、レベル3見出し「練習問題n」を置く
131-
* 編集したドキュメントにローカルの開発環境でアクセスする際は `npx tsx ./scripts/checkDocs.ts --write` でrevisions.ymlを更新してください。チャットを正しく動作させるために必要です。基本的には手動でこのファイルを編集する必要はありません
132-
* 本番環境ではドキュメントの変更がmainブランチにpushされた際に自動で更新されます。gitのコミットidを参照して更新するため、ローカルで更新したrevisions.ymlはpushしないでください
131+
* 編集したドキュメントにローカルの開発環境でアクセスする際は `npm run db-docs` を実行してください。これにより `public/docs/revisions-dev.yml` が更新・作成され、チャットが正しく動作するようになります
132+
* 本番環境用の `revisions.yml` は、main ブランチに push された際に GitHub Action によって自動的に更新されます
133133

134134
### ベースとなるドキュメントの作り方
135135

app/lib/docs.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,9 @@ export async function getPagesList(): Promise<LanguageEntry[]> {
218218
export async function getRevisions(
219219
sectionId: SectionId
220220
): Promise<RevisionYmlEntry | undefined> {
221-
const revisionsYml = await readPublicFile(`docs/revisions.yml`);
221+
const revisionsYml = await readPublicFile(
222+
`docs/revisions${process.env.NODE_ENV === "development" ? "-dev" : ""}.yml`
223+
);
222224
return (yaml.load(revisionsYml) as Record<string, RevisionYmlEntry>)[
223225
sectionId
224226
];
@@ -230,7 +232,9 @@ export async function getCommitDate(id: string): Promise<Date> {
230232
return commitDateCache.get(id)!;
231233
}
232234
const p = (async () => {
233-
const commitInfoYml = await readPublicFile(`docs/commits.yml`);
235+
const commitInfoYml = await readPublicFile(
236+
`docs/commits${process.env.NODE_ENV === "development" ? "-dev" : ""}.yml`
237+
);
234238
const commitInfo = yaml.load(commitInfoYml) as Record<string, string>;
235239
const timestamp = commitInfo[id];
236240
if (timestamp) {

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
"lint": "npm run cf-typegen && next lint",
1515
"tsc": "npm run cf-typegen && tsc",
1616
"format": "prettier --write app/ packages/",
17-
"checkDocs": "tsx ./scripts/checkDocs.ts",
17+
"db-migrate": "drizzle-kit migrate",
18+
"db-generate": "drizzle-kit generate",
19+
"db-docs": "tsx ./scripts/checkDocs.ts --write",
1820
"cf-preview": "opennextjs-cloudflare build && opennextjs-cloudflare preview --port 3000",
1921
"cf-deploy": "opennextjs-cloudflare build && opennextjs-cloudflare deploy",
2022
"cf-typegen": "wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts"

scripts/checkDocs.ts

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,17 @@ mainブランチにpushされた際にGitHub Actionが --write 引数をつけ
44
現在のパス、md5ハッシュ、コミットIDなどを ./public/docs/revisions.yml に追記
55
セクションIDとページパスの対応関係をデータベースに反映
66
7+
ローカルで --write 引数をつけて実行した場合(npm run db-docs でもok)、
8+
./public/docs/revisions-dev.yml に書き込む。これは開発環境で使われ、pushされない。
9+
710
過去に存在したページが削除されている場合、エラーになります。
811
その場合は手動でrevisions.ymlを編集し、古いページ名の記述を新しいページ名に置き換える必要がある
912
(できれば自動化したいが、いい方法が思いつかない)
1013
1114
Dockerfile内で --check-diff 引数をつけて実行され、
1215
revisions.ymlが最新の状態でないならexit(1)をし、dockerのビルドを停止します
1316
14-
なにも引数をつけずに実行した場合(npm run checkDocs)
17+
なにも引数をつけずに実行した場合、
1518
変更があってもなにもせず正常終了します
1619
エラーなく全ドキュメントを取得できるかどうかの確認に使います
1720
*/
@@ -43,6 +46,11 @@ if (process.argv[2] === "--write") {
4346

4447
const docsDir = join(process.cwd(), "public", "docs");
4548

49+
const useDevFiles = doWrite && !process.env.GITHUB_ACTIONS;
50+
const revisionsFilename = useDevFiles ? "revisions-dev.yml" : "revisions.yml";
51+
const commitsFilename = useDevFiles ? "commits-dev.yml" : "commits.yml";
52+
console.log(`Using ${revisionsFilename} and ${commitsFilename}`);
53+
4654
let commit = "";
4755
if (doWrite) {
4856
commit = execFileSync("git", ["rev-parse", "--short", "HEAD"], {
@@ -54,9 +62,12 @@ let hasNewRevision = false;
5462

5563
const langEntries = await getPagesList();
5664

57-
const revisionsPrevYml = existsSync(join(docsDir, "revisions.yml"))
58-
? await readFile(join(docsDir, "revisions.yml"), "utf-8")
59-
: "{}";
65+
let revisionsPrevYml = "{}";
66+
if (existsSync(join(docsDir, revisionsFilename))) {
67+
revisionsPrevYml = await readFile(join(docsDir, revisionsFilename), "utf-8");
68+
} else if (existsSync(join(docsDir, "revisions.yml"))) {
69+
revisionsPrevYml = await readFile(join(docsDir, "revisions.yml"), "utf-8");
70+
}
6071
const revisions = yaml.load(revisionsPrevYml) as Record<
6172
string,
6273
RevisionYmlEntry
@@ -142,28 +153,32 @@ if (doWrite) {
142153
noArrayIndent: true,
143154
});
144155
await writeFile(
145-
join(docsDir, "revisions.yml"),
156+
join(docsDir, revisionsFilename),
146157
"# This file will be updated by CI. Do not edit manually, unless CI failed.\n" +
147158
revisionsYml,
148159
"utf-8"
149160
);
150161

162+
let commitsPrevYml = "{}";
163+
if (existsSync(join(docsDir, commitsFilename))) {
164+
commitsPrevYml = await readFile(join(docsDir, commitsFilename), "utf-8");
165+
} else if (existsSync(join(docsDir, "commits.yml"))) {
166+
commitsPrevYml = await readFile(join(docsDir, "commits.yml"), "utf-8");
167+
}
168+
const commitsYml = yaml.load(commitsPrevYml) as Record<string, string>;
151169
if (hasNewRevision) {
152-
const commitsYml = yaml.load(
153-
await readFile(join(docsDir, "commits.yml"), "utf-8")
154-
) as Record<string, string>;
155170
commitsYml[commit] = execFileSync(
156171
"git",
157172
["show", "-s", "--format=%cI", commit],
158173
{
159174
encoding: "utf8",
160175
}
161176
).trim();
162-
await writeFile(
163-
join(docsDir, "commits.yml"),
164-
"# This file will be updated by CI. Do not edit manually.\n" +
165-
yaml.dump(commitsYml, { sortKeys: true }),
166-
"utf-8"
167-
);
168177
}
178+
await writeFile(
179+
join(docsDir, commitsFilename),
180+
"# This file will be updated by CI. Do not edit manually.\n" +
181+
yaml.dump(commitsYml, { sortKeys: true }),
182+
"utf-8"
183+
);
169184
}

0 commit comments

Comments
 (0)