kintone で複数のアプリが連携して動作するような場合、開発環境をどうやって本番環境へ反映させるか?というのが結構な問題になると思います。
gusuku deploit を使っていれば、ある程度はアプリのコピーをカバーできるのですが、
- ライセンス上、異なるドメインへアプリをコピーする場合はコピー先にもライセンスが必要になっている
- 無料プランだと 10 アプリまでしか対応していない
という点でちょっと使いにくいです。潤沢に予算があればこれを使いましょうで終われるんですけどね・・・
なので、改めて、 kintone のデプロイ方法としていい方法がないか調べてみたところ、 Ginue というツールが結構良さそうだったので、試してみました。そのあたりの一連のことをメモっておきます。
- node v20.10.0
- Ginue 2.2.1
デプロイ方法について調査
まずは、 kintone が提供している標準機能についてです。
- アプリテンプレート/スペーステンプレート
- デプロイ API: デプロイAPIでkintoneアプリの運用管理 - cybozu developer network
アプリテンプレート/スペーステンプレートは、アプリ/スペースの内容をテンプレートにして、そのテンプレートを元にアプリ/スペースを作成することで、元のアプリ/スペースを反映することができます。
この方法の難点としては、
- アプリ/スペースの新規作成時にしか、テンプレートの指定ができない
というのにつきます。つまり、プロジェクト開始時にデプロイするときはうまく使えるのですが、あとからアプリの一部にフィールドを追加したとか、設定を変更した、というのを反映することができません。
デプロイ API を使えば、自作デプロイツールを作ることも不可能ではないのですが、なかなかそこまでの労力はかけられないので、最終手段になるでしょうね。ま、存在は知っていても損はないので、一応書いておきました。
オープンソースなどのツール
kintone がデプロイ API を提供しているので、先人がツールでも作ってくれていないかな?と思ってちょっと調べてみると、2つほど見つかりました。
- kdx あなたのkintone開発にDeveloper Experienceはありますか? #JavaScript - Qiita
- Ginue Ginue 〜kintoneの設計情報管理ツール〜 を使って開発環境を本環境にデプロイする方法 #kintone - Qiita
リポジトリは次の通りです。
- GitHub - shellyln/kdx: kintone CLI for development & deployment, with Developer Experience.
- GitHub - goqoo-on-kintone/ginue: Ginue is the CLI tool to get settings of kintone via kintone REST API.
このうち、 kdx は 2020 年あたりでリリースやコミットが止まっているようです。一方、 Ginue は安定版のリリースこそ 2020 年で止まってますが、ベータ版のリリースや Github のコミットは最近(2023 年)まで続いているので、こちらはまだ動いている(と期待してもよい)ようです。
というわけで、今回は Ginue を試してみることにしました。あ、 kdx のほうは試用していないだけで、使えないというわけではありませんので、お間違いないように。興味を持った方はぜひ試してください。
試用
Ginue に絞ってさらに調べてみると、いくつかの紹介記事がありました。
- kintone設定管理ツールginueメモ #開発環境 - Qiita
- Ginue 〜kintoneの設計情報管理ツール〜 を使って開発環境を本環境にデプロイする方法 #kintone - Qiita
あと、 Ginue のリポジトリの説明も結構充実しているので、これらを参考にして試用します。
アプリの作成
まずは、 kintone にログインして、サンプルとなるアプリを作成しておきます。
フィールドはテキストフィールドを一つだけ持って、jsカスタマイズファイルを指定しておきます。
次に ginue を使うのがデプロイのためなので、デプロイ先になるアプリも作成しておきます。こちらは、空っぽのアプリにしておきます。
これで、アプリの準備ができたので、次は Ginue の設定に移ります。
インストール
まずは、 Ginue をインストールします。
PS D:\work\tmp\kintone_tutorial\sample_ginue> npm install -D ginue up to date, audited 473 packages in 1s 73 packages are looking for funding run `npm fund` for details 5 moderate severity vulnerabilities To address issues that do not require attention, run: npm audit fix Some issues need review, and may require choosing a different dependency. Run `npm audit` for details. PS D:\work\tmp\kintone_tutorial\sample_ginue>
設定ファイルを作成
ginue を動かすとき、コマンドライン引数であれこれを指定することもできますが、設定ファイルを作っておけば、それに従って動いてくるようです。設定ファイルは、 js, json, yaml の形式で作れるようです。今回は json の形式で作成します。
.ginuerc.json というファイルを下記のように作りました。
{ "location": "kintone-settings/ginue-customize-js-test", "env": { "development": { "domain": "サブドメイン.cybozu.com", "username": "ユーザー名", "password": "パスワード", "app": { "test_ginue": nnn } }, "ginue_test": { "domain": "サブドメイ.cybozu.com", "username": "ユーザー名", "password": "パスワード", "app": { "test_ginue": mmm } } } }
env の下にある development と ginue_test というのが環境を表す名称になります。いくつでも作れるそうです。
先頭の location が kintone の設定内容を保存するフォルダの指定になります。上記のようにサブフォルダ指定もできます。
環境ごとに、サブドメイン名、ユーザー名、パスワードを指定しておくこともできます(指定がない場合は、コマンド実行時に聞かれるようです)。サブドメイン名を環境に応じて指定できるということは、自分の開発環境の内容をお客様開発の環境に移行するということも問題なくできそうですね。
app にはアプリを指定します。複数のアプリを指定することもできます。オブジェクト形式で記述しておくと、コマンドラインの引数としてアプリ名を指定することができるようになります。
既存アプリを取得
.ginuerc.jsonが作成できたら、既存アプリを取得してみます。
PS D:\work\tmp\kintone_tutorial\sample_ginue> npx ginue pull development location: "kintone-settings/ginue-customize-js-test" environment: "development" domain: "サブドメイン.cybozu.com" username: "ユーザー名" password: [hidden] app: { "test_ginue": nnn } kintone-settings/ginue-customize-js-test/development/test_ginue/field_acl.json kintone-settings/ginue-customize-js-test/development/test_ginue/app_form_layout.json kintone-settings/ginue-customize-js-test/development/test_ginue/record_acl.json kintone-settings/ginue-customize-js-test/development/test_ginue/app.json kintone-settings/ginue-customize-js-test/development/test_ginue/app_customize.json kintone-settings/ginue-customize-js-test/development/test_ginue/app_acl.json kintone-settings/ginue-customize-js-test/development/test_ginue/app_views.json kintone-settings/ginue-customize-js-test/development/test_ginue/app_status.json kintone-settings/ginue-customize-js-test/development/test_ginue/form.json kintone-settings/ginue-customize-js-test/development/test_ginue/app_form_fields.json kintone-settings/ginue-customize-js-test/development/test_ginue/app_settings.json PS D:\work\tmp\kintone_tutorial\sample_ginue>
こんな感じでフィールド設定や、アプリの設定内容が取得されます。
保存先は、.ginuerc.json で指定したディレクトリの配下に、環境名、アプリ名でディレクトリを分けてファイルを保存してくれます。なので、直接 json ファイルを編集することで設定を変更することもできますね。
デプロイのテスト
次に、取得したアプリを別の環境にデプロイするのを試します。デプロイは2段階に分かれており、最初は取得した設定内容をデプロイ先のアプリに反映する処理になります。
PS D:\work\tmp\kintone_tutorial\sample_ginue> npx ginue push development:ginue_test location: "kintone-settings/ginue-customize-js-test" environment: "development" domain: "サブドメイン名.cybozu.com" username: "ユーザー名" password: [hidden] app: { "test_ginue": nnn } domain: "サブドメイン名.cybozu.com" username: "ユーザー名" password: [hidden] app: { "test_ginue": mmm } environment: "ginue_test" location: "kintone-settings/ginue-customize-js-test" ? [push] Are you sure? Yes app/form/fields.json ? Add field "文字列__1行_" to ginue_test.test_ginue? Yes app/form/layout.json [SKIP] app/acl.json app/status.json [SKIP] record/acl.json [SKIP] field/acl.json app/views.json app/settings.json PS D:\work\tmp\kintone_tutorial\sample_ginue>
途中で、push してもよいか確認されるので、yを押すと処理が行われます。また、フィールドの追加や削除があった場合も、その都度確認されます。
次に、 push した内容(変更した内容)をデプロイしてアプリに反映させます。
PS D:\work\tmp\kintone_tutorial\sample_ginue> npx ginue deploy ginue_test location: "kintone-settings/ginue-customize-js-test" environment: "ginue_test" domain: "サブドメイン名.cybozu.com" username: "ユーザー名" password: [hidden] app: { "test_ginue": mmm } ? [deploy] Are you sure? Yes PS D:\work\tmp\kintone_tutorial\sample_ginue>
エラー等が出なければ、これで完了です。デプロイ先の kintone のアプリを開いてみると、確かにフィールドが追加されているのがわかります。
感想
Ginue 使ってみると、かなり便利そうです。細かいところは見ていませんが、多くの設定は正しくコピーされているようです。
ただ、今回試して感じたのは、先に、デプロイ先のアプリを用意しておく必要あるので、この部分はアプリ/スペーステンプレートを使って準備すると楽になりそうかな?というところです。それに、 push 時にフィールドの追加・削除があるとそのたびに確認されるので、空のアプリへの push だと結構確認作業だけでも大変かもしれません。
そういう意味ではやっぱり最初はアプリ/スペーステンプレートを使うのが無難そうですね。
制限事項
あと、今回試してみて気が付いたこととしては
- アプリ名自体はコピーされない
- カスタマイズの指定がデプロイ先に反映されない(URL, js ファイル指定とも)
- アプリ/レコード/フィールドのアクセス権設定が反映されない
というのがありました。
1つ目については、上述したようにデプロイ先を準備する際にアプリ/スペーステンプレートを使えば大きな問題にはならなさそうです。
2つ目が実際に使おうと思うと、デプロイ時にはちょっと面倒かもしれません。自分でカスタマイズファイルのアップロードスクリプトを作成することでカバーすることになりそうです。
もっとも、2つ目の js ファイルについては、リポジトリを見ると js ファイルのダウンロード機能を追加しているコミットがあるので、次のリリース時にはカバーされるのかもしれません。
3つ目についてはどうすればいいのかな?ちょっとこの部分はネックになるかもしれませんが、複雑なアクセス権を設定していないようであれば、手作業での対応もありかもしれませんね。
補足
どうも、上記の反映されていないという内容は、 ginue pull で取得したファイルのうち、上記の push を実行した際に、画面に SKIP と表示されたファイルおよび何も表示されていないファイルに対応しているっぽいです。
具体的には
- app_acl.json
- app_customize.json
- app.json
- field_acl.json
- form,json
- record_acl.json
が該当しています。それぞれのファイル名は、 kintone REST API の各 URL に対応しているようです。せっかくなので、上記のファイルに対応したAPIは多分これだろうな、と推測したものを以下に載せておきます。
- アプリのアクセス権の設定を取得する - cybozu developer network
- JavaScript / CSSカスタマイズ設定を取得する - cybozu developer network
- 1件のアプリの情報を取得する - cybozu developer network
- フィールドのアクセス権の設定を取得する - cybozu developer network
- フォームの設計情報を取得する - cybozu developer network
- レコードのアクセス権の設定を取得する - cybozu developer network
まとめ
上記の試用とは別に実際のプロジェクトを流用して試しても見たのですが、プロセス管理などもちゃんんとコピーされてました。もちろん、細かく見たわけではないので、他にも設定が反映されていないところなどもあるかもしれませんが、おおむね使えそうな印象です。
ということで、今回使った Ginue は実際のプロジェクトでも結構使えそうです。このまま開発が進んでくれるといいなー。