カテゴリー内の他の記事

デプロイAPIを使ってコマンドラインでアプリをコピーしてみよう

フォローする

(著者: KADOYA Ryo

はじめに

2015年7月12日のアップデートで、アプリ情報を取得、設定する各種APIが追加されました。2015/07/12の定期メンテナンスにおけるkintone API更新の事前情報 追加されたAPIは以下です。

  • レコードのステータスの更新
  • アプリの作成と設定の変更
  • アプリの設定の運用環境への反映
  • 一般設定の取得
  • 一般設定の変更
  • フォームの設定の取得
  • フォームの設定の変更
  • 一覧の設定の取得
  • 一覧の設定の変更
  • アプリのアクセス権の取得
  • レコードのアクセス権の取得
  • フィールドのアクセス権の取得
  • JavaScript / CSSカスタマイズ設定の取得
  • JavaScript / CSSカスタマイズ設定の変更

今回は、コマンドラインのHTTPクライアントであるcurlを使って、既存のアプリを別のkintoneにコピーしてみたいと思います。デプロイAPIでアプリをコピーするときのハマりどころについて重点的に説明します。

準備

コマンドラインでcurlを利用します。curlはLinuxやMacOS Xで標準搭載されています。Windowsでもcygwinなどを使って利用することができます。

curl

curlの基本的な使い方

curlでkintoneにアクセスするうえでの基本的なオプションは以下です。

curl -X <メソッド> -H  <ヘッダー情報> -d <パラメータ> 

共通のパラメーターを事前に定義しておきます。以下をターミナルで実行します。

$ BASE64=`echo -n 'user:password' | openssl base64`
$ AUTH="X-Cybozu-Authorization: ${BASE64}"
$ JSON="Content-Type: application/json"
$ HOST=“https://subdomain.cybozu.com/k"

※user:password及びsubdomainの部分は適宜置き換えてください。

$ curl -X GET -H "$AUTH" -H "$JSON" -d '{id:160}'  ${HOST}/v1/app.json
{"appId":"160","code":"","createdAt":"2015-08-21T10:42:16.000Z","creator":{"code":"Ita","name":"ita"},"description":"日々の業務内容、報告事項、所感などを記載していくアプリです。\u003Cdiv\u003E記録を行うだけでなく、あとからの振り返りやメンバー間のコミュニケーションにも活用できます。\u003C/div\u003E","modifiedAt":"2015-08-21T10:43:25.000Z","modifier":{"code":"Ita","name":"ita"},"name":"日報","spaceId":null,"threadId":null}

curlでkintoneから情報を取得することができました! BASIC認証を使用する場合は、以下のようにBASIC認証用のヘッダーを追加してください。

$ BASIC="basic_user:basic_password"
$ curl -X GET --user "$BASIC" -H "$AUTH" -H "$JSON" -d '{id:160}'  ${HOST}/v1/app.json

この日報アプリを、APIを使ってコピーしてみることにします。

アプリの作成

アプリ作成APIを使用してアプリを作成します。

$ curl -X POST -H "$AUTH" -H "$JSON" -d '{name:"コピーされたアプリ"}'  ${HOST}/v1/preview/app.json
{"app":"162","revision":"2"}

アプリID: 162のアプリが作成されました。まだ運用環境には適用されていないのでトップページには表示されませんが、以下のURLから管理画面にアクセスすることができます。 https://subdomain.cybozu.com/k/admin/app/flow?app=162

一般設定情報のコピー

それではまず、コピー元のアプリから一般設定情報を取得します。

$ curl -X GET -H "$AUTH" -H "$JSON" -d '{app:160}'  ${HOST}/v1/preview/app/settings.json > settings.json

ここで取得した一般設定情報を、新しく作成したアプリに適用するのですが、取得したjsonをそのまま適用することはできません。appパラメータを付与し、revisionパラメーターを除外する必要があります。

settings.json

appパラメータを付与し、revisionパラメーターを除外する

修正したjsonをPUTメソッドで送信します。curlでは-dオプションに@をつけてファイルを指定することができます。

$ curl -X PUT -H "$AUTH" -H "$JSON" -d '@settings.json' ${HOST}/v1/preview/app/settings.json
{"revision":"3"}

フォーム情報のコピー

同様に、コピー元のアプリから情報を取得します。

$ curl -X GET -H "$AUTH" -H "$JSON" -d '{app:160}' ${HOST}/v1/preview/app/form/fields.json > fields.json

ここで取得したデータも、やはりそのままでは送信できません。app/revisionパラメータの処理に加えて、ビルトインフィールドの問題があるためです。

ビルトインフィールドは、アプリの作成時に自動的に追加されるため、フィールドの追加APIでの追加はできません。 従ってこれらのフィールドはアプリの新規追加時であっても、変更APIを使用する必要があります。

ビルトインフィールドの一覧

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


※カテゴリーやプロセス管理を使わない設定でも、内部的にカテゴリー、作業者フィールドは追加されています。

取得したjsonをビルトインフィールドとビルトインでないフィールドに分けます。

builtin_fields.json

fields.json

ビルトインフィールドはPUTメソッド(更新)で、ビルトインでないフィールドはPOSTメソッド(追加)で送信します。
1度フィールドを作成してしまったあとは、ビルトインでないフィールドもPUTメソッドで更新することができます。

$ curl -X POST -H "$AUTH" -H "$JSON" -d '@fields.json' ${HOST}/v1/preview/app/form/fields.json
{“revision":"4"}
$ curl -X PUT -H "$AUTH" -H "$JSON" -d '@builtin_fields.json' ${HOST}/v1/preview/app/form/fields.json
{“revision":"5"}

レイアウト情報のコピー

元のアプリから一レイアウト情報を取得します。

$ curl -X GET -H "$AUTH" -H "$JSON" -d '{app:160}'  ${HOST}/v1/preview/app/form/layout.json > layout.json

appの追加とrevisionの削除を行い、PUTメソッドで送信します。

$ curl -X PUT -H "$AUTH" -H "$JSON" -d '@layout.json' ${HOST}/v1/preview/app/form/layout.json
{“revision":"6"}

一覧のコピー

元のアプリから一覧情報を取得します。

$ curl -X GET -H "$AUTH" -H "$JSON" -d '{app:160}'  ${HOST}/v1/preview/app/views.json > views.json

views.json

これまでと同様にappを追加してrevisionを削除します。

PUT メソッドで送信します。

$  curl -X PUT -H "$AUTH" -H "$JSON" -d '@views.json' ${HOST}/v1/preview/app/views.json
{"revision":"7","views":{"自分の日報(カレンダー形式)":{"id":"5259991"},"日報一覧":{"id":"5259990"}}}

一覧をコピーする際に注意する点としては、以下があります。

  • プロセス管理を使う場合、builtinType=ASSIGNEEの一覧が生成されますが、この一覧は移行できないため、jsonから除外する必要があります。
  • コピー元で作業者をフィルタ条件とした一覧が存在する場合、コピー先でプロセス管理が有効でないとこの一覧を移行することができません。

アプリを運用環境に適用する

最後に、deploy.jsonを使ってアプリを運用環境に適用します。

$  curl -X POST -H "$AUTH" -H "$JSON" -d '{apps:[{app:162}]}' ${HOST}/v1/preview/app/deploy.json

GET deploy.json でstatus:SUCCESSが帰ってきたらデプロイ成功です。

$ curl -X GET -H "$AUTH" -H "$JSON" -d '{apps:[162]}' ${HOST}/v1/preview/app/deploy.json
{"apps":[{"app":"162","status":"SUCCESS"}]}

いかがだったでしょうか。デプロイAPIを使えば、カスタマイズしたJSやCSSの設定や、アクセス権の移行を行うこともできます。今回は同一のkintoneへコピーを行いましたが、別の環境のkintoneへアプリを移行することも可能です。 これまで手動で行っていたアプリの設定がAPIで行えることになったことで運用の手間が省けるのではないかと思います。

記事に関するフィードバック

直接的に記事と関連がないご質問はcybozu developer コミュニティをご活用ください。

ログインしてコメントを残してください。
Powered by Zendesk