Skip to content
This repository was archived by the owner on Sep 15, 2026. It is now read-only.

ci: ワークフローを ci.yml へ統合し、ruff 移行の仕上げとカバレッジコメントを追加 - #220

Merged
Uno-Takashi merged 1 commit into
mainfrom
ci/consolidate-backend-workflows
Sep 15, 2026
Merged

Uno-Takashi merged 1 commit into
mainfrom
ci/consolidate-backend-workflows

Conversation

@Uno-Takashi

Copy link
Copy Markdown
Member

これはなに?

GitHub Actions のワークフローを ci.yml 1 本に統合し、あわせて残っていた
black 前提の運用を ruff へ寄せ切り、PR へのカバレッジコメントを追加します。

これまで pytest.yml / security.yml / license-check.yml / code-quality.yml /
mypy.yml / autoblack.yml の 6 ファイルに散っていて、

  • 同じ uv sync / ダミー env を各所にコピペしていた
  • どのワークフローが何を見ているのか追いづらい
  • autoblack.yml が名前に反して ruff を実行し、しかも 整形結果をブランチへ
    force-push
    していた(CI が履歴を書き換える)

という状態でした。これを 1 ファイルにまとめ、権限と同時実行制御を明示します。

やったこと

1. ci.yml への統合

.github/workflows/ci.yml に以下 14 ジョブを集約しました。各ジョブの
チェック内容・env・サービスコンテナは既存のものをそのまま引き継いでいます。

ジョブ 内容 由来
ruff ruff format --check + ruff check autoblack.yml(挙動は変更・後述)
pytest postgres:16 / redis:7.4 サービス + migration チェック + pytest --cov pytest.yml
mypy django-stubs / drf-stubs による型検査 mypy.yml
license-check pip-licenses のホワイトリスト照合 license-check.yml
bandit Python SAST security.yml
pyt python-taint security.yml
codeql CodeQL analyze security.yml
lizard 複雑度 code-quality.yml
dockerlint Dockerfile lint (npm) code-quality.yml
hadolint Dockerfile lint code-quality.yml
dockle イメージ lint code-quality.yml
actionlint ワークフロー lint code-quality.yml
shellcheck シェルスクリプト lint code-quality.yml
yamllint YAML lint code-quality.yml
  • concurrency + cancel-in-progress で同一 ref の古い実行を打ち切ります。
  • トップレベルは permissions: {}(権限なし)とし、ジョブ単位で最小権限を宣言しました
    (codeql のみ security-events: write、pytest のみ contents: write /
    pull-requests: write、他は contents: read 中心)。
  • トリガは push(main) / pull_request / workflow_dispatch / schedule(旧
    security.yml の週次 cron を引き継ぎ)に統一しました。従来は全ブランチ push で
    回っていましたが、PR 経由の GitHub Flow では二重実行になるため main + PR に寄せています。

削除したファイル: autoblack.yml · pytest.yml · security.yml ·
license-check.yml · code-quality.yml · mypy.yml

2. trivy ジョブの削除

コンテナイメージの CVE スキャン(aquasecurity/trivy-action)は 統合先へ引き継がず
削除
しました。イメージ側の静的チェックは hadolint / dockle / dockerlint が
引き続き担当します。

3. フォーマットは「自動コミット」から「失敗させる」へ

旧 autoblack.yml は ruff format / ruff check --fix を実行したうえで
git push --force origin HEAD:$GITHUB_REF していました。CI がブランチ履歴を
書き換えるのは事故のもとなので廃止し、

uv run ruff format --check .
uv run ruff check .

の 検証のみ(違反があれば CI 失敗)に置き換えました。自動コミット・force-push は
ワークフローから完全に無くなっています。手元での自動修正は従来どおり
uv run ruff format . / uv run ruff check . --fix、または pre-commit で行ってください。

4. black → ruff 移行の仕上げ

  • pyproject.toml には既に black はなく、[tool.ruff.lint] select に I(isort) が
    入っています。ruff check が import 順序も検査することを実地で確認しました
    (未整列の import に I001 Import block is un-sorted or un-formatted が出る)。
    isort 単体の導入は不要です。
  • .pre-commit-config.yaml: 「Format(black 互換)」というコメントを実態に合わせて修正し、
    ruff-pre-commit の rev を v0.15.18 → v0.16.6 へ更新(uv.lock の ruff と揃えるため。
    バージョンがズレると pre-commit と CI で整形結果が食い違います)。
  • AGENTS.md: Stack 表と移行表の black 記述を更新。開発コマンドを uvx ruff →
    uv run ruff へ変更しました(uvx は常に最新の ruff を取ってくるため、
    uv.lock にピン留めされた CI とバージョンがズレます)。CI の説明節も追加。
  • README.md: Lint/Format 節を書き直し、バッジを ci.yml のものへ差し替え。

5. mypy は据え置き

型チェッカは mypy のままです(ty 等へは変更していません)。django-stubs /
drf-stubs プラグインと、settings.py の import に必要なダミー env はそのまま維持しています
(DB/Redis への実接続はしないためサービスコンテナは不要)。

6. PR へのカバレッジコメント + バッジ

py-cov-action/python-coverage-comment-action@v4.3 を pytest ジョブに追加しました。
外部 SaaS は使わず GITHUB_TOKEN だけで動きます。

  • PR: カバレッジのサマリコメントを投稿(差分行のカバレッジも表示)。
  • main: バッジとカバレッジ履歴を python-coverage-comment-action-data ブランチへ保存。
  • action は coverage.xml ではなく .coverage(binary) を読むため、
    pyproject.toml に [tool.coverage.run] relative_files = true を追加しました
    (action の必須要件)。ついでに migrations / tests / manage.py を omit しています。
    --cov-report=xml は他ツール向けに従来どおり残しています。
  • fork からの PR では GITHUB_TOKEN が read-only になり投稿できないため、
    continue-on-error: true を付けてテスト結果を巻き添えにしないようにしました
    (その場合はコメント本文が artifact python-coverage-comment-action に残ります)。
  • 現在のカバレッジは 89%(MINIMUM_GREEN: 85 / MINIMUM_ORANGE: 70)。

⚠️ GIST_TOKEN は不要です(要件からの変更点)

依頼時には「public gist を作り GIST_TOKEN シークレットと gist id を設定する」という
前提がありましたが、この action は v3 以降、バッジの保存先を Gist から
python-coverage-comment-action-data ブランチへ移行済み
で、
action.yml
に GIST_TOKEN / GIST_ID / BADGE_FILENAME といった入力は もう存在しません。
そのため gist ではなくデータブランチ方式で実装しています(gist を作る必要も、
gist スコープの PAT を作る必要もありません)。

一度だけ必要な設定(マージ後 / リポジトリ管理者)

  1. この PR を main へマージする。
  2. main への最初の CI 実行で、action が python-coverage-comment-action-data ブランチを
    自動生成する(手動で作る必要はない)。
  3. そのブランチが ブランチ保護の対象になっていないことを確認する
    (* などのワイルドカード保護ルールがある場合のみ要注意)。
  4. Settings → Actions → General → Workflow permissions が
    Read and write permissions になっていることを確認する
    (ジョブ側でも contents: write / pull-requests: write を宣言済み)。
  5. README 冒頭のカバレッジバッジが表示されることを確認する。表示されない場合は、
    生成された python-coverage-comment-action-data ブランチの README に出力される
    バッジ URL を README へ反映する。
  6. Codecov は廃止したので、CODECOV_TOKEN シークレットは削除して構いません。

テスト・動作確認

  • テストコードを実装(既存テストのまま。43 passed)
  • UI上で動作確認(対象外)

手元(dev container)で実行したコマンドと結果:

コマンド 結果
uv run ruff format --check . ✅ 37 files already formatted
uv run ruff check . ✅ All checks passed!
uv run mypy . ✅ Success: no issues found in 25 source files
uv run python manage.py makemigrations --check --dry-run ✅ No changes detected
uv run python manage.py migrate ✅ No migrations to apply.
uv run pytest --cov --cov-report=xml ✅ 43 passed(TOTAL 89%)
uv run pip-licenses --with-system --partial-match --allow-only=... ✅ exit 0
actionlint(+ shellcheck 連携)× 変更した全ワークフロー ✅ 指摘なし
yamllint -c .yamllint .github/workflows/ ✅ exit 0(既存同様 warning のみ)
YAML パース(PyYAML) ✅ 3 ファイルとも OK

act によるローカル実行:

  • act -j ruff → ✅ Job succeeded
  • act -j mypy → ✅ Job succeeded
  • act -j pytest → ✅ Job succeeded。postgres/redis サービスコンテナが立ち上がり、
    migration チェック → migrate → 43 passed まで通りました。カバレッジコメントの
    step だけは act の合成イベントに対応する branch が GitHub 上に無く
    (compare/main...ci/... が 404)失敗しますが、continue-on-error により
    ジョブ全体は成功することも確認できました(= fork PR 時のガードが意図どおり動く)。

その他・備考

  • code-quality-review.yml と release.yml は対象外でそのまま残しています。
    ただし code-quality-review.yml は PR で reviewdog 経由の mypy を回しており、
    今回追加した ci.yml の mypy ジョブと 重複します。インラインコメントが
    欲しいだけなら ci.yml 側の mypy を落とす/逆に reviewdog 側を整理するなど、
    別途見直すとよさそうです(この PR では触っていません)。
  • カバレッジの計測対象から migrations / tests / manage.py を omit したため、
    以前の Codecov の数値とは単純比較できません。
  • ruff ジョブは uvx ruff(常に最新)ではなく uv sync --frozen + uv run ruff を
    使っています。ruff のバージョンは uv.lock に固定されるので、ruff のリリースで
    突然 CI が落ちることがなくなります(更新は Dependabot / 手動の lock 更新経由)。
  • fork からの PR でもカバレッジコメントを確実に出したい場合は、action の README にある
    workflow_run を使った 2 ワークフロー構成が必要です。今回は「ci.yml 1 本」を優先し、
    continue-on-error + artifact に留めています。

🤖 Generated with Claude Code

…gration

pytest.yml / security.yml / license-check.yml / code-quality.yml / mypy.yml /
autoblack.yml を 1 本の ci.yml へ統合し、旧 black 前提の運用を ruff へ寄せ切った。

- ci.yml に 14 ジョブを集約(ruff / pytest / mypy / license-check / bandit /
  pyt / codeql / lizard / dockerlint / hadolint / dockle / actionlint /
  shellcheck / yamllint)。concurrency で同一 ref の古い実行を打ち切り、
  permissions は既定 {} + ジョブ単位の最小権限にした。
- autoblack.yml の force-push による自動整形コミットを廃止し、
  `ruff format --check .` / `ruff check .` の検証ジョブに置き換えた。
- trivy ジョブを削除した。
- mypy は据え置き(django-stubs / drf-stubs とダミー env をそのまま維持)。
- pytest のカバレッジを Codecov から
  py-cov-action/python-coverage-comment-action へ移行し、PR コメントと
  データブランチ上のバッジにした。`[tool.coverage.run] relative_files = true`
  を追加。
- README / AGENTS.md / .pre-commit-config.yaml の black 参照と uvx ruff 表記を
  整理し、バッジを ci.yml とカバレッジバッジへ差し替えた。

code-quality-review.yml と release.yml は対象外で変更していない。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Coverage report

This PR does not seem to contain any modification to coverable code.

@github-advanced-security

Copy link
Copy Markdown

You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool.

What Enabling Code Scanning Means:

  • The 'Security' tab will display more code scanning analysis results (e.g., for the default branch).
  • Depending on your configuration and choice of analysis tool, future pull requests will be annotated with code scanning analysis results.
  • You will be able to see the analysis results for the pull request's branch on this overview once the scans have completed and the checks have passed.

For more information about GitHub Code Scanning, check out the documentation.

@Uno-Takashi
Uno-Takashi merged commit e21bf00 into main Sep 15, 2026
19 checks passed
@Uno-Takashi
Uno-Takashi deleted the ci/consolidate-backend-workflows branch September 15, 2026 06:56
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants