IntelliJ Platform PluginのRailroadsについて、新しいバージョン 0.2.0 をGitHub Actionsでpublishしてみた

以前、rails routes を便利に扱う、IntelliJ Platform Plugin の Railroads を作りました。

 
また、プラグインのMarketplaceのページにてNotificationの設定をしていることもあり、時々JetBrainsから [Notification] Verification results for the Railroads plugin という件名のメールが届きます。

これにより、「新しいIDEの新しいバージョンとプラグインの互換性」を把握でき、メンテナンスをするきっかけになります。

 
そんな中、

IntelliJ IDEA Ultimate 2024.2 eap (242.19890.14) 1 missing mandatory dependency. 2 possible compatibility problems, some of which may be caused by absence of dependency in the target IDE 242.19890.14

という内容のメールが届きました。

気になったため、該当のバージョンのIDEへRailroadsプラグインをインストールして動作確認したところ、「該当のバージョンのIDEでは、ToolWindow上のRailroadsアイコンが消えてしまう」と分かりました。

 
今までのRailroadsプラグインでは、アイコン作成の手間を省くためにJetBrains IDEが内部で持っているアイコンを使用していました。

ただ、そのアイコンを使うためのAPIが内部APIだったっぽく、該当のバージョンで内部APIに何らかが発生した結果、アイコンが消えたようでした。

 
そこで、「いつかはアイコンを何とかしたほうが良いかも...」と思っていたこともあり、新しいアイコンを作成・対応することにしました。

また、他にも互換性のwarningが出ていたので、そちらも合わせて対応し、バージョン 0.2.0 としてpublishすることにしました。

 
次に、新しいバージョンのpublish作業について考えました。

今まで同様「Marketplaceのページからビルドしてできたjarファイルをアップロードする」ことも考えました。

ただ、RailroadsプラグインIntelliJ Platform Plugin Template ベースなため、GitHubのRelease機能と連動してpublishすることもできます。
https://github.com/JetBrains/intellij-platform-plugin-template?tab=readme-ov-file#continuous-integration

 
そのため、GitHubのRelease機能によるpublishを行うことで

  • publishまで自動的に行えるので、手間が減る
  • 今までのように「ローカルでビルドした結果をアップロードする」というpublish方法だと、どのソースコードを元にしてビルドした結果なのかが不明瞭
    • 一方、Release機能と連動するのであれば、タグとpublish結果が一致するので明瞭

と考えました。

 
そこで、今後は「GitHubのRelease機能と連動してプラグインのpublishも行う」として作業を行ったため、内容をメモしておきます。

 
目次

 

環境

 

0.2.0のリリース内容

ここでは、0.2.0のリリースノート的な内容を記載します。

GitHub Actionsによるpublishを知りたい方は読み飛ばしてください。

 

Railroads のアイコンの変更について

以前の記事で

ただ、時間の都合上、Railwaysで使っている png 形式のアイコンを svg 形式で用意するのは難しかったことから、今のところ JetBrains で用意しているアイコンで代替しています。

と書いた通り、Railroadsの元となったRailwaysのアイコンは使えませんでした。

「こんなときは生成AIでアイコンを作ろう」とも考えましたが、アイコンに関する知識不足のため、良さげなアイコンを生成する適切なプロンプトを書くことができませんでした。

そこで今回は、「ライセンス的に問題ないSVGファイルをベースに、一部編集し、Railroadsのアイコンとして使う」ことにしました。

 
ライセンス的に問題ないSVGアイコンを調べたところ、WikipediaにあるRailsのアイコンがCC0でした。
https://en.wikipedia.org/wiki/File:Ruby_On_Rails_Logo.svg

そこで、「01:47, 16 January 2017」の「Dorianinou」さん版のSVGファイルをベースに編集することにしました。

 
次に、SVGファイルを編集するツールの使い方が分からないので、以下の方法で編集しました。

 
その結果、最終的にはこんな感じのアイコンになりました。

 
レール上に、1つだけプラグインをイメージした箱を乗せています。スクリーンショットだと分かりづらいので、画像の詳細はこちらのプルリクを参照してください。
https://github.com/thinkAmi/railroads/pull/38/files

 

plugin signing の設定

以前の記事でふれた、 plugin signing の設定を追加しています。
IntelliJ Platform Plugin開発にて、Plugin Signing を試してみた - メモ的な思考的な

なお、プラグインの機能には影響ありません。

関係するプルリクはこちら。
https://github.com/thinkAmi/railroads/pull/8

 

テストコードの追加

こちらも、以前の記事でふれたものです。
IntelliJ Platform Plugin開発にて、KotestやBasePlatformTestCaseを使ったテストコードを書いてみた - メモ的な思考的な

これもプラグインの機能には影響ないです。プルリクはこちら。
https://github.com/thinkAmi/railroads/pull/10

 

互換性のwarningへの対応

互換性のwarningが出ていたので、対応したものになります。

プルリクはこちら。
https://github.com/thinkAmi/railroads/pull/9

 

依存ライブラリのバージョンアップ

dependabotが上げてくれたプルリクのうちおそらく影響が少なそうなものについて、動作確認をした上でバージョンアップしています。

なお、dependabotのプルリクをそのまま適用してもうまく動作しない場合は、別のプルリクを作成しています。

 
ちなみに、2024/8/17 11:30現在、Openなdependabotのプルリクは8個あります。よく調べないとアップデートしづらい...と思ったものがメインです。

今後、時間を見てメンテナンスしていこうと思います。

 

GitHubのRelease機能を使った、プラグインのpublish

ここからが本題です。

IntelliJ Platform Plugin Template にはGitHub Actionsのワークフローファイルが含まれます。

その中には、publish用のワークフロー Release も含まれています。Releaseワークフローについて、READMEには以下のように記載されています。

  • Triggered on released event.
  • Updates CHANGELOG.md file with the content provided with the release note.
  • Signs the plugin with a provided certificate before publishing.
  • Publishes the plugin to JetBrains Marketplace using the provided PUBLISH_TOKEN.
  • Sets publish channel depending on the plugin version, i.e. 1.0.0-beta -> beta channel.
  • Patches the Changelog and commits.

 
では、どんな感じになるか実際に試してみます。

 

事前準備

Railroadsリポジトリではまだ一度もRelease機能を使ったpublishを行なっていないため、事前準備が必要です。

ちなみに、一度でもpublishできている場合は不要なため、この事前準備をスキップできます。

 

publishに必要な環境変数(secret)を設定

READMEによると、GitHub Actionsを使ったpublishでは4つの環境変数(secret)が必要そうでした。
https://github.com/JetBrains/intellij-platform-plugin-template?tab=readme-ov-file#environment-variables

また、secretはGitHubリポジトリ設定にある、 Secrets and variables > Actions > Repository secrets > New repository secret にて設定すれば良さそうでした。

 
では、それぞれの値を見ていきます。

 

PRIVATE_KEY

設定する値について、READMEでは以下のように記載されています。

Certificate private key, should contain: -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY-----

 
これについては、以前 Plugin Signing を試してみたときに作った *.pem ファイルの中身を設定します。
IntelliJ Platform Plugin開発にて、Plugin Signing を試してみた - メモ的な思考的な

ちなみに、手元の秘密鍵-----BEGIN PRIVATE KEY----- で始まっていますが、これでも問題ありませんでした。

 

PRIVATE_KEY_PASSWORD

Plugin Signing で秘密鍵を生成したときのパスワードを設定します。

 

CERTIFICATE_CHAIN

Plugin Signing で生成した *.crt ファイルの中身を設定します。

 

PUBLISH_TOKEN

JetBrains Marketplaceで公開するためのTokenを設定します。

TokenはJetBrains Marketplaceのprofileの中にある、 Tokens タブにて生成できます。
https://plugins.jetbrains.com/author/me/tokens

今回はToken Nameを Github Action Publish Token として生成しました。

 

その他環境変数

Release用のワークフローファイルを見てみると、 GITHUB_TOKEN という環境変数も参照しています。

ただ、GITHUB_TOKEN

各ワークフロー ジョブの開始時に、GitHub によって、ワークフローで使用する一意の GITHUB_TOKEN シークレットが自動的に作成されます。 GITHUB_TOKEN はワークフロー ジョブでの認証に使用できます。

自動トークン認証 - GitHub Docs

ということから、環境変数への設定は不要です。

 

GitHub Actionsがプルリクを作成できるように設定

Release用ワークフローの中では、GitHub ActionsがCHANGELOG.mdを変更するプルリクを作成します。
https://github.com/thinkAmi/railroads/blob/v0.2.0/.github/workflows/release.yml#L77

ただ、GitHubリポジトリのデフォルト設定では、GitHub Actionsがプルリクを作成できません。

そこで、以下の記事を参考に、 Allow GitHub Actions to create and approve pull requests へチェックを入れます。
GitHub ActionsでのPR操作権限はデフォルトでオフになったよ

URL的には以下のページです。
https://github.com/thinkAmi/railroads/settings/actions

 
ちなみに、GitHub Actionsがプルリクを作成できなくても、JetBrains Marketplaceへのプラグインのpublishはできてしまいます。

その場合、Actionsの結果はこんな感じになります。
https://github.com/thinkAmi/railroads/actions/runs/10419491498/job/28857646112

 

GitHubのRelease機能を実行

Create a new release より新しくリリースを作成します。

  • タグを指定
    • v0.2.0 など、prefixとして v を付与
  • リリースノートを記載

その後、 Publish release ボタンをクリックします。

すると、GitHub Actionsが動作し、プラグインのpublishまで行われます。

 
合わせて、「Plugin approval status: Railroads plugin version 0.2.0」という件名で、以下のような内容を含むメールも届きました。

Thank you for submitting version 0.2.0 of the Railroads plugin to JetBrains Marketplace. It has been successfully uploaded and is now pending JetBrains' review and approval.

The review process normally takes two business days. You will receive a notification as soon as the status of this review changes.

 
しばらくするとレビューも終わり、正式にRailroads 0.2.0 が公開されました。
https://plugins.jetbrains.com/plugin/24076-railroads/

 

今回のpublishで分かったこと

What's Newに、GitHubのReleaseに記載したリリースノートが表示される

GitHubのリリースノートには以下のように書きました。

## What's Changed

* add settings of plugin signing by @thinkAmi in https://github.com/thinkAmi/railroads/pull/8
* Fix: Use methodName.name instead of RContainer.getName() by @thinkAmi in https://github.com/thinkAmi/railroads/pull/9
* Add model tests and parser tests by @thinkAmi in https://github.com/thinkAmi/railroads/pull/10
* change railroads icon by @thinkAmi in https://github.com/thinkAmi/railroads/pull/38
* update CHANGELOG.md by @thinkAmi in https://github.com/thinkAmi/railroads/pull/43
* update pluginVersion to 0.2.0 by @thinkAmi in https://github.com/thinkAmi/railroads/pull/44
* update dependencies by dependabot

 
すると、Pluginの What's Newにリリースノートで記載した内容が表示されていました。

 

VersionはGitHubのタグとは連動していない

GitHubのタグには v0.2.0 と設定しました。

一方、PluginのVersionsタブを確認すると、GitHubのタグではなく、gradle.properties ファイルの pluginVersion の値が表示されました。

 

GitHubのprerelease機能と、JetBrains Marketplace機能のリリースチャンネルは連動していない

GitHub Actionsのワークフローファイルを見ると

name: Release
on:
  release:
    types: [prereleased, released]

という設定になっていました。

そのため、GitHubのRelease機能で Set as a pre-release にチェックを入れた場合でも、ワークフローが動作するようでした。

 
また、IntelliJ Platform Plugin SDKのドキュメントによると、リリースチャンネルを切り替えることもできそうに見えました。
https://plugins.jetbrains.com/docs/intellij/publishing-plugin.html#specifying-a-release-channel

 
これらより、「もしかして、 Set as a pre-release にしたら、いい感じでリリースチャンネルを設定してくれるのでは」と考え、

  • GitHubの設定で、タグ名を v0.2.0-alpha にする
  • GitHubでのリリース実行時に Set as a pre-release にチェックを入れる
  • gradle.properties ファイルの pluginVersion0.2.0 のまま

として、GitHubのRelease機能を使ってみました。

 
しかし、

  • GitHub上では Pre-release と表示された
  • JetBrains Marketplace上では 0.2.0 バージョンとして、デフォルトのリリースチャンネルでリリースされた
    • つまり、 0.2.0 が正式バージョンとしてリリースされた

という事態になりました。

 
これより、次回以降にアルファチャンネルなどでリリースしたい場合は、Specifying a Release Channelのドキュメントを読んで対応する or 諦めるとしたいと思いました。
https://plugins.jetbrains.com/docs/intellij/publishing-plugin.html#specifying-a-release-channel

 

同一の pluginVersion を指定すると、publishできない

上記の通り、0.2.0-alpha をリリースするつもりが 0.2.0 がリリースされてしまいました。

そこで、整合性を取るために、pluginVersion は変更せず、改めてGitHubのタグ v0.2.0 を作成してpublishしてみました。

すると、以下のエラーメッセージが表示され、publishすることができませんでした。

* What went wrong:

Execution failed for task ':publishPlugin'.

> Failed to upload plugin: Upload failed: The com.github.thinkami.railroads plugin already contains version 0.2.0 in channel

https://github.com/thinkAmi/railroads/actions/runs/10419812646/job/28858622696

 
これより、もしpublishしたい場合は、 0.2.1 などのようにpluginVersionを変更する必要がありそうでした。

今回は「0.2.0がリリースできているし、まぁいいか...」ということで対応を見送りました。

 

ReleaseのAssetsにはビルド結果が含まれない

Releaseページを見たところ、以下のスクリーンショットのようにソースコードのみ含まれていました。

 
そのため、IntelliJ Platform Plugin Templateのリリースワークフローでは、ビルド結果がGitHub上に残らないことが分かりました。

これにより、「GitHub Actionsでビルドしたプラグインをダウンロードし、直接インストールする」ができなくなります。

ただ、正式なルートでないプラグインのインストールは避けられるので、これはこれでよいのかなと思いました。

 

おわりに

JetBrains IDEプラグインを作る際、IntelliJ Platform Plugin Templateをベースに作っておけば、プラグインのpublishまで自動化できることが分かりました。

publishの手間や心配事が解決できたため、今後も引き続きRailroadsのメンテナンスを行なっていきたいと思います。