Skip to content

fix(ci): GitHub で回っていなかったユニットテストを回し、ローカルと経路を揃える - #1910

Closed
mhaya wants to merge 3 commits into
develop_v2.0.5from
fix/unittest202609
Closed

fix(ci): GitHub で回っていなかったユニットテストを回し、ローカルと経路を揃える#1910
mhaya wants to merge 3 commits into
develop_v2.0.5from
fix/unittest202609

Conversation

@mhaya

@mhaya mhaya commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

GitHub 上で一度も実行されていないユニットテストが 390本 あった。いずれもテストコード側は健全で、CI の設定に載っていないだけだった。テストコードは変更していない。

1. unit-tests.yml のマトリクスから漏れていた3モジュール(283本)

modules/ には49ディレクトリあるが、マトリクスは44しか列挙していなかった。差分5つのうち resources / cookiecutter-weko-module はモジュールではないが、残る3つは tox.initests/ を持つ実モジュールで、単に列挙漏れだった。

モジュール 結果
weko-notifications 39 passed, 1 skipped
weko-signposting 5 passed
weko-workspace 239 passed

3モジュールとも CI と同じ経路scripts/ci/run-module-tests.sh 経由の tox)でローカル実行して確認済み。いずれも c1: commands succeededrequirements-weko-modules.txt には最初から入っているので、イメージ側の変更は不要。

コメントの「45個のマトリクス」も実数(47)に修正した。

2. api-inventory のツールテスト(107本)

api-inventory-tests.ymltools/api-inventory/ci/ に置いたまま .github/workflows/ に配置していなかったため、一度も動いていなかった。配置する。Docker も Secret も台帳も要らず数秒で終わる。

あわせて pushpull_request のパス指定を YAML アンカーで共有した。別々に書くと片方だけ古びて「PR では回るが push では回らない」という説明のつかない差になるため。ci/README.md の設置手順にも2本目を追記した(.github/workflows/ が実体、ci/ 配下が原本という関係を明記)。

確認の際に踏んだ落とし穴

ローカルで既存イメージを流用して回すと、イメージに焼き付いた古い egg-info の entry_pointweko_theme.bundles:js_preview_widget など。現行の setup.py には無い)を invenio_assets が読みにいって 191件が ImportError になる。CI は ci-images.yml がブランチからイメージを作り直すので発生しない。ローカルで再現するときは全モジュールに python setup.py egg_info を掛けてから回すこと。

レビュー時の確認点

  • unit-tests.yml のジョブが 44 → 47 に増え、追加3モジュールが緑になること
  • API Inventory Tests ワークフローが起動し、107本が緑になること

🤖 Generated with Claude Code

https://claude.ai/code/session_01UFWPMjL6mrvQ2NHBvNgviy

Summary by Sourcery

Ensure all testable modules and API Inventory tooling run reliably in CI while providing a matching, validated local test workflow.

New Features:

  • Add API Inventory unit-test and smoke-test coverage to GitHub Actions.
  • Add local test execution that follows the same module matrix and service flow as CI.

Bug Fixes:

  • Run unit tests for weko-notifications, weko-signposting, and weko-workspace, which were missing from the CI matrix.
  • Prevent test-matrix omissions from silently leaving testable modules untested.

Enhancements:

  • Add matrix validation to detect missing testable modules and warn about stale matrix entries.
  • Align local testing guidance and execution with the CI path, including safeguards against stale images, port conflicts, and environment-specific Elasticsearch startup failures.

CI:

  • Add the API Inventory Tests workflow with synchronized push and pull-request path filters.
  • Expand the unit-test matrix from 44 to 47 modules and add a matrix-check job.

Documentation:

  • Update testing and contributor guidance to document the CI-equivalent local workflow, API Inventory tests, matrix validation, and Flask/Invenio-appropriate practices.

Tests:

  • Enable execution of 107 API Inventory unit tests and add a static route-detection smoke check.

ローカルと CI の経路を揃える(06a072d15, 7ecb5521d

上記の作業中、テストは正常なのに落ちる事象を2件踏んだ。ローカルと CI で回し方が違うことが原因で、実装にもテストにも問題は無かった。

  • 手元の無関係な weko-web イメージを流用 → イメージに焼き付いた古い egg-info の entry_point(weko_theme.bundles:js_preview_widget)を invenio_assets が読みにいって 191件が ImportError
  • invenio の venv で直接 pytestpytest-mock / mock が無く fixture 'mocker' not found

README-TEST.md が案内していたのも CI とは別経路(Python 3.5 + venv + run-tests.sh)だった。

scripts/ci/run-local.sh

CI の Unit Tests ジョブと同じ部品をそのまま呼ぶ(compose オーバレイ / wait-for-services.sh / run-module-tests.sh = tox / マトリクス)。イメージは CI と同じ入力(modules/*/setup.py 含む)のハッシュでタグ付けし、無ければビルドするので、古い egg-info を使い回す事故が起きない。

起動前後に、実際に踏んだ2つの罠の事前確認を入れた(どちらも発動を実機確認済み)。

  • 別の WEKO スタックとのポート衝突(29201 / 26301 / 24301)
  • invenio_assets.bundles の entry_point が壊れていないか(= egg-info が古い)

scripts/ci/matrix.sh — 再発防止

マトリクスを唯一の正として読み、食い違いを検出する。matrix-check ジョブとして CI に組み込み済み。

  • テストがあるのに未登録 → 失敗(ジョブが立たない = 赤くもならない静かな漏れ。今回の3モジュール283本がこれ)
  • 登録されているがテストが無い → 警告。現状 weko-redis が該当(tox.ini の c1 が --cov=weko_rediss tests を指すが tests/ が無く、CI で常に失敗している)

CPU アーキ

AMD / ARM で分岐しない。 ES 6.8 の bootstrap check が落ちる条件は ARM 固有ではなく(vm.max_map_count < 262144 は AMD でも起こる)、分岐しても解決しないため、scripts/ci/compose.local.yml を常に重ねて discovery.type=single-node にする。CI はこのオーバレイを読まない。

AGENTS.md

テスト節が python manage.py testDjango のコマンド。本プロジェクトは Flask/Invenio)を案内していたので書き換え、隣接する「Django のバリデーション機構」も実態に修正した。

検証の範囲

  • aarch64 実機: run-local.sh weko-signposting を通しで実行し 5 passed / exit=0
  • x86_64: 実機が手元に無く未検証(エミュレーションは qemu 側の制約で判断材料にならないため実施していない)

レビュー時の確認点

  • unit-tests.yml のジョブが 44 → 47 に増え、追加3モジュールが緑になること
  • matrix-checkAPI Inventory Tests が緑になること

mhaya and others added 3 commits September 2, 2026 21:24
develop_v2.0.5 には、テスト一式を持ちながら GitHub 上で一度も実行されていない
テストが 390 本あった。いずれも**テストコード側は健全**で、CI の設定に載って
いないだけだった。

## 1. unit-tests.yml のマトリクスから漏れていた3モジュール (283本)

modules/ には49ディレクトリあるが、マトリクスは44しか列挙していなかった。
差分5つのうち resources / cookiecutter-weko-module はモジュールではないが、
残る3つは tox.ini と tests/ を持つ実モジュールで、単に列挙漏れだった。

  weko-notifications    39 passed, 1 skipped
  weko-signposting       5 passed
  weko-workspace       239 passed

3モジュールとも CI と同じ経路(scripts/ci/run-module-tests.sh 経由の tox)で
実行して確認済み。いずれも `c1: commands succeeded`。
requirements-weko-modules.txt には最初から入っているので、イメージ側の
変更は要らない。テストコードにも手を入れていない。

コメントの「45個のマトリクス」も実数(47)に直した。

## 2. api-inventory のツールテスト (107本)

api-inventory-tests.yml を tools/api-inventory/ci/ に置いたまま
.github/workflows/ に配置していなかったため、一度も動いていなかった。配置する。
Docker も Secret も台帳も要らず、数秒で終わる。

あわせて push と pull_request のパス指定を YAML アンカーで共有した。
別々に書くと片方だけ古びて「PR では回るが push では回らない」という
説明のつかない差になるため。ci/README.md の設置手順にも2本目を追記した
(.github/workflows/ が実体で ci/ 配下は原本、という関係を明記)。

## 確認の際に踏んだ落とし穴(記録)

ローカルで既存イメージを流用して回すと、イメージに焼き付いた古い egg-info の
entry_point (weko_theme.bundles:js_preview_widget など。現行の setup.py には無い)
を invenio_assets が読みにいって 191件が ImportError になる。CI は
ci-images.yml がブランチからイメージを作り直すので発生しない。ローカルで
再現するときは全モジュールに `python setup.py egg_info` を掛けてから回すこと。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UFWPMjL6mrvQ2NHBvNgviy
ローカルと CI で違う回し方をすると、どちらかでしか出ない失敗が生まれ、結果を
突き合わせられなくなる。実際、直前の作業で**テストは正常なのに落ちる**事象を
2件踏んだ。

  - 手元にあった無関係な weko-web イメージを流用したところ、イメージに焼き付いた
    古い egg-info の entry_point (weko_theme.bundles:js_preview_widget。現行の
    setup.py には無い) を invenio_assets が読みにいって 191件が ImportError。
    CI は ci-images.yml が modules/*/setup.py を含むハッシュでタグを決めるので
    起きない。
  - invenio の venv で直接 pytest を叩いたところ pytest-mock / mock が無く
    「fixture 'mocker' not found」。CI は tox が requirements2.txt から入れる。

どちらも原因の切り分けに時間を取られただけで、実装にもテストにも問題は無かった。

README-TEST.md が案内していたのも CI とは別経路(Python 3.5 + venv + run-tests.sh)
で、Python も依存も tox の有無も違う。ここで通っても CI で通る保証がない。

## scripts/ci/run-local.sh

CI の Unit Tests ジョブと**同じ部品をそのまま呼ぶ**。分岐させないことが要点。

  compose          docker-compose2.yml:docker-compose.ci.yml   (CI と同一)
  起動サービス      postgresql / elasticsearch / redis / rabbitmq のみ (同一)
  起動待ち          scripts/ci/wait-for-services.sh            (同一)
  テスト実行        scripts/ci/run-module-tests.sh (= tox)      (同一)
  モジュール一覧    .github/workflows/unit-tests.yml の matrix  (同一)

イメージは CI と同じ入力ファイル集合(modules/*/setup.py を含む)のハッシュで
タグ付けし、無ければビルドする。GHCR から引けない代わりに、setup.py が変われば
必ず作り直されるので、古い egg-info を使い回す事故が起きない。
CI と完全に同一のイメージで確かめたいときは WEKO_IMAGE で明示する。

起動前後に2つの事前確認を入れた。どちらも今回実際に踏んだもの:
  - 別の WEKO スタックが 29201/26301/24301 を掴んでいないか
  - invenio_assets.bundles の entry_point が壊れていないか(= egg-info が古い)

## scripts/ci/matrix.sh

モジュール一覧が「ワークフローの中」と「手順書」に二重に書かれると必ず片方が
古びる。マトリクスを唯一の正として読み、食い違いを検出する。

  tests/ と tox.ini があるのにマトリクスに無い → 失敗
    ジョブが立たない = 赤くもならない静かな漏れ。v2.0.5 まで3モジュール283本が
    この状態だった。unit-tests.yml に matrix-check ジョブとして組み込む。
  マトリクスにあるが tests/ か tox.ini が無い → 警告
    ジョブは立って赤くなるので見えている。消すか足すかは人の判断。
    現状 weko-redis が該当(tox.ini の c1 が `--cov=weko_rediss tests` を指すが
    tests/ が無く、CI でも常に失敗している)。

## 残る差: ホストのアーキテクチャ

CI は x86_64。ARM では ES 6.8 の seccomp が x86_64 専用のため bootstrap check に
失敗する。ホストが x86_64 でないときだけ scripts/ci/compose.arm64.yml を重ねて
discovery.type=single-node にし、その旨を表示する。テストの内容には影響しない。
Dockerfile.arm64 は nodesource の setup_4.x が消えており現在ビルドできないので
使わない(標準の Dockerfile は aarch64 でもビルドできる)。

aarch64 のこのホストで scripts/ci/run-local.sh weko-signposting を通しで実行し、
イメージのビルドから 5 passed / congratulations まで確認済み。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UFWPMjL6mrvQ2NHBvNgviy
前のコミットは aarch64 のときだけ Elasticsearch の設定を変えていた。これだと
開発機が AMD か ARM かで手元の条件が変わり、「片方の CPU でしか再現しない失敗」を
自分で作ることになる。ローカルと CI を揃えるという目的に反する。

分岐をやめ、scripts/ci/compose.local.yml を**常に**重ねる形にした
(compose.arm64.yml から改名)。調整点は install.sh と同じく COMPOSE_FILE ひとつ。

ES 6.8 は非ループバックアドレスに bind した時点で bootstrap check を強制するが、
これはホストのカーネルと sysctl に依存するので、開発機では環境しだいで落ちる。
確認できたものだけでも:

  - ARM: seccomp の実装が x86_64 専用で
    「seccomp unavailable: CONFIG_SECCOMP not compiled into kernel」で失敗する
  - vm.max_map_count が 262144 未満のホスト: max_map_count の検査で失敗する

後者は AMD でも起こる。アーキで分岐しても解決しない類の問題なので、
discovery.type=single-node で bootstrap check ごと省く。ES はテストが使う単一
ノードなので意味は変わらない(リポジトリの docker-compose.arm64.yml と同じ扱い)。
CI はこのオーバレイを読まないため、CI 側は素の設定のまま。

Dockerfile は両アーキとも CI と同じものを使う(標準の Dockerfile /
elasticsearch/Dockerfile は aarch64 でもビルドできる)。

aarch64 の実機で scripts/ci/run-local.sh weko-signposting を通しで実行し、
5 passed / congratulations / exit=0 を確認。x86_64 の実機は手元に無いため未検証。

## AGENTS.md

- テスト節が `python manage.py test` (Django のコマンド) を案内していた。
  本プロジェクトは Flask/Invenio なので、run-local.sh / matrix.sh /
  api-inventory のテストに書き換えた。
- 同じくセキュリティ節の「Django のバリデーション機構」を実態
  (Flask-WTF / marshmallow / JSON Schema) に直した。
- ベースラインに既存の失敗が残っている旨を明記した。「赤い = 自分のせい」と
  取り違えると、無い原因を探すことになるため。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UFWPMjL6mrvQ2NHBvNgviy
@coderabbitai

coderabbitai Bot commented Sep 3, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Team

Run ID: 515a0cd6-f27e-48c4-a9e2-f7268fd70266

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Comment @coderabbitai help to get the list of available commands.

@sourcery-ai

sourcery-ai Bot commented Sep 3, 2026

Copy link
Copy Markdown

Reviewer's Guide

GitHub Actions が従来未実行だった390件のユニットテスト(3モジュール283件と api-inventory 107件)を実行するようにし、マトリクス漏れの自動検出と、CI と同じ経路で安全にローカルテストを実行する仕組みおよび関連ドキュメントを追加した。

Sequence diagram for CI module unit tests

sequenceDiagram
  participant Actions as GitHub Actions
  participant Matrix as unit-tests.yml matrix
  participant Services as Docker Compose services
  participant Wait as wait-for-services.sh
  participant Runner as run-module-tests.sh
  participant Tox as tox

  Actions->>Matrix: Select module
  Actions->>Services: Start test services
  Actions->>Wait: Wait for services
  Wait-->>Actions: Services ready
  Actions->>Runner: Run module tests
  Runner->>Tox: Execute tox
  Tox-->>Actions: Test result
Loading

Sequence diagram for CI-aligned local module testing

sequenceDiagram
  participant User
  participant Local as run-local.sh
  participant Image as Local test images
  participant Compose as Docker Compose
  participant Wait as wait-for-services.sh
  participant Runner as run-module-tests.sh
  participant Tox as tox

  User->>Local: Run module test command
  Local->>Image: Build or reuse hash-tagged images
  Local->>Compose: Start PostgreSQL, Elasticsearch, Redis, RabbitMQ
  Local->>Wait: Wait for services
  Wait-->>Local: Services ready
  Local->>Compose: Validate entry points
  Local->>Runner: Run selected module
  Runner->>Tox: Execute tox
  Tox-->>User: Test result
Loading

Flow diagram for matrix coverage validation

flowchart TD
  Start[Run matrix.sh check] --> Matrix[Read unit-tests.yml matrix]
  Matrix --> Modules[Find modules with tests/ and tox.ini]
  Modules --> Compare[Compare module lists]
  Compare --> Missing{Unregistered test module?}
  Missing -->|Yes| Fail[Fail matrix-check]
  Missing -->|No| Stale{Registered module lacks tests?}
  Stale -->|Yes| Warn[Warn about stale entry]
  Stale -->|No| Pass[Coverage check passes]
  Warn --> Pass
Loading

File-Level Changes

Change Details Files
GitHub Actions のユニットテスト対象を拡張し、未実行だった実モジュールのテストをマトリクスに追加した。
  • マトリクスを44件から47件に拡張し、3モジュールを追加
  • テスト対象モジュールとマトリクスの不一致を検出する matrix-check ジョブを追加
.github/workflows/unit-tests.yml
scripts/ci/matrix.sh
api-inventory の単体テストを GitHub Actions で実行するワークフローとして有効化した。
  • pytest による107件のツールテストを実行
  • 静的経路検知の検出件数を確認するスモークチェックを追加
  • push と pull_request のパスフィルタを YAML アンカーで共有
  • 原本ワークフローの配置手順を文書化
.github/workflows/api-inventory-tests.yml
tools/api-inventory/ci/api-inventory-tests.yml
tools/api-inventory/ci/README.md
ローカルテストを CI と同じ compose・待機・tox 実行経路に統一し、環境依存の誤検出を事前に防止した。
  • CI のマトリクスから対象を選び、必要なイメージを入力ファイルのハッシュでビルドまたは再利用
  • サービス起動、待機、entry_point 健全性、ポート衝突を検証
  • ローカル専用の Elasticsearch single-node オーバレイを追加し、CPU アーキテクチャによる分岐を避けた
scripts/ci/run-local.sh
scripts/ci/compose.local.yml
新しい CI 検証手順と既知のローカル実行上の落とし穴をドキュメント化した。
  • 推奨する CI 準拠のローカルテスト手順を追加
  • 古い egg-info、依存不足、ポート衝突、Elasticsearch bootstrap check の注意点を記載
  • Flask/Invenio に合わせてテストおよび入力検証の案内を修正
README-TEST.md
AGENTS.md

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

CI未実行テストの有効化とローカル実行経路の統一

🐞 Bug fix 🧪 Tests ✨ Enhancement 📝 Documentation ⚙️ Configuration changes 🕐 20-40 Minutes

Grey Divider

AI Description

• 未登録だった3モジュールとAPI台帳ツールの390テストをCI対象へ追加。
• マトリクス検証でテスト対象モジュールの登録漏れを自動検出。
• ローカルテストをCIと同じサービス構成・tox経路へ統一。
Diagram

graph TD
  M["Unit Matrix"] --> V["Matrix Check"] --> D["Testable Modules"]
  M --> C["CI Module Jobs"] --> R["Test Runner"] --> S["Service Stack"]
  M --> L["Local Runner"] --> R
  A["API Workflow"] --> T["Inventory Tests"]
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. テスト対象から動的マトリクスを生成
  • ➕ testsとtox.iniから対象を自動導出でき、手動列挙漏れが発生しない
  • ➕ 新規モジュール追加時にワークフロー編集が不要
  • ➖ GitHub Actionsで事前生成ジョブとJSON受け渡しが必要になり構成が複雑化する
  • ➖ 意図的に除外するモジュールの管理とレビュー時の対象可視性が低下する
2. ローカル専用テスト構成を維持
  • ➕ 開発環境向けに起動時間やリソース使用量をさらに最適化できる
  • ➕ CI用イメージのビルドを避けやすい
  • ➖ 依存関係や実行経路の差で再現性が失われる
  • ➖ ローカル成功とCI失敗の切り分けコストが増える

Recommendation: 明示的なマトリクスを唯一の正として維持し、matrix-checkで実ファイル構成との不一致を検出する現在の方式を推奨する。対象がレビュー上明確で、動的マトリクスよりGitHub Actions構成が単純な一方、今回のような静かな登録漏れも防止できる。ローカル実行も同じランナーへ集約する方針が再現性を最も高める。

Files changed (9) +564 / -13

Enhancement (1) +221 / -0
run-local.shCI経路を再利用するローカルテストランナーを追加 +221/-0

CI経路を再利用するローカルテストランナーを追加

• マトリクスから対象を取得し、CIと同じComposeサービス、待機処理、run-module-tests.shで単一または全モジュールを実行するスクリプトを追加した。入力ハッシュによるイメージ管理、ポート競合検出、古いentry pointの事前検査、後片付けも実装する。

scripts/ci/run-local.sh

Bug fix (1) +22 / -2
unit-tests.yml未登録モジュールを追加してマトリクス漏れを検査 +22/-2

未登録モジュールを追加してマトリクス漏れを検査

• weko-notifications、weko-signposting、weko-workspaceをテストマトリクスへ追加した。テスト可能な全モジュールとの不一致を検出するmatrix-checkジョブも追加し、対象数のコメントを47へ修正した。

.github/workflows/unit-tests.yml

Tests (1) +59 / -0
api-inventory-tests.ymlAPI台帳ツールのテストワークフローを有効化 +59/-0

API台帳ツールのテストワークフローを有効化

• API台帳ツールのpytestと静的経路検出スモークチェックをGitHub Actionsへ追加した。pushとpull_requestで共通のパスフィルターを使用し、対象変更時だけ実行する。

.github/workflows/api-inventory-tests.yml

Documentation (3) +143 / -8
AGENTS.mdCI相当のテスト手順と開発ガイドを明文化 +53/-7

CI相当のテスト手順と開発ガイドを明文化

• run-local.shを使うローカルテスト手順、API台帳テスト、マトリクス検証方法を追加した。セキュリティ指針を実際のFlask系技術へ修正し、PR前チェックも共通テスト経路に合わせた。

AGENTS.md

README-TEST.mdCI互換ローカルテスト手順を追加 +86/-0

CI互換ローカルテスト手順を追加

• CIとローカルで共有するCompose構成、サービス待機、tox実行、モジュール一覧を説明した。古いegg-info、依存不足、ポート競合、Elasticsearch bootstrap checkなどの再現性を損なう要因と回避策も記載した。

README-TEST.md

README.mdAPI台帳ワークフローの配置手順を補足 +4/-1

API台帳ワークフローの配置手順を補足

• 台帳ツールのテスト用とdrift検査用の両ワークフローを.github/workflowsへ配置する手順を記載した。ci配下が原本で、GitHub Actions側が実体である関係も明文化した。

tools/api-inventory/ci/README.md

Other (3) +119 / -3
compose.local.ymlローカル向けElasticsearch単一ノード設定を追加 +28/-0

ローカル向けElasticsearch単一ノード設定を追加

• 開発ホストのseccompやvm.max_map_countに依存するbootstrap checkを回避するため、Elasticsearchをsingle-nodeで起動するComposeオーバーレイを追加した。CIでは使用せず、ローカル実行時のみ適用する。

scripts/ci/compose.local.yml

matrix.shユニットテストマトリクスの列挙・検証ツールを追加 +86/-0

ユニットテストマトリクスの列挙・検証ツールを追加

• unit-tests.ymlからモジュール一覧を抽出するlist操作と、testsおよびtox.iniを持つ実モジュールとの差分を調べるcheck操作を追加した。未登録モジュールは失敗、古い登録は警告として扱う。

scripts/ci/matrix.sh

api-inventory-tests.ymlAPI台帳ワークフローのパス条件を共通化 +5/-3

API台帳ワークフローのパス条件を共通化

• pushとpull_requestのパスフィルターをYAMLアンカーで共有し、イベント間の設定ずれを防止した。対象範囲と共通化の理由をコメントで補足した。

tools/api-inventory/ci/api-inventory-tests.yml

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've reviewed your changes and they look great!

Sourcery assessment

Needs a human reviewer. この変更はCIのテスト経路、対象モジュール、静的検知器の合否条件を追加・変更するため、誤っていればテスト漏れを緑のまま通したり、逆にマージを継続的に阻害したりします。ワークフローを戻せば将来のCI挙動は元に戻せますが、その間に誤ったテスト結果を信頼してマージされたコードの修正は再実行だけでは取り消せません。.


Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (4) 📘 Rule violations (2) 📜 Skill insights (0)

Grey Divider


Action required

1. ARM Elasticsearch build fails 🐞 Bug ≡ Correctness
Description
run-local.sh always builds elasticsearch/Dockerfile, whose Elasticsearch 6.8.23 base image is
amd64-only, despite explicitly claiming native aarch64 support. On an ARM Docker host, image
resolution fails before any tests run unless amd64 emulation is separately configured.
Code

scripts/ci/run-local.sh[R101-102]

+DOCKERFILE_WEB=Dockerfile
+DOCKERFILE_ES=elasticsearch/Dockerfile
Evidence
The local runner unconditionally selects the standard Elasticsearch Dockerfile while documenting
aarch64 support. That Dockerfile is based on Elasticsearch 6.8.23, and Elastic's registry lists that
tag only for amd64; the repository's ARM-specific Dockerfile instead builds Elasticsearch from an
ARM OpenJDK base.

scripts/ci/run-local.sh[97-107]
elasticsearch/Dockerfile[21-37]
elasticsearch/Dockerfile.arm64[21-60]
🌐 Elastic's registry lists Elasticsearch 6.8.23 with architecture amd64.

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The local test runner selects an amd64-only Elasticsearch 6.8.23 image on ARM hosts, preventing the documented ARM workflow from building.

## Issue Context
The standard Elasticsearch Dockerfile uses `docker.elastic.co/elasticsearch/elasticsearch:6.8.23`, whose published architecture is amd64. The repository already contains a separate ARM Elasticsearch Dockerfile.

## Fix Focus Areas
- scripts/ci/run-local.sh[97-107]
- elasticsearch/Dockerfile[21-37]
- elasticsearch/Dockerfile.arm64[21-60]
- README-TEST.md[41-68]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

2. matrix.sh lacks tests 📘 Rule violation ▣ Testability
Description
The PR adds matrix parsing and validation logic in matrix.sh without adding or modifying a
corresponding automated test. Parser or set-comparison regressions could silently omit testable
modules or incorrectly fail CI.
Code

scripts/ci/matrix.sh[R22-25]

+  awk '
+    /^[[:space:]]+module:[[:space:]]*$/ { inlist = 1; next }
+    inlist && /^[[:space:]]+- [A-Za-z0-9_-]+[[:space:]]*$/ {
+      gsub(/^[[:space:]]+- |[[:space:]]+$/, ""); print; next
Evidence
PR Compliance ID 3024926 requires tests when non-test files add executable functions or branches.
The cited script introduces an awk parser and validation branches, while the supplied PR diff adds
or modifies no corresponding automated test file.

Rule 3024926: Require tests for new or modified production code
scripts/ci/matrix.sh[19-80]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Add automated tests for the new matrix extraction and validation behavior in `matrix.sh`.

## Issue Context
The script parses workflow YAML and compares its module list with filesystem contents, but this PR includes no corresponding test-file changes. Cover successful listing, missing modules, stale modules, strict mode, and malformed or absent workflow input.

## Fix Focus Areas
- scripts/ci/matrix.sh[19-80]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. run-local.sh lacks tests 📘 Rule violation ▣ Testability
Description
The PR adds a substantial local CI runner with option parsing, validation, image selection, cleanup,
and failure aggregation without corresponding automated tests. Regressions could produce results
that diverge from CI or leave local services running.
Code

scripts/ci/run-local.sh[R60-63]

+while [ $# -gt 0 ]; do
+  case "$1" in
+    --all)     MODULES=(__ALL__) ;;
+    --list)    exec "$ROOT/scripts/ci/matrix.sh" list ;;
Evidence
PR Compliance ID 3024926 requires corresponding tests for newly added executable logic. The cited
file adds multiple user-input branches and operational paths, but the supplied PR diff contains no
added or modified test file covering this runner.

Rule 3024926: Require tests for new or modified production code
scripts/ci/run-local.sh[60-90]
scripts/ci/run-local.sh[129-175]
scripts/ci/run-local.sh[199-220]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Add automated tests for the new `run-local.sh` behavior.

## Issue Context
The runner contains extensive executable logic but this PR includes no corresponding test-file changes. Use mocked or stubbed Docker and helper commands to cover option parsing, matrix validation, image build decisions, cleanup, and aggregated module failures without launching the complete stack.

## Fix Focus Areas
- scripts/ci/run-local.sh[60-90]
- scripts/ci/run-local.sh[129-175]
- scripts/ci/run-local.sh[199-220]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


4. Failed startup leaks services 🐞 Bug ☼ Reliability
Description
The cleanup trap is registered only after docker compose up succeeds, so a partial startup
followed by a nonzero Compose result exits without stopping containers or deleting volumes. Those
leaked resources can block or contaminate later local test runs.
Code

scripts/ci/run-local.sh[R161-162]

+echo "▶ サービス起動 (postgresql / elasticsearch / redis / rabbitmq)"
+docker compose up -d --no-build postgresql elasticsearch redis rabbitmq || exit 1
Evidence
Line 162 exits immediately if service startup fails, while the only cleanup registration occurs at
line 173. The cleanup function is responsible for docker compose down -v; the corresponding CI
workflow deliberately runs its teardown regardless of earlier failures.

scripts/ci/run-local.sh[160-175]
.github/workflows/unit-tests.yml[197-203]
.github/workflows/unit-tests.yml[233-235]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
A partially failed Compose startup exits before the cleanup trap is registered, leaving containers and volumes behind.

## Issue Context
GitHub CI guarantees `docker compose down -v` through an `if: always()` step, but the local equivalent does not install its trap until after startup succeeds.

## Fix Focus Areas
- scripts/ci/run-local.sh[160-175]
- .github/workflows/unit-tests.yml[197-203]
- .github/workflows/unit-tests.yml[233-235]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


View medium (2)
5. Port precheck misses conflicts 🐞 Bug ☼ Reliability
Description
The preflight check omits Elasticsearch port 29301 and RabbitMQ port 45601 even though the selected
services publish both ports. If either is occupied, preflight succeeds and Compose can partially
start the stack before failing on the unvalidated binding.
Code

scripts/ci/run-local.sh[R147-149]

+# docker-compose2.yml は 29201 / 26301 / 24301 を publish する。別の WEKO を
+# 動かしたままだと起動に失敗するか、最悪そちらのサービスを掴む。
+for p in 29201 26301 24301; do
Evidence
The runner checks only 29201, 26301, and 24301. The active Compose configuration additionally binds
Elasticsearch transport port 29301 and RabbitMQ distribution port 45601, so those collisions bypass
the new safeguard.

scripts/ci/run-local.sh[146-158]
docker-compose2.yml[344-364]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The local runner validates only three of the five fixed host ports published by the services it starts.

## Issue Context
Elasticsearch publishes 29201 and 29301, while RabbitMQ publishes 24301 and 45601. Both additional ports can independently cause Compose startup failure.

## Fix Focus Areas
- scripts/ci/run-local.sh[146-158]
- docker-compose2.yml[344-364]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


6. Keep mode prevents reuse 🐞 Bug ≡ Correctness
Description
After a successful --keep run, the next invocation rejects the ports occupied by that same
retained Compose project and exits before it can reuse the services. This contradicts the option's
documented purpose of keeping services available for subsequent runs.
Code

scripts/ci/run-local.sh[R149-152]

+for p in 29201 26301 24301; do
+  if (exec 3<>"/dev/tcp/127.0.0.1/$p") 2>/dev/null; then
+    exec 3<&- 2>/dev/null
+    running=$(docker ps --filter "publish=$p" --format '{{.Names}}' | head -1)
Evidence
The option documentation says --keep leaves services running for continued execution, and cleanup
does exactly that. However, each subsequent invocation unconditionally fails when any retained
Redis, Elasticsearch, or RabbitMQ port accepts a connection, without checking whether the listener
belongs to the current Compose project.

scripts/ci/run-local.sh[44-56]
scripts/ci/run-local.sh[146-173]
docker-compose2.yml[334-364]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The port-conflict guard treats services intentionally retained by `--keep` as an unrelated WEKO stack, preventing subsequent test invocations.

## Issue Context
The usage text explicitly presents `--keep` for continued runs, and cleanup deliberately leaves the current Compose project running. Conflict detection should distinguish containers belonging to the current project from unrelated listeners and reuse or validate the former.

## Fix Focus Areas
- scripts/ci/run-local.sh[44-56]
- scripts/ci/run-local.sh[146-173]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context sources
✅ Compliance rules (platform): 13 rules
✅ Web pages:
  +2 more
Review mode: ⚖️ Balanced: Downgraded extended -> standard: change is below the extended eligibility bar (hunks 14/18, lines 577/200; both must reach the floor). Router rationale: This PR adds substantial new CI workflows and shell orchestration across multiple independent paths, with easy-to-miss YAML, matrix parsing, Docker/Compose, cleanup, and test-execution defects affecting CI coverage.

Grey Divider

Tip of the day
💡 Did you know, you can add REVIEW.md to your repo root and Qodo follows it on every PR

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread scripts/ci/matrix.sh
Comment on lines +22 to +25
awk '
/^[[:space:]]+module:[[:space:]]*$/ { inlist = 1; next }
inlist && /^[[:space:]]+- [A-Za-z0-9_-]+[[:space:]]*$/ {
gsub(/^[[:space:]]+- |[[:space:]]+$/, ""); print; next

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

1. matrix.sh lacks tests 📘 Rule violation ▣ Testability

The PR adds matrix parsing and validation logic in matrix.sh without adding or modifying a
corresponding automated test. Parser or set-comparison regressions could silently omit testable
modules or incorrectly fail CI.
Agent Prompt
## Issue description
Add automated tests for the new matrix extraction and validation behavior in `matrix.sh`.

## Issue Context
The script parses workflow YAML and compares its module list with filesystem contents, but this PR includes no corresponding test-file changes. Cover successful listing, missing modules, stale modules, strict mode, and malformed or absent workflow input.

## Fix Focus Areas
- scripts/ci/matrix.sh[19-80]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread scripts/ci/run-local.sh
Comment on lines +60 to +63
while [ $# -gt 0 ]; do
case "$1" in
--all) MODULES=(__ALL__) ;;
--list) exec "$ROOT/scripts/ci/matrix.sh" list ;;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

2. run-local.sh lacks tests 📘 Rule violation ▣ Testability

The PR adds a substantial local CI runner with option parsing, validation, image selection, cleanup,
and failure aggregation without corresponding automated tests. Regressions could produce results
that diverge from CI or leave local services running.
Agent Prompt
## Issue description
Add automated tests for the new `run-local.sh` behavior.

## Issue Context
The runner contains extensive executable logic but this PR includes no corresponding test-file changes. Use mocked or stubbed Docker and helper commands to cover option parsing, matrix validation, image build decisions, cleanup, and aggregated module failures without launching the complete stack.

## Fix Focus Areas
- scripts/ci/run-local.sh[60-90]
- scripts/ci/run-local.sh[129-175]
- scripts/ci/run-local.sh[199-220]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread scripts/ci/run-local.sh
Comment on lines +101 to +102
DOCKERFILE_WEB=Dockerfile
DOCKERFILE_ES=elasticsearch/Dockerfile

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

3. Arm elasticsearch build fails 🐞 Bug ≡ Correctness

run-local.sh always builds elasticsearch/Dockerfile, whose Elasticsearch 6.8.23 base image is
amd64-only, despite explicitly claiming native aarch64 support. On an ARM Docker host, image
resolution fails before any tests run unless amd64 emulation is separately configured.
Agent Prompt
## Issue description
The local test runner selects an amd64-only Elasticsearch 6.8.23 image on ARM hosts, preventing the documented ARM workflow from building.

## Issue Context
The standard Elasticsearch Dockerfile uses `docker.elastic.co/elasticsearch/elasticsearch:6.8.23`, whose published architecture is amd64. The repository already contains a separate ARM Elasticsearch Dockerfile.

## Fix Focus Areas
- scripts/ci/run-local.sh[97-107]
- elasticsearch/Dockerfile[21-37]
- elasticsearch/Dockerfile.arm64[21-60]
- README-TEST.md[41-68]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread scripts/ci/run-local.sh
Comment on lines +161 to +162
echo "▶ サービス起動 (postgresql / elasticsearch / redis / rabbitmq)"
docker compose up -d --no-build postgresql elasticsearch redis rabbitmq || exit 1

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

4. Failed startup leaks services 🐞 Bug ☼ Reliability

The cleanup trap is registered only after docker compose up succeeds, so a partial startup
followed by a nonzero Compose result exits without stopping containers or deleting volumes. Those
leaked resources can block or contaminate later local test runs.
Agent Prompt
## Issue description
A partially failed Compose startup exits before the cleanup trap is registered, leaving containers and volumes behind.

## Issue Context
GitHub CI guarantees `docker compose down -v` through an `if: always()` step, but the local equivalent does not install its trap until after startup succeeds.

## Fix Focus Areas
- scripts/ci/run-local.sh[160-175]
- .github/workflows/unit-tests.yml[197-203]
- .github/workflows/unit-tests.yml[233-235]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread scripts/ci/run-local.sh
Comment on lines +147 to +149
# docker-compose2.yml は 29201 / 26301 / 24301 を publish する。別の WEKO を
# 動かしたままだと起動に失敗するか、最悪そちらのサービスを掴む。
for p in 29201 26301 24301; do

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

5. Port precheck misses conflicts 🐞 Bug ☼ Reliability

The preflight check omits Elasticsearch port 29301 and RabbitMQ port 45601 even though the selected
services publish both ports. If either is occupied, preflight succeeds and Compose can partially
start the stack before failing on the unvalidated binding.
Agent Prompt
## Issue description
The local runner validates only three of the five fixed host ports published by the services it starts.

## Issue Context
Elasticsearch publishes 29201 and 29301, while RabbitMQ publishes 24301 and 45601. Both additional ports can independently cause Compose startup failure.

## Fix Focus Areas
- scripts/ci/run-local.sh[146-158]
- docker-compose2.yml[344-364]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread scripts/ci/run-local.sh
Comment on lines +149 to +152
for p in 29201 26301 24301; do
if (exec 3<>"/dev/tcp/127.0.0.1/$p") 2>/dev/null; then
exec 3<&- 2>/dev/null
running=$(docker ps --filter "publish=$p" --format '{{.Names}}' | head -1)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

6. Keep mode prevents reuse 🐞 Bug ≡ Correctness

After a successful --keep run, the next invocation rejects the ports occupied by that same
retained Compose project and exits before it can reuse the services. This contradicts the option's
documented purpose of keeping services available for subsequent runs.
Agent Prompt
## Issue description
The port-conflict guard treats services intentionally retained by `--keep` as an unrelated WEKO stack, preventing subsequent test invocations.

## Issue Context
The usage text explicitly presents `--keep` for continued runs, and cleanup deliberately leaves the current Compose project running. Conflict detection should distinguish containers belonging to the current project from unrelated listeners and reuse or validate the former.

## Fix Focus Areas
- scripts/ci/run-local.sh[44-56]
- scripts/ci/run-local.sh[146-173]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@mhaya

mhaya commented Sep 3, 2026

Copy link
Copy Markdown
Contributor Author

ブランチを fix/unittest202609fix/issue62764 に改名したため、この PR は #1911 に引き継ぎます(コミットは同一: 9e32ff8 / 06a072d / 7ecb552)。GitHub は PR の head ブランチを変更できないため、改名のたびに PR を作り直す必要があります。

@mhaya

mhaya commented Sep 3, 2026

Copy link
Copy Markdown
Contributor Author

#1911 に移行のためクローズ

@mhaya mhaya closed this Sep 3, 2026
@mhaya
mhaya deleted the fix/unittest202609 branch September 3, 2026 00:36
@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown

API インベントリ差分(件数のみ)

⚠️ プライベートリポジトリに対応ブランチが無いため、既定ブランチの台帳と比較しています。
ブランチ間の経路差がそのまま差分として出るので、以下の件数は当てになりません。
この PR のブランチと同名のブランチをプライベートリポジトリに作ってください。

明細は公開できないため件数のみ表示しています。該当箇所はプライベートリポジトリ側の台帳・レポートで確認してください。

ベースラインとの差分

API インベントリ差分レポート

  • 旧: e9c5b2b51 v2.0.3-69-ge9c5b2b51 (profile=default) endpoints=928 (外部ライブラリ由来 359)
  • 新: e7f95789a v2.0.4-43-ge7f95789a (profile=default) endpoints=928 (外部ライブラリ由来 359)

判定: ✅ PASS (FAIL 0 / WARN 1)

サマリ

分類 件数
ADDED 0
REMOVED 0
RULE_CHANGED 0
METHODS_CHANGED 0
AUTH_CHANGED 0
IMPL_CHANGED 0
ATTRS_UNKNOWN_NEW 0
ModelView 追加 0
ModelView 削除 0
ModelView フラグ変化 1
config 変化 0
コメントアウト認証の増加 0
依存パッケージの版変化 40

[WARN] W6 依存パッケージの版が変化した — 40件

  • attrs — 22.2.0 -> 17.4.0
  • botocore — 1.12.209 -> 1.12.253
  • cffi — 1.15.1 -> 1.11.2
  • click — 8.0.4 -> 6.7
  • cryptography — 40.0.2 -> 2.1.4
  • pyld — 3.1.0 -> 3.3.0
  • pytest — 7.0.1 -> 4.2.0
  • Docker-Services-CLI — 0.8.0 -> (削除)
  • aws-xray-sdk — 0.95 -> (削除)
  • build — 0.9.0 -> (削除)
  • check-manifest — 0.48 -> (削除)
  • cookies — 2.2.1 -> (削除)
  • coverage — 4.5.4 -> (削除)
  • docker — 5.0.3 -> (削除)
  • ecdsa — 0.19.2 -> (削除)
  • execnet — 1.9.0 -> (削除)
  • iniconfig — 1.1.1 -> (削除)
  • isort — 5.10.1 -> (削除)
  • jsondiff — 1.1.1 -> (削除)
  • jsonpickle — 2.2.0 -> (削除)
  • mock — 3.0.5 -> (削除)
  • moto — 1.3.7 -> (削除)
  • pep517 — 0.13.1 -> (削除)
  • pep8 — 1.7.1 -> (削除)
  • pyaml — 23.5.8 -> (削除)
  • pycryptodome — 3.21.0 -> (削除)
  • pydocstyle — 6.3.0 -> (削除)
  • pytest-cache — 1.0 -> (削除)
  • pytest-cov — 2.10.1 -> (削除)
  • pytest-flask — 0.15.1 -> (削除)
  • pytest-invenio — 1.3.4 -> (削除)
  • pytest-mock — 3.6.1 -> (削除)
  • pytest-pep8 — 1.0.6 -> (削除)
  • python-jose — 2.0.2 -> (削除)
  • responses — 0.10.15 -> (削除)
  • selenium — 3.141.0 -> (削除)
  • tomli — 1.2.3 -> (削除)
  • websocket-client — 1.3.1 -> (削除)
  • weko-redis — 0.1.0.dev20170000 -> (削除)
  • wrapt — 1.16.0 -> (削除)

台帳との突き合わせ

スナップショット ↔ インベントリ 突き合わせ

  • リビジョン: e7f95789a v2.0.4-43-ge7f95789a 経路URI=908
  • 台帳: 行=1048 URI=919

件数のみ。詳細はプライベートリポジトリ側の完全版レポートを参照。

判定: ✅ 一致 (0件)

検出 件数
A. インベントリ未収載(抽出漏れ) 0
B. 実機に無い(未説明) 0
B'. 実機に無い(既知・許容) 11
C. メソッド不一致 0
D. app列の不一致 0
E. endpoint 未収載 0
E'. endpoint が実機に無い(参考) 1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant