CI/CD パイプライン¶
このページでは、ReScript IntelliJ Plugin の CI/CD インフラストラクチャについて説明します。
概要¶
本プロジェクトでは GitHub Actions を使用し、3つのワークフローを運用しています:
ワークフロー |
ファイル |
トリガー |
目的 |
|---|---|---|---|
CI |
|
|
ビルド、テスト、Lint、検証 |
Release |
|
タグ |
GitHub Release の作成 |
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 |
|
Kotlin コードスタイルの適用 |
ビルド |
|
コンパイル、レクサー生成、プラグインパッケージング |
テスト |
|
テスト実行とカバレッジレポートの生成 |
検証 |
|
プラグインディスクリプタと JAR 構造の確認 |
設定の検証 |
|
プロジェクト設定の検証 |
アップロードされるアーティファクト:
plugin-zip— プラグイン配布用 ZIPtest-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 タグがプッシュされたときにトリガーされます。
リリースフロー¶
タグからバージョンを抽出(例:
v1.2.3→1.2.3)Gradle Wrapper の検証
リリース前チェックの実行:
ktlintCheck test verifyPluginStructure verifyPluginプラグインのビルド
自動生成されたリリースノートで GitHub Release を作成
プラグイン ZIP をリリースアセットとして添付
プレリリースの検出:
-を含むタグ(例: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 |
|
Python リンティング |
Ruff format |
|
Python フォーマッティング |
Mypy |
|
型チェック |
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 リポジトリシークレットが使用されています:
シークレット |
ワークフロー |
目的 |
|---|---|---|
|
Release (TODO) |
プラグインの公開(未設定) |
Dependabot¶
Dependabot は .github/dependabot.yml で設定されています:
Gradle 依存関係: 毎週月曜日に更新、最大5件の同時 PR
GitHub Actions: 毎週月曜日に更新、最大5件の同時 PR
全ての更新 PR には
dependenciesラベルが付与されます