DevOps
CI/CD、依存関係の管理、開発を回すための仕組みについてまとめています。
Renovateの緊急PRだけがCIで落ちる
pnpm 11 は公開から 24 時間未満のバージョンを既定で拒否し、Renovate は脆弱性修正の PR を即座に作るので、緊急の PR だけが CI で落ちます。Renovate 側でも待たせる案を考えていましたが、先行事例を調べると方向が逆でした。pnpm と Renovate の一次情報から、これからどう変えていくかを書きます。
Required Status Check を CI Result 1つに集約している
GitHub の Required Status Check はワークフローを区別せず、Check Run の名前だけで照合します。ラビーでは CI を `ci.yaml` 1本にまとめ、全ジョブの結果を集める `CI Result` ジョブだけを Required にしています。`always()` を外すと落ちたジョブが成功扱いになる根拠、Fork からの PR に Required Check が効かない理由と `pull_request_target` を使わない判断を書きます。
Renovate の Auto-merge 対象から Digest を外した
GitHub Actions の commit SHA Pin は、その SHA を書き換える Renovate の PR を人が見なければ守りになりません。SHA Pin とフル semver のコメントが揃っていれば Digest 更新が単独で来るのはリリース済みのタグが動いたときだけなので、ラビーの共有 Preset の `automerge` 対象から Digest を外しました。`minimumReleaseAge` では止められない理由、Pin のコメントの揃え方、先に試した例外ルール、タグ Ruleset と `sha_pinning_required` も記録します。
Apple向けアプリのCIを自前のMac 1台で回している
lintとテストはMac miniに置いたSelf-Hosted Runnerで走らせ、TestFlightとApp Store Connectへの配布はXcode Cloudに任せています。配布も同じランナーに載せようとして、署名鍵はランナーに置かないと決めました。そこに至るまでの経緯と、まっさらにならないマシンで踏んだ問題を振り返ります。
ディレクトリごとにClaude Codeのアカウントを分ける
Claude Codeの設定ディレクトリは CLAUDE_CONFIG_DIR で切り替えられます。macOSは認証情報をKeychainに置くので空の設定ディレクトリでもログイン状態は引き継がれる、と公式ドキュメントにありますが、実際にはKeychainのサービス名に設定ディレクトリのパスのsha256が付くため引き継がれません。ディレクトリごとにアカウントを分ける運用と、その根拠を書きます。
VOICEVOXをApple containerで動かしたらCPUが4コアしか使われていなかったので割り当てを増やした
Mac で常駐の VOICEVOX サーバーを Apple container で動かしたら、デフォルトでコンテナに 4 CPU しか割り当てられず、合成速度を本来の 4.5 分の 1 に落としていました。M5 Max での実測を交えて、cpus と cpu_num_threads を両方詰める設定を紹介します。
GitHub Pages は Unpublish しても設定が残るので棚卸しでは DELETE API まで叩く
移行元リポジトリの GitHub Pages を片付けたとき、Settings から Unpublish しただけでは Pages 設定オブジェクトが残り、`GET /repos/{owner}/{repo}/pages` が 200 を返し続けることに気づきました。Unpublish と Delete の違い、`status: null` の読み方、棚卸しで漏れを出さないために `gh api -X DELETE` まで踏み込む判断をまとめます。
プロダクトサイト群を 1 つの pnpm workspace に集約した
複数のプロダクトサイトを別リポジトリで運用していたところを、`sites/` と `packages/` の2層構成を持つ単一の pnpm workspace モノレポに集約しました。catalog で依存バージョンを揃え、共有パッケージはロジックと構造だけを渡してデザインは各サイトに残す設計、仮移植のサイトを抱えたまま動かす運用までを扱います。
GitHub Actions の workflow を 4 項目で安全側に倒した
org 配下の workflow を `defaults.run.shell: bash`、`actions/checkout` の `persist-credentials: false`、サードパーティアクションの SHA pin、`permissions` 最小化の4項目で揃えた経緯と、`git push` を含む `release.yml` や `submodules: true` を併用する workflow で「適用しない」を選んだ判断軸を記録します。
gh search code のインデックスは遅延する
Renovateプリセットの旧ファイル削除前に `gh search code` で参照残存を確認したら、マージ済みの新参照がまだヒットしてくれませんでした。コード検索インデックスの遅延に気づいた経緯と、Contents API でファイル本文を直接取得して実体検証する手順、検索ベース API への向き合い方を扱います。
Renovateの参照差し替え先の変更をgh apiで楽をする
Renovateプリセットの参照先差し替えで、Org配下のリポジトリ群に同じ修正PRを冪等に投げるBashスクリプトを、`git clone`を一度もせずに`gh api`だけで書きました。GitHub Contents APIとGit Refs APIの組み合わせ、再実行を前提にした冪等性の4箇所、macOSとLinuxで動く`mktemp`テンプレートまでをまとめます。
RenovateのOnboarding PRを毎回手作業で書き換えるのをやめた
Renovateが立てる初回Onboarding PRには、`<org>/renovate-config/default.json`を置けば組織プリセットへの`extends`が自動で差し込まれる仕組みがソースコード側にあります。コメントを残せる`default.json5`を選ぶとこの自動検出が空振りするため、Mend-hostedの`org-inherited-config.json`で`onboardingConfig`を明示的に上書きして、Onboarding PRをそのままマージできる状態に揃えました。
Cloudflare Pages で llms.txt が文字化けしたので _headers で charset を書いた
Cloudflare Pages は配信ファイルの拡張子から `Content-Type` を推測しますが、`text/plain` などには `charset` が付きません。`public/_headers` で `/llms.txt` `/robots.txt` `/sitemap.xml` `/docs/*.md` などに `charset=utf-8` を明示して、日本語の文字化けを直した手順をまとめます。
RenovateでCloudflare Workers SDKのパッケージをグルーピングする
Cloudflare Workers SDKはモノレポで管理されていますが、Renovateのデフォルト設定ではパッケージごとに個別のPRが作られます。wrangler、@cloudflare/vite-plugin、miniflareを1つのPRにまとめるpackageRulesの設定と、monorepo presetへの提案で浮上したimmortal PRs問題を紹介します。
GitHub Organizationのプロフィールページを設定する
GitHub Organizationの公開・非公開プロフィールページの設定方法を紹介します。.githubリポジトリと.github-privateリポジトリの使い分けについて解説します。
