CI/CD パイプライン

このページでは、ReScript IntelliJ Plugin の CI/CD インフラストラクチャについて説明します。

概要

本プロジェクトでは GitHub Actions を使用し、3つのワークフローを運用しています:

ワークフロー

ファイル

トリガー

目的

CI

ci.yml

main への Push/PR

ビルド、テスト、Lint、検証

Release

release.yml

タグ v*.*.*

GitHub Release の作成

Docs

docs.yml

main への Push/PR(sphinx-docs の変更時)

ドキュメントのビルドとデプロイ

さらに、Dependabot が設定されており、Gradle および GitHub Actions の依存関係を毎週自動更新します。

CI ワークフロー (ci.yml)

メインの CI パイプラインは、main への全てのプッシュと main をターゲットとするプルリクエストで実行されます。

ジョブ

1. actionlint

reviewdog を使用して GitHub Actions ワークフローの構文を検証します。エラーがある場合は失敗します。

2. build

主要なビルドおよびテストジョブ:

Checkout → Validate Gradle Wrapper → Setup JDK 21 → Setup Gradle (with caching)
    → ktlint check → Build plugin → Run tests with coverage
    → Coverage report on PR → Verify plugin structure → Upload artifacts

ステップ:

ステップ

コマンド

目的

ktlint

./gradlew ktlintCheck

Kotlin コードスタイルの適用

ビルド

./gradlew buildPlugin

コンパイル、レクサー生成、プラグインパッケージング

テスト

./gradlew test koverXmlReport koverHtmlReport

テスト実行とカバレッジレポートの生成

検証

./gradlew verifyPluginStructure

プラグインディスクリプタと JAR 構造の確認

設定の検証

./gradlew verifyPluginProjectConfiguration

プロジェクト設定の検証

アップロードされるアーティファクト:

  • plugin-zip — プラグイン配布用 ZIP

  • test-results — JUnit テストレポート

  • coverage-report — Kover HTML カバレッジレポート

PR 固有の機能:

  • コードカバレッジが kover-report を通じて PR コメントとして報告されます

  • Gradle キャッシュは PR では読み取り専用です(main へのプッシュ時のみ書き込み可能)

3. verify (push only)

IntelliJ Plugin Verifier を使用したバイナリ互換性の検証として ./gradlew verifyPlugin を実行します。推奨 IDE バージョンに対してプラグインをチェックし、API の非互換性を検出します。

Release ワークフロー (release.yml)

v*.*.* に一致する git タグがプッシュされたときにトリガーされます。

リリースフロー

  1. タグからバージョンを抽出(例: v1.2.31.2.3

  2. Gradle Wrapper の検証

  3. リリース前チェックの実行: ktlintCheck test verifyPluginStructure verifyPlugin

  4. プラグインのビルド

  5. 自動生成されたリリースノートで GitHub Release を作成

  6. プラグイン ZIP をリリースアセットとして添付

  7. プレリリースの検出: - を含むタグ(例: v1.0.0-beta.1)はプレリリースとしてマークされます

リリースの作成

# Tag a release
git tag v1.0.0
git push origin v1.0.0

# Tag a pre-release
git tag v1.0.0-beta.1
git push origin v1.0.0-beta.1

注釈

JetBrains Marketplace への公開はまだ自動化されていません。release.yml 内の TODO を参照してください。

Documentation ワークフロー (docs.yml)

sphinx-docs/ 内のファイルが変更された場合に main への push/PR でトリガーされます。手動ディスパッチにも対応しています。

ジョブ

1. lint-and-test

Sphinx ドキュメントソースに対して品質チェックを実行します:

チェック

コマンド

目的

Ruff lint

uv run ruff check .

Python リンティング

Ruff format

uv run ruff format --check .

Python フォーマッティング

Mypy

uv run mypy _ext/generate_rescript_lexer.py

型チェック

Pytest

uv run pytest

カスタムエクステンションのテスト

2. build

Sphinx でドキュメントサイト(英語 + 日本語)をビルドします:

  • make build-all を実行し、両言語バージョンをビルドして Pagefind 検索を統合したサイトを構成します

  • PR 時: リンクチェック (make linkcheck) を実行し、結果を Job Summary に報告します

  • プッシュ時: ビルドされたサイトを GitHub Pages アーティファクトとしてアップロードします

3. deploy (push only)

actions/deploy-pages@v4 を使用して、ビルドされたサイトを GitHub Pages にデプロイします。

ローカルでの CI 再現

CI で実行されるチェックと同じものをローカルで実行できます:

# Full CI check (matches the build job)
./gradlew ktlintCheck buildPlugin test koverXmlReport koverHtmlReport verifyPluginStructure verifyPluginProjectConfiguration

# Quick check (build + test only)
./gradlew buildPlugin test

# Individual checks
./gradlew ktlintCheck          # Code style
./gradlew test                 # Unit & integration tests
./gradlew koverHtmlReport      # Coverage report (open build/reports/kover/html/index.html)
./gradlew verifyPlugin         # Binary compatibility (slow, runs on push only)

# Documentation checks (from sphinx-docs/ directory)
cd sphinx-docs
uv sync
make check                     # lint + typecheck + test
make html                      # Build English docs
make build-all                 # Build full site (EN + JA)
make serve                     # Serve locally at http://localhost:8000

トラブルシューティング

ビルドの失敗

"Could not resolve all files for configuration"

Gradle の依存関係解決に失敗しています。./gradlew --refresh-dependencies buildPlugin を実行して強制的に再ダウンロードしてください。

JFlex レクサー生成の失敗

generateRescriptLexer タスクはコンパイル前に自動実行されます。失敗した場合は、src/main/java/com/rescript/plugin/lang/Rescript.flex に構文エラーがないか確認してください。./gradlew generateRescriptLexer を単独で実行すると詳細なエラーを確認できます。

ktlint チェックの失敗

./gradlew ktlintFormat を実行してほとんどの問題を自動修正し、変更をコミットしてください。

テストの失敗

ローカルでは成功するが CI で失敗するテスト

CI はヘッドレス JDK を搭載した Ubuntu で実行されます。UI コンポーネント (Swing) に依存するテストは異なる動作をする可能性があります。IDE 統合テストには BasePlatformTestCase を使用し、直接的な UI 操作は避けてください。

"No display available" エラー

Gradle の runIde タスクはディスプレイを必要とします。CI では自動的に処理されますが、ローカルでのヘッドレステストでは DISPLAY 環境変数の設定または Xvfb の起動が必要になる場合があります。

カバレッジ

カバレッジレポートが空になる

./gradlew test の出力を確認して、テストが実際に実行されていることを確認してください。Kover レポートはテストが実行された場合にのみ生成されます。

PR にカバレッジが表示されない

kover-report アクションは build/reports/kover/report.xml の XML レポートを必要とします。テスト実行後にこのファイルが存在することを確認してください。

ドキュメント

Sphinx ビルドの失敗

sphinx-docs/ ディレクトリで uv sync を実行して依存関係をインストールしてください。Python 3.12 以上が利用可能であることを確認してください。

PR でのリンクチェック失敗

リンクチェックは非ブロッキングです(continue-on-error: true)。Job Summary で壊れたリンクを確認し、プロジェクトページへのリンクであれば修正してください。

シークレット

以下の GitHub リポジトリシークレットが使用されています:

シークレット

ワークフロー

目的

JETBRAINS_MARKETPLACE_TOKEN

Release (TODO)

プラグインの公開(未設定)

Dependabot

Dependabot は .github/dependabot.yml で設定されています:

  • Gradle 依存関係: 毎週月曜日に更新、最大5件の同時 PR

  • GitHub Actions: 毎週月曜日に更新、最大5件の同時 PR

  • 全ての更新 PR には dependencies ラベルが付与されます