You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
name: mermaid-linton:
pull_request:
paths:
- "doc/**/*.md"
- ".github/**/*.md"jobs:
mermaid:
runs-on: ubuntu-latestpermissions:
contents: readpull-requests: writesteps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4with:
node-version: 20
- name: Install toolsrun: | npm install -g @mermaid-js/mermaid-cli npm install -g reviewdog
- name: Extract Mermaid blocksrun: | mkdir -p tmp node <<'EOF' const fs = require('fs') const path = require('path') let i = 0 function walk(dir) { if (!fs.existsSync(dir)) return fs.readdirSync(dir).forEach(file => { const full = path.join(dir, file) if (fs.statSync(full).isDirectory()) walk(full) else if (full.endsWith('.md')) processFile(full) }) } function processFile(file) { const lines = fs.readFileSync(file, 'utf8').split('\n') let inside = false let buffer = [] let startLine = 0 lines.forEach((line, idx) => { if (line.startsWith("```mermaid")) { inside = true buffer = [] startLine = idx + 1 return } if (inside && line.startsWith("```")) { inside = false const name = `tmp/diagram-${++i}.mmd` fs.writeFileSync(name, buffer.join('\n')) fs.appendFileSync("tmp/map.txt", `${name}:${file}:${startLine}\n`) return } if (inside) buffer.push(line) }) } walk("doc") walk(".github") EOF
- name: Validate Mermaid diagramsrun: | touch result.txt while IFS=":" read -r mmd src line; do if ! mmdc -i "$mmd" -o "$mmd.svg"; then echo "$src:$line: Mermaid図の構文エラー" >> result.txt fi done < tmp/map.txt
- name: Report via reviewdogrun: | cat result.txt | reviewdog \ -efm="%f:%l: %m" \ -name="Mermaid図チェック" \ -reporter=github-pr-review \ -level=error
Mermaid CI フロー
flowchart TD
A[Markdown files]
B[extract mermaid blocks]
C[generate mmd files]
D[mermaid-cli render]
E[reviewdog comment]
A --> B
B --> C
C --> D
D --> E
[BLIND] Docs CI(markdownlint + Mermaid lint + reviewdog)を導入する
依頼の要点
リポジトリの Markdown ドキュメント品質を維持するため
Docs CI を GitHub Actions に導入する。
導入する CI
Markdown lint と Mermaid lint の結果は
reviewdog により PR コメントとして表示する。
Mermaid 図は Markdown 内に埋め込まれているため
Markdown から Mermaid ブロックを自動抽出し構文検証する。
本 Issue は BLIND Issue として作成されており
本文のみで CI を実装できる。
対象 Markdown
作成する workflow
1 Markdown Lint CI
目的
Markdown lint を CI に導入する。
lint 結果は reviewdog により PR コメントとして表示する。
workflow
実装例(そのまま使用可能)
markdownlint 設定
作成ファイル
内容
{ "MD013": false, "MD033": false }理由
2 Mermaid Lint CI
目的
Markdown 内 Mermaid 図の構文エラーを CI で検出する。
処理フロー
1 Markdown を取得
2 Mermaid block を抽出
3
.mmdファイル生成4 mermaid-cli で検証
5 reviewdog で PR コメント
Mermaid block 例
Mermaid workflow
実装例(そのまま使用可能)
Mermaid CI フロー
reviewdog コメント例
PR に次のようなコメントが表示される。
変更可能範囲
変更可
変更禁止
ローカル確認
Markdown lint
Mermaid
Done
以下を満たすこと。