GitHub 品質ゲートのセットアップ
gitleaks(シークレット検出)とオプションの textlint(Markdown チェック)を 任意の GitHub リポジトリに追加するワークフロー。
品質ゲート: PRのたびに自動実行されるチェック。マージ前にセキュリティ問題・ コンテンツ問題を検出する。
こんなときに使う
このスキルを使うのは:
- 既存リポジトリへの品質ゲートCI追加
- テンプレートリポジトリから作成したリポジトリのカスタマイズ
github-repo-templateが提供する内容の確認・変更- 品質ゲートルールの更新・拡張
Tip: 新規リポジトリの場合は
github-repo-templateから作成する方が速い。すべてが最初から設定済みで届く。
Related Skills
git-initial-setup— ブランチ保護と.gitattributes/.editorconfigの設定(事前前提)knowledge-capture— ドキュメントコミット前の匿名化ゲートgithub-issue-intake— 匿名化チェック付き Issue 起票
Dependencies
- Git 2.30+
- GitHub CLI (
gh) —gh auth statusで確認 - textlint 使用時: Node.js 18+
Core Principles
- 多層防御 (基礎と型) — シークレット検出 + コンテンツ lint の2層で守る。なぜ? 1つのツールでは検出できない問題を補完できる。
- PRでフェールファースト (継続は力) — すべての PRをゲートする。問題を main に届けない。なぜ? main へ入ってしまったら修正コストが格段に上がる。
- ノイズを最小化 (余白の設計) — Allowlist で誤検知を防ぐ。なぜ? 誤検知が多いとエンジニアがアラートを無視し始め、ゲートが形骸化する。
- 言語非依存のコア (ニュートラル) — gitleaks は任意のリポジトリに適用可能。textlint は Markdown があるときだけ追加。なぜ? 不要なジョブは CI 時間とメンテコストを増やすだけ。
- Allowlist を育てる (温故知新) —
.gitleaks.tomlを徐々に育てることでゲートが賢くなる。なぜ? 最初から完璧なルールはない。実運用でのフィードバックが品質を作る。
Workflow: 品質ゲートCIの追加
Step 1: スコープを確認する
リポジトリの内容に応じて、追加するジョブを決める。
| ジョブ | 追加する条件 |
|---|---|
| gitleaks | 常に追加 — すべてのリポジトリ |
| textlint | Markdownが多いとき(ドキュメント・スキル集・README重視のリポジトリ) |
# Markdownファイルの量を確認する
find . -name "*.md" | grep -v "^./README.md" | head -5
README 以外の .md ファイルが複数あれば textlint を追加する。
純粋なコードリポジトリ(dotnet / Python でドキュメントなし)なら gitleaks のみで十分。
Values: 基礎と型
Step 2: Gitleaks を追加する
ワークフローテンプレートをコピーし、allowlist をカスタマイズする。
mkdir -p .github/workflows
cp /path/to/skills/github-quality-gate-setup/scripts/quality.yml \
.github/workflows/quality.yml
cp /path/to/skills/github-quality-gate-setup/scripts/.gitleaks.toml \
.gitleaks.toml
.gitleaks.toml を開き、プロジェクト固有の allowlist エントリを追加する:
[[allowlists]]
description = "プロジェクト固有のプレースホルダー"
regexes = [
# ドキュメント例示に使っているが本物のシークレットではないパターンを追加
'''YOUR[_-]?API[_-]?KEY''',
]
Note:
pull_requestトリガーで実行すると、gitleaks は自動的に PR 差分のみをスキャンする。追加設定は不要。
Values: 基礎と型 / 余白の設計
Step 3: Textlint を追加する(省略可)
リポジトリに Markdown コンテンツが少ない場合はスキップする。
cp /path/to/skills/github-quality-gate-setup/scripts/.textlintrc.json .
cp /path/to/skills/github-quality-gate-setup/scripts/package.json .
npm install
次に、.github/workflows/quality.yml の textlint ジョブのコメントを外す:
# コメントマーカーを外して textlint ジョブを有効化
textlint:
name: textlint
...
ローカルで確認(省略可 — CI が正式なチェック):
npx textlint "**/*.md" --ignore-path .gitignore
Values: ニュートラル
Step 4: コミット & プッシュ → PR
# フィーチャーブランチを作成
git switch -c feature/add-quality-gate
git add .github/workflows/quality.yml .gitleaks.toml
# textlint を追加した場合:
git add .textlintrc.json package.json package-lock.json
git commit -m "feat: gitleaks + textlint 品質ゲートCIを追加
Why: PR での固有名詞・シークレット漏洩を自動検出するゲートを設置。
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>"
git push -u origin feature/add-quality-gate
その後、github-pr-workflow スキルで PR を作成する。
Values: 継続は力
Step 5: Branch Protection を設定する(手動)
CI ワークフローが main にマージされた後、手動でブランチ保護を設定する:
- GitHub → Settings → Branches →
mainルールを編集 - Require status checks to pass before merging を有効化
gitleaksを検索して追加- textlint を追加した場合は
textlintも追加 - 保存
Values: 基礎と型
Best Practices
- まず gitleaks のみで始め、Markdown が多ければ textlint を追加する
.gitleaks.tomlの allowlist は段階的に育てる — 誤検知が出たタイミングで追加- ドキュメント例示には
YOUR_API_KEY_HEREスタイルのプレースホルダーを使い誤検知を防ぐ - textlint を使う場合は
package-lock.jsonをコミットする —npm ciに必要 - Markdown がないリポジトリは gitleaks のみにして CI オーバーヘッドを最小化
Preflight Checklist
-
gh auth statusが成功している(workflow スコープが必要) - フィーチャーブランチを作成済み(main ではない)
-
.gitleaks.tomlの allowlist をリポジトリのドキュメント例示に合わせてチューニング済み - textlint: Markdownの量に応じて追加するか判断済み
Self-Review Checklist
-
.github/workflows/quality.ymlがpull_requestトリガーで動作する - gitleaks ジョブが
gitleaks-action@v2+GITHUB_TOKENを使用している - textlint を追加した場合:
package-lock.jsonがコミット済み、既存ファイルでルールが通る - マージ後に Branch Protection を更新した
Common Pitfalls
.github/workflows/*へのプッシュが拒否される 原因: トークンにworkflowスコープがない。 対処:gh auth refresh -h github.com -s workflowtextlint「No rules found」エラー 原因:
filters.commentsなど、未インストールのフィルタパッケージを参照している。 対処: 該当のフィルタエントリを削除するか、パッケージをインストールする。gitleaks がドキュメント例示で誤検知する 原因: Markdown 内の例示 API キー / トークンが gitleaks パターンにマッチ。 対処:
.gitleaks.tomlの[[allowlists]]にパターンを追加。textlint
no-empty-sectionエラー 原因: 見出しの後、次の見出しまでにコンテンツがない(空セクション)。 対処: 空の見出しを削除するかコンテンツを追加。
Anti-Patterns
.github/workflows/の変更をマージしたのに Branch Protection の必須チェックを設定しない- allowlist を空にして、全 gitleaks 検知をグローバル ignore で抑制する
- Markdown がほとんどないリポジトリに textlint を追加して不要な CI オーバーヘッドを作る
Quick Reference
判断テーブル(Decision Table): gitleaks のみ vs. gitleaks + textlint
リポジトリに README 以外の .md ファイルが多い?
├── YES → gitleaks + textlint
└── NO → gitleaks のみ
gitleaks のみの最小ワークフロー
name: Quality Gate
on:
pull_request:
push:
branches: [main]
permissions:
contents: read
jobs:
gitleaks:
name: gitleaks
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
テンプレートファイルの場所
skills/github-quality-gate-setup/scripts/
├── quality.yml # フルワークフロー(textlintジョブはコメントアウト)
├── .gitleaks.toml # 基本 allowlist
├── .textlintrc.json # textlint ルール
└── package.json # textlint npm 依存関係
FAQ
Q: gitleaks に有料ライセンスは必要?
A: 不要。公開リポジトリでは gitleaks-action@v2 は GITHUB_TOKEN だけで動作する。
Q: textlint に禁止語辞書を追加するには?
A: textlint-rule-no-restricted-syntax をインストールするか、カスタムワードリストファイルを作成して .textlintrc.json で参照する。
Q: gitleaks が履歴に含まれる本物のシークレットを見つけた場合は?
A: 即座にシークレットをローテーション(無効化)する。その後 git filter-repo または BFG で履歴から削除し、force-push する。
Q: detect-secrets との使い分けは?
A: gitleaks が導入が軽くて始めやすい。detect-secrets はベースラインファイル(.secrets.baseline)で「許容済み」のものを管理できるため、誤検知の多い環境では有効。