ci: GitHub Actions 更新 + deploy 戦略 + postcss 脆弱性対応#39
Conversation
- pnpm/action-setup v4 → v6(version 入力削除、packageManager フィールドに一本化) - actions/setup-node v4 → v6 - actions/upload-pages-artifact v3 → v5(include-hidden-files: true 追加、.nojekyll 維持) - actions/deploy-pages v4 → v5 - dependabot/fetch-metadata v2.5.0 → v3.1.0(SHA 固定更新) Closes #31 #32 #33 #34 #35 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
GITHUB_TOKEN によるオートマージの push は deploy をトリガーしない仕様のため、 オートマージされた依存更新が GitHub Pages へ反映されていなかった。 - deploy.yml: push に加え週次 cron(月曜 00:00 UTC = 09:00 JST)と workflow_dispatch で実行 - dependabot.yml: 週次実行を月曜 06:00 JST に固定し、約3時間後の週次デプロイと連動 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
## 即時修正 - pnpm-workspace.yaml に `pnpm audit --fix=override` で生成した overrides を追加 - postcss@<8.5.10 を >=8.5.10 に強制 (next@16.2.6 の transitive @8.4.31 を排除) - pnpm-lock.yaml を更新 (postcss@8.4.31 のエントリが消滅) ## 自動化 - security-auto-fix.yml を追加 (週次月曜 10:00 JST / workflow_dispatch) - pnpm audit --fix=override → pnpm install → pnpm build 検証 → PR 作成まで自動 - Dependabot が直せない transitive 脆弱性への恒久対策 Closes #1 (Dependabot security alert: postcss medium) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- heredoc によるYAMLパースエラーを解消(--body を単一行文字列に変更) - gh pr view → gh pr list --state open の件数判定に変更 (マージ済み PR にマッチして PR 作成がスキップされるバグを修正) - git checkout -b → -B(冪等性の改善) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| git config user.name "github-actions[bot]" | ||
| git config user.email "41898282+github-actions[bot]@users.noreply.github.com" | ||
| git checkout -B "$BRANCH" | ||
| git add pnpm-workspace.yaml pnpm-lock.yaml |
There was a problem hiding this comment.
🔴 pnpm audit --fix=override が書き込む package.json がコミットされず、lockfile 不整合になります。
pnpm 11.2.2 の pnpm audit --help より:「override adds overrides to the package.json file」。--fix=override は overrides を package.json(pnpm.overrides)に書き込みます。しかしこの行は pnpm-workspace.yaml と pnpm-lock.yaml しかステージしないため、package.json への overrides 追加がコミットから抜け落ちます。
結果、Sync lockfile で override を反映した pnpm-lock.yaml だけがコミットされ、コミット後の package.json には対応する overrides が無い状態になります。生成 PR や後続の pnpm install --frozen-lockfile(CI・deploy・次回の本ワークフロー)は lockfile とマニフェストの不整合(ERR_PNPM_LOCKFILE_CONFIG_MISMATCH)で失敗するか、セキュリティ修正が黙って失われます。
補足: 既存の手動 overrides は pnpm-workspace.yaml 側にあり、自動修正は package.json 側へ書くため、修正が成功しても overrides が 2 箇所に分裂します。package.json をステージ対象に含めてください。
| git add pnpm-workspace.yaml pnpm-lock.yaml | |
| git add package.json pnpm-workspace.yaml pnpm-lock.yaml |
| - name: Detect changes | ||
| id: diff | ||
| run: | | ||
| if git diff --quiet; then |
There was a problem hiding this comment.
git diff --quiet は追跡対象ファイルのあらゆる差分で changed=true になります。pnpm audit が何も修正しなくても、Sync lockfile の pnpm install --no-frozen-lockfile が pnpm-lock.yaml を再正規化(pnpm バージョン差・設定差・整形差)するだけで changed=true となり、毎週 security/audit-fix に force-push して空の PR を作成します。GITHUB_TOKEN 作成の PR は自動マージされないため、人間が毎回クローズする運用負荷になります。
実際に脆弱性修正があったか(例: pnpm audit --json の結果)で作成可否を判定するか、package.json/overrides の意味的差分のみをトリガにすることを検討してください。
| @@ -1,2 +1,6 @@ | |||
| allowBuilds: | |||
| sharp: true | |||
| minimumReleaseAgeExclude: | |||
There was a problem hiding this comment.
ℹ️ minimumReleaseAgeExclude は minimumReleaseAge 未設定では無効(dead config)です。
minimumReleaseAgeExclude は minimumReleaseAge(新規リリースを一定期間待つ設定)が有効な場合の除外リストです。本リポジトリには minimumReleaseAge がどこにも設定されていない(.npmrc も無し)ため、この 2 行は no-op です。
加えて除外対象が postcss@8.5.10 固定ですが、override postcss@<8.5.10: ^8.5.10 は実際には postcss を 8.5.15 に解決するため、仮に minimumReleaseAge を設定してもこの除外はインストール対象バージョンと一致しません。minimumReleaseAge を併せて設定するか、この minimumReleaseAgeExclude ブロックを削除してください。
| git checkout -B "$BRANCH" | ||
| git add pnpm-workspace.yaml pnpm-lock.yaml | ||
| git commit -m "fix(security): apply pnpm audit --fix=override" | ||
| git push -f origin "$BRANCH" |
There was a problem hiding this comment.
ℹ️ concurrency 未設定 + git push -f の競合・上書きリスク。
このワークフローには concurrency グループがありません。workflow_dispatch の手動実行が schedule 実行と重なる(または再実行する)と、両方が security/audit-fix に git push -f して競合します。また push -f は、開いている PR ブランチにメンテナが追加したコミットを次回実行時に黙って破棄します。
トップレベルに concurrency: { group: security-auto-fix, cancel-in-progress: false } の追加を検討してください。
- security-auto-fix.yml を削除(修正版は別ブランチ/PR で扱う) - pnpm-workspace.yaml: minimumReleaseAge 未設定で no-op の minimumReleaseAgeExclude を削除(postcss overrides は維持) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
概要
3つの変更をまとめて対応します。
(※ 当初含めていた
security-auto-fix.ymlはレビュー指摘を受け #40 に分離しました)1. GitHub Actions major 更新(Dependabot #31〜#35)
pnpm/action-setupversion入力削除(packageManagerフィールドで一本化)actions/setup-nodecache: pnpmは明示指定のため影響なしactions/upload-pages-artifactinclude-hidden-files: true追加(v4+ の dotfile 除外対応、.nojekyll維持)actions/deploy-pagesdependabot/fetch-metadataupdate-type出力は維持(auto-merge への影響なし)Closes #31, #32, #33, #34, #35
2. deploy 戦略の見直し(オートマージ分が未デプロイ問題)
問題:
GITHUB_TOKENによるオートマージの push は GitHub の仕様で他ワークフローをトリガーしない。そのため Dependabot オートマージ分が GitHub Pages に未反映だった。対応:
deploy.ymlに週次 schedule(月曜 00:00 UTC = 09:00 JST)を追加。dependabot.ymlを月曜 06:00 JST 実行に固定し、オートマージ完了の約3時間後に週次デプロイが連動する。3. postcss 脆弱性対応
問題:
next@16.2.6の transitive 依存postcss@8.4.31(< 8.5.10で該当)が脆弱。Dependabot は「直接依存は安全・間接が脆弱」のケースを pnpm で解決できずunknown_errorでクラッシュし続けていた。対応:
pnpm-workspace.yamlにoverrides: postcss@<8.5.10: ^8.5.10を追加 →postcss@8.4.31を lockfile から排除(8.5.15 に解決)minimumReleaseAgeExclude(minimumReleaseAge未設定のため無効)を削除検証
build)が PR 上でグリーンgrep "postcss@8.4.31" pnpm-lock.yamlがヒットしないこと(ローカル確認済み)pnpm build成功(ローカル確認済み)workflow_dispatchでdeploy.ymlの手動実行パスを確認🤖 Generated with Claude Code