kintone

git管理したキントーン資産を本番環境に反映する方法

はじめに

キントーンのgit管理について」という記事の続きとなります。
前回で、キントーンで利用している各種ファイルのgit管理方法をご説明しましたが、今回はそれを別環境(本番用の環境)に移送する手順を説明します。

手順概要

前回のgit管理で大きく以下のファイルを作成しました。
 ①:フォーム定義などのアプリの設計情報
  →kintone REST APIを利用して取得。
 ②:アプリごとのJS/CSSファイル
  →customize-uploaderを利用して取得。
 ③:アプリ全体のJS/CSSファイル
  →手作業で画面からダウンロード
 ④:プラグイン(個別に作成したものに限る)
  →plugin-packerを利用して、zipとソースファイルの両方を管理

①、②については、各RESTAPIやcustomize-uploaderの
オプションを変えることで、各アプリに反映が可能です。
③、④については、頻繁に変わることもないことから、手作業で画面から反映しています。

①:フォーム定義などのアプリの設計情報

「git管理時」に利用したRESTAPIのURL※1を利用します。
そこから以下を変更します。
・アクセス先のドメインを移送先環境に変更
・HTTPメソッドをGETから指定のメソッドに変更
・送信時のパラメータとして、git管理時に取得したjsonファイルを利用
・移送先のアプリIDを指定
※1:正確には「/preview」というアドレスがついた版です。

▽キントーンRESTAPIの一覧
API   HTTP
メソッド
URI
フィールドの一覧 追加 POST /k/v1/preview/app/form/fields.json
フィールドの一覧 変更 PUT /k/v1/preview/app/form/fields.json
フィールドの一覧 削除 DELETE /k/v1/preview/app/form/fields.json
フォームのレイアウト 変更 PUT /k/v1/preview/app/form/layout.json
一覧の設定 変更 PUT /k/v1/preview/app/views.json
アプリ情報 新規作成 POST /k/v1/preview/app.json
一般設定 変更 PUT /k/v1/preview/app/settings.json
プロセス管理の設定 変更 PUT /k/v1/preview/app/status.json
アプリの条件通知 変更 PUT /k/v1/preview/app/notifications/general.json
レコードの条件通知 変更 PUT /k/v1/preview/app/notifications/perRecord.json
リマインダーの条件通知 変更 PUT /k/v1/preview/app/notifications/reminder.json
アプリのアクセス権 変更 PUT /k/v1/preview/app/acl.json
レコードのアクセス権 変更 PUT /k/v1/preview/record/acl.json
フィールドのアクセス権 変更 PUT /k/v1/preview/field/acl.json
アプリのグラフ設定 変更 PUT /k/v1/preview/app/reports.json
アプリのアクション設定 変更 PUT /k/v1/preview/app/actions.json

例として、「一般設定」を反映した結果を記載します。
(注):移送先の環境に対象のアプリが存在しない場合は、最初に
 「アプリ情報(新規作成):/k/v1/preview/app.json」を
 実行して、アプリIDを新規に採番した後利用ください。

▽一般設定.json 
 ※「一般設定」反映時に利用するjsonファイルです。詳細は前回記事を参照ください。

{
 "name": "サンプルアプリ",
 "description": "",
 "icon": {
  "type": "PRESET",
  "key": "APP84"
 },
 "theme": "WHITE",
 "revision": "3888"
}

▽実行例 ※node.jsで実行してください。

var fs = require("fs").promises;
var fetch = require('node-fetch');

// -------------------
// 接続情報
// -------------------
// ドメイン、RESTAPIのURL、HTTPメソッド、移送先のアプリID、アプリ名の順
var ref_domainName = 'xxxxx.cybozu.com';
var url = `https://${ref_domainName}/k/v1/preview/app/settings.json`;
var method = 'PUT';
var appId = 'XX'; 
var app_name = 'サンプルアプリ';

// リクエストヘッダ
var param = { headers :{
     'X-Requested-With'       : 'XMLHttpRequest'
    ,'Content-Type'           : 'application/json'
     // アクセス時の認証情報を記載ください
    ,'X-Cybozu-Authorization' : 'XXXXXXXX'
}};

// git管理の構成に合わせて jsonファイル読み込み
return fs.readFile(`../${app_name}/form/一般設定.json`).then(function(response){
    // BODY部に設定
    result = JSON.parse(response);

    // アプリIDの指定
    result['app'] = appId;
    // リビジョンは指定なし
    result['revision'] = -1; 
    
    param['body'] = JSON.stringify(result);
    param['method'] = method;

    // キントーンRESTAPIの呼び出し
    return fetch(url , param);
}).then(function(response){
    if(response.status != 200){
        throw new Error(response.text());
    }
    console.log("RESTAPIの実行に成功しました")
}).catch(function(err){
    console.log(err);
    throw(err);
});

「RESTAPIの実行に成功しました」とメッセージが出れば成功です。

注意点

1:「フィールドの一覧:/k/v1/preview/app/form/fields.json」を
 利用する際には移送先アプリのフィールド有無に応じて
  ・追加:POST
  ・変更:PUT
  ・削除:DELETE
 のようにHTTPメソッドを切り替えて利用する必要性があります。

 例えば、移送元環境がA,B,Cの3フィールドあり、
 移送先がA,B,Dの構成だった場合、
  「追加:POST」にCのフィールド
  「変更:PUT」にA,Bのフィールド
  「削除:DELETE」にDのフィールド
 の構成で送る必要性があります。

 ・型の変更(文字列から数値)は「変更:PUT」ではなく、
 「削除:DELETE」→「追加:POST」です。
  APIの送信順もこの通りである必要性があります。
  また、既登録のデータも失われますので反映時はご注意ください。

2:APIでは変更不可なフィールドが存在します。
  下表フィールド名はHTTPメソッド何れの反映時にもパラメータから除外してください。
  また、当フィールドについて名前を変更した上で
  アプリで利用している場合は、画面から手作業で名前を変更してください。
  例)レコード番号をIDという名称に変えて利用。

MODIFIER更新者
CREATED_TIME作成日時
CREATOR作成者
UPDATED_TIME更新日時
RECORD_NUMBERレコード番号
CATEGORYカテゴリー
STATUSステータス
STATUS_ASSIGNEE作業者


3:「フィールドの一覧:/k/v1/preview/app/form/fields.json」での反映時
ルックアップ定義等をしている場合、jsonファイルにアプリIDが設定されます。反映時は移行先のアプリIDに変更する必要性があります。
「relatedApp」というキーワード配下に記載があります。

▽フィールドの一覧.json ※抜粋

  "ルックアップID": {
   "type": "NUMBER",
   "code": "ルックアップID",
   "label": "ルックアップID",
   "noLabel": false,
   "required": true,
   "lookup": {
    "relatedApp": {
      #アプリIDを移行先の環境に変更
     "app": "86",
     "code": ""
    },
    "relatedKeyField": "ルックアップID",
    "fieldMappings": [
     {
      "field": "ルックアップのコピー先フィールド",
      "relatedField": "ルックアップのコピー元フィールド"
     }
    ],
    "lookupPickerFields": [
     "ルックアップ名",
    ],
    "filterCond": "",
   }
  }

4:アプリのアイコンにプリセット画像ではなく、個別に作成した画像を利用している場合は「一般設定.json」記載のfileKeyを利用します。
 ・事前に「ファイルダウンロード」APIを利用して、移送元環境からアイコンダウンロード
 ・「ファイルアップロード」APIを利用して、移送先環境にアップロード
 ・「一般設定.json」記載のfileKeyを移送先環境用に変更
 ・最後に従来の手順で「一般設定の変更」APIを実施。

▽一般設定.json

{
 "name": "AAAAAAAA",
 "description": "",
 "icon": {
  "type": "FILE",
  "file": {
    #このキーを利用して、ダウンロード。アップロード後は値を書き替える
   "fileKey": "2021081004290423186E317634466580E6D06EA0CC0463237",
   "name": "icon.png",
   "contentType": "image/png",
   "size": "1567"
  }
 },
 "theme": "WHITE",
 "revision": "16323"
}

②:アプリごとのJS/CSSファイル

前回と同じく、customize-uploaderを利用します。
インストール方法や基本的な使い方はこちらを参照ください。
また、マニュフェストファイルにアプリIDが設定されていますので、事前に移行先のアプリIDに変更してから実施ください。

▽マニュフェストファイル

{
  #アプリIDを移行先のIDに変更
    "app": "4",
    "scope": "ALL",
    "desktop": {
        "js": [
            "../サンプル/src/desktop/js/サンプル.js"
        ],
        "css": [
            "../サンプル/src/desktop/css/サンプル.css"
        ]
    },
    "mobile": {
        "js": [],
        "css": []
    }
}

▽実行例 ※node.jsで実行してください。

const customizeUploader = require("@kintone/customize-uploader");

//------------
//接続情報
//------------
//キントーンのドメイン名、ログインするユーザ名とパスワード
const ref_domainName = 'xxxxx.cybozu.com';
const username = 'xxxxxxxxxxxx';
const password = 'xxxxxxxxxxxx';

// アプリ名とアップロード対象のマニュフェストファイル
const app_name_release = 'サンプルアプリ'
const manifestFile = `../${app_name_release}/src/customize-manifest.json`;
// オプション指定
const option = { watch : false, lang: 'ja' };

// 実行
customizeUploader.run(ref_domainName, username, password, '', '', manifestFile, option);

以下のようなメッセージが出れば成功です。

③:アプリ全体のJS/CSSファイル

kintoneシステム管理 -> JavaScript / CSSでカスタマイズ
で管理しているファイルになります。
こちらは頻繁に変更が発生しないため、手作業で反映しています。

④:プラグイン(個別に作成したものに限る)

作成したzipファイルを画面から手作業で反映しております。
こちらのツールでCLIからでも反映可能です。

最後に

アプリの設定画面に移動し、「アプリを更新」を行うと、反映は完了です。
※③と④は即時反映されますのでご注意ください。

ABOUT ME
Fukunaga
Fukunaga
リードエンジニアしてます。フロントからサーバサイドまで、フルスタックで担当。 DBチューニングが得意。最近はキントーン開発、AI/分析作業など従事しています。