OpenSSF Scorecard / ソースコードの守り方

CI-Tests
マージ前にテストが走っているか

Pull Request がマージされる前に CI が走り、通っているかを見るチェックです。テストの中身や網羅率は見ておらず、CI が動いた記録があるかだけを数えています。

何を見るチェックか

Scorecard は、直近のマージ済み Pull Request(既定で30件程度)を調べ、 それぞれに CI の実行記録が付いていて、成功しているかを確認します。

対象になるのは、

  • GitHub Actions のワークフロー実行
  • Travis CI / CircleCI / Jenkins / Azure Pipelines などのステータスチェック

CI が成功していた Pull Request の割合が、そのまま点になります。

テストの中身は見ていません。 echo "ok" だけのワークフローでも、実行されて成功していれば数えられます。

点が低いと何を意味するか

点が低いということは、変更がマージされる前に、自動で検査された記録が確認できない、 という意味です。

これが問題になるのは次のような場面です。

  • 壊れた変更がそのままリリースに届く
  • 依存を更新したときに、互換性が壊れたことに気づけない
  • レビューする人が、動作確認をすべて手元でやることになる

Code-Review が人の目、CI-Tests が機械の目にあたります。 どちらも無い場合、変更は何も通らずに main へ入っていることになります。

逆に、レビューが無くても CI が厚ければ、機械が一定の役目を果たします。

誤解しやすい点

「CI が通っている」と「テストが十分にある」は別のことです。

この項目は CI の実行記録しか見ていません。次のどれも 10点になります。

  • テストが1件しかない
  • 網羅率が 5% しかない
  • ワークフローが lint だけを走らせている
  • テストが実質的に何も検証していない

逆に、次のような理由で低く出ることもあります。

  • 直接コミットで開発している。 Pull Request が無いので検査対象がありません。 1人プロジェクトでは普通のことです
  • CI を使っていないが、リリース前に手で入念に検査している
  • ステータスチェックの名前や仕組みが Scorecard の想定と違う

さらに注意点として、この項目が高いことが「品質が高い」を意味しません。 それを見たいなら、リポジトリのテストディレクトリを開いて、 実際に何が検証されているかを見るしかありません。 Scorecard に限らず、自動判定でテストの質は測れません。

採用する側が確認すべきこと

  1. リポジトリの Actions タブを開く。 実行が並んでいるか、失敗が放置されていないかを見ます。

  2. ワークフローファイルを開く。 .github/workflows/ を見れば、何を走らせているかは数十秒で分かります。 テストなのか lint だけなのか、複数のバージョンで検証しているかが読めます。

  3. テストディレクトリを見る。 tests/spec/ の中身の量が、実質的な判断材料になります。

  4. Code-Review と合わせて読む。 人の目と機械の目のどちらか一方があれば、まず極端な事故は起きにくくなります。 両方が 0 のプロジェクトを重要な用途に使う場合は、 あなたの側でバージョンを固定し、更新時に自分で検証する前提を置いてください。

メンテナーなら何を改善できるか

GitHub Actions のワークフローを1つ置き、Pull Request で走るようにします。

name: CI

on:
  push:
    branches: [main]
  pull_request:

permissions:
  contents: read      # → Token-Permissions

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        version: ['8.3', '8.4', '8.5']   # サポートする範囲で回す
    steps:
      - uses: actions/checkout@v4
      - run: composer install --no-interaction
      - run: vendor/bin/phpunit

あわせてやると効果が大きいこと。

  • Branch-Protection で CI の成功を必須にする。 走っているだけで、落ちてもマージできる状態だと意味が半減します。
  • 失敗を放置しない。 赤いまま何週間も置かれた CI は、誰も見なくなります。
  • 1人プロジェクトでも Pull Request を通す。 レビューにはなりませんが、CI が必ず走る経路になります。

あわせて読む