目次


マルチテナント環境での継続的デリバリー・プロセス

UrbanCode Deploy で管理する方法

Comments

はじめに

このチュートリアルでは、IBM® UrbanCode Deploy を使用して、マルチテナント環境の中で継続的デリバリー・プロセスを構成する方法を説明します。このソリューションは、SaaS (Software as a Service) アプリケーションに関する実際のケース・スタディーを基に作成されています。このチュートリアルで取り上げるアプリケーションの名前は、「DevOps for SaaS」です。

シナリオ

このシナリオでは、複数の DevOps for SaaS 環境があり、それぞれが別々の仮想マシンでホストされています。各仮想マシン (VM) は共有環境になっており、それぞれの VM で DevOps for SaaS サービスの複数のインスタンスをホスト可能であり、各インスタンスは異なる顧客に関連付けることができます (図 1 の VMa、VMb、VMn を参照)。このタイプの構成では、一般に、アプリケーション・ソフトウェア・スタックのインストールが複数回行われます。

図 1. IBM UrbanCode Deploy で管理する DevOps for a SaaS 環境
DevOps for SaaS に実装されたインフラストラクチャーを示す図
DevOps for SaaS に実装されたインフラストラクチャーを示す図

このチュートリアルでは、IBM UrbanCode Deploy を利用して、柔軟なデリバリー・プロセスを作成する方法を説明します。作成するプロセスには、以下の特徴があります。

  • 顧客のニーズに応じて、環境内の各アプリケーション・インスタンスを個別に更新することができます。
  • すべてのアプリケーション・インスタンス、またはその一部を同時に更新することができます。
  • 新しいアプリケーション・インスタンスは、このプロセスに自動的に含められます。

UrbanCode Deploy を使用した実装

このチュートリアルでは、UrbanCode アプリケーション・プロセスを実装する手順をひと通り説明します。このプロセスが入力パラメーターとして取るのは、そのプロセスを実行する個々のケースに含める顧客リストです。図 2 に、この様子を示します。

図 2. 「Run Process on DevOps for SaaS environment (DevOps for SaaS 環境でのプロセス実行)」パネル
いくつかの顧客 ID が表示されたプロセス実行パネルのスクリーンショット
いくつかの顧客 ID が表示されたプロセス実行パネルのスクリーンショット

ソリューションの作成手順

IBM UrbanCode Deploy を基に作成するこのデリバリー・プロセス・ソリューションは、以下の構成要素からなります。

  • 単一のアプリケーション環境: ここに、すべての顧客環境を含めます。
  • 汎用プロセス: 実行時に、更新対象のリソースにタグを追加します。
  • アプリケーション・プロセス: 更新する顧客環境の名前を指定する必要があります。

このデリバリー・プロセスは、以下の 5 つのステップで作成します。

  • ステップ 1. IBM UrbanCode Deploy コマンド・ラインをインストールする
  • ステップ 2. 実行時にリソースにタグを追加する汎用プロセスを定義する
  • ステップ 3. コンポーネントを定義する
  • ステップ 4. アプリケーション環境を定義する
  • ステップ 5. 入力値を指定してアプリケーション・プロセスを定義する

DevOps for SaaS マルチテナント環境を管理できるアプリケーション・プロセスを作成するために、UrbanCode のリソースには、UrbanCode アプリケーション・プロセスの入力データに基づいて実行時にタグを追加できるようにします。UrbanCode プロセスによって自動的にリソースにタグを追加するには、IBM UrbanCode コマンド・ラインを使用する必要があります。IBM UrbanCode コマンド・ラインは、IBM UrbanCode エージェントにインストールできる、オプションの製品コンポーネントです。

ステップ 1. IBM UrbanCode Deploy コマンド・ラインをインストールする

IBM UrbanCode コマンド・ライン (CLI) を、IBM UrbanCode Deploy エージェントがインストールされているマシンにインストールします。CLI コマンドが含まれるすべてのプロセスは、このエージェントによって実行されます。

ステップ 2. 実行時にリソースにタグを追加する汎用プロセスを定義する

実行時にリソースにタグを追加する汎用プロセスを定義するために、以下の 3 つの汎用プロセスを作成します。

  • リソースにタグを追加する「AddTagToResource」プロセス
  • リソースからタグを削除する「RemoveTagFromTheResource」プロセス
  • 更新するリソースを検出してタグを追加する「Find and tag resource to be updated」プロセス

注:
タグとリソースは、プロセスの入力です。

「AddTagToResource (リソースにタグを追加する)」汎用プロセス

「AddTagToResource (リソースにタグを追加する)」プロセスは、コマンド・ラインからコマンドを実行して、特定のリソースに特定のタグを追加します。このプロセスでは 2 つの必須パラメーターと、2 つのオプション・パラメーター (デフォルトで現在の設定値に設定されます) を使用します。

2 つの必須パラメーターは、以下のとおりです。

  • リソース名 (図 3 の resourceProcess)
  • タグ (図 3 の tagProcess)

2 つのオプション・パラメーターは、以下のとおりです。

  • IBM UrbanCode コマンド・ラインのインストール・パス (図 3 の udcCLIPath)
  • 管理者のパスワード (図 3 の adminCLIpwd)

まず、新しい汎用プロセスを作成して「AddTagToResource」という名前を付けます。次に、「Configuration (構成)」タブで 4 つのプロセス・プロパティー (入力パラメーター) を定義します (図 3 を参照)。

定義する 4 つのプロセス・プロパティーは、以下のとおりです。

  • resourceProcess: タグを追加する対象のリソース
  • tagProcess: リソースに追加するタグ
  • udcCLIPath: このプロセスを実行するコマンド・ライン・パス
  • adminCLIpwd: コマンド・ライン管理者のパスワード

udcCLIPathadminCLIpwd のデフォルト値は、UrbanCode Deploy 環境の現在の設定値に設定されます。

図 3. プロセス・プロパティーの詳細
4 つのプロセス・プロパティーのスクリーンショット
4 つのプロセス・プロパティーのスクリーンショット

プロセスを定義するのは簡単で、たった 1 つのステップで定義することができます。具体的には、「Design (設計)」タブで、「Step (ステップ)」パレットからシェル・タイプを選択し、このステップをプロセスに追加するだけのことです。この操作によって、図 4 のような結果になります。

図 4. 指定されたリソースにタグを追加する「AddTagToResource」プロセス
プロセス・フローのスクリーンショット

IBM UrbanCode Deploy コマンド・ラインを使用してリソースに特定のタグを追加するには、シェル・スクリプトによるステップを編集して、以下のコマンドをシェル・スクリプトのフィールドに挿入します。

${p:udcCLIPath} -weburl https://localhost:8443 -username admincli -password 
${p:adminCLIpwd} addTagToResource -resource "${p:resourceProcess}" -tag ${p:tagProcess}

「RemoveTagFromTheResource (リソースからタグを削除する)」汎用プロセス

新しい汎用プロセスを作成して、「RemoveTagFromTheResource」という名前を付けます。

次に、「Configuration (構成)」タブで、以下の 4 つのプロセス・プロパティー (入力パラメーター) を定義します (図 5 を参照)。

  • resourceProcess: タグを追加する対象のリソース
  • tagProcess: リソースに追加するタグ
  • udcCLIPath: このプロセスを実行するコマンド・ライン・パス
  • adminCLIpwd: コマンド・ライン管理者のパスワード

udcCLIPathadminCLIpwd のデフォルト値は、UrbanCode Deploy 環境の現在の設定値に設定されます。

図 5. このプロセスの入力パラメーター
「RemoveTagFromTheResource (リソースからタグを削除する)」プロセスに対して定義された 4 つのプロセス・プロパティーのスクリーンショット
「RemoveTagFromTheResource (リソースからタグを削除する)」プロセスに対して定義された 4 つのプロセス・プロパティーのスクリーンショット

たった 1 つのステップで、図 6 に示す汎用プロセスを定義します。それには、「Design (設計)」タブで、「Step (ステップ)」パレットからシェル・タイプを選択し、そのステップをプロセスに追加します。

図 6. 指定されたリソースからタグを削除する「RemoveTagFromTheResource」プロセス
プロセス・フローのスクリーンショット

IBM UrbanCode Deploy コマンド・ラインを使用してリソースから特定のタグを削除するには、シェル・スクリプトによるステップを編集して、以下のコマンドをシェル・スクリプトのフィールドに挿入します。

${p:udcCLIPath} -weburl https://localhost:8443 -username admincli -password
${p:adminCLIpwd} removeTagFromResource -resource "${p:resourceProcess}" -tag
${p:tagToRemoveProcess}

「Find and tag resource to be updated (更新するリソースを検出してタグを追加する)」汎用プロセス

「Find and tag resource to be updated (更新するリソースを検出してタグを追加する)」プロセスは、更新する必要がある顧客環境の ID リストとリソースを入力として受け取ると、その指定されたリソースに、入力として渡された顧客の ID のいずれかがタグとして付けられているかどうかを調べます (顧客の ID もタグであることに注意してください)。リソースに、入力フィールドで選択されたいずれかの ID がタグとして付けられている場合、そのリソースにタグ toBeUpdated を追加します。このプロセスを環境内のすべてのリソースに対して実行したとしても、タグ toBeUpdated が追加されるのは、入力として渡された顧客の ID がタグとして付けられているリソースだけです。

新しい汎用プロセスを作成して「Find and tag resource to be updated」という名前を付けます。

「Configuration (構成)」タブで、以下の 4 つのプロセス・プロパティー (入力パラメーター) を定義します (図 7 を参照)。

  • resourceToVerify: タグが含まれているかどうかを確かめる必要があるリソース
  • tagToUpdate: リソースに対してタグとして検出するタグのリスト
  • udcCLIPath: このプロセスを実行するコマンド・ライン・パス
  • adminCLIpwd: コマンド・ライン管理者のパスワード
図 7. 「Find and tag resource to be updated (更新するリソースを検出してタグを追加する)」プロセスの入力パラメーター
プロセス・プロパティーのスクリーンショット
プロセス・プロパティーのスクリーンショット

図 7 に示されているのは「Design (設計)」タブです。このタブで、プロセスを定義します。定義するプロセスの最初のステップ (「FindRootResource (リソース・ルート検出)」ステップ) では、リソース・パスのルート (root) を検出します (ルートが必要となる理由は、顧客 ID がリソース・パスのルート・レベルで定義されているためです)。プロセスが受け取るリソース・パスには、コンポーネントも含まれます。このステップで計算されるリソース・パスは、後処理スクリプトによって、IBM UrbanCode Deploy プロパティーにエクスポートされます。

「GetTags (タグ取得)」ステップは、入力として渡されたリソースに関連付けられているすべてのタグを取得するために IBM UrbanCode Deploy コマンド・ラインを実行するシェル・コマンドになっています。実行するシェル・コマンドは、以下のとおりです。

${p:udcCLIPath} -weburl https://localhost:8443 -username admincli -password
${p:adminCLIpwd} getTagsOnResource -resource "${p:FindRootResource/result}"

「Check (タグ・チェック)」ステップは、(前のステップで計算された) リソースに関連付けられているタグのリストに、入力として渡されたいずれかのタグが含まれているかどうかを確かめるシェル・スクリプトになっています。リスト 1 に、実行するコマンドの詳細を記載します。

リスト 1. 「Check (タグ・チェック)」シェル・スクリプト
#!/bin/bash
set -x
str2=${p:tagToUpdate}
str=${p:GetTags/result}
result=false
arr1=(`echo $str | cut -d "," --output-delimiter=" " -f 1-`)
arr2=(`echo $str2| cut -d "," --output-delimiter=" " -f 1-`)
for var in "${arr1[@]}"
do
s1=${var}
for var2 in "${arr2[@]}"
do
s2=${var2}
if [ "$s2" = "all" ]
then
    result=true
else
if [ "$s1" = "$s2" ]
    then
        result=true
fi
fi
done
done
echo $result

このチェックの結果 (true または false) は、後処理スクリプトにより、プロパティーに設定されます。この結果が使用されるのは、プロセスの後のほうで実行される切り替えステップ「Should this resource be updated? (このリソースを更新する必要がありますか?)」においてです。このステップで、リソースにタグを追加する必要があるかどうかを確かめます。

「Add tag to be updated (更新対象へのタグの追加)」ステップでは、「Add tag to the resourece (リソースへのタグの追加)」プロセスを実行します (図 8 を参照)。

図 8. 更新するリソースを検出してタグを追加する「Find and tag resource to be updated」プロセス
プロセスのステップを示すフロー図のスクリーンショット
プロセスのステップを示すフロー図のスクリーンショット

「Add tag to the resourece (リソースへのタグの追加)」プロセスの入力パラメーターはすべて、「Add tag to be updated (更新対象へのタグの追加)」ステップのプロパティー・パネルで定義されます。以下のプロパティーをカスタマイズしてください (図 9 を参照)。

  • 「Resource Path (リソース・パス)」には ${p:resource.path} を設定
  • 「resourceProcess」には ${p:resourceToVerify} を設定
  • 「udcCLIPath」には ${p:udcCLIPath} を設定
図 9. 「Add tag to be updated (更新対象へのタグの追加)」ステップのプロパティー
「Add tag to be updated (更新対象へのタグの追加)」ステップの「Edit Properties (プロパティーの編集)」ウィンドウのスクリーンショット
「Add tag to be updated (更新対象へのタグの追加)」ステップの「Edit Properties (プロパティーの編集)」ウィンドウのスクリーンショット

ステップ 3. コンポーネントを定義する

次は、アプリケーション・インスタンス (更新対象のソフトウェア・アプリケーション) を管理するための IBM UrbanCode Deploy コンポーネントを定義する必要があります。

新しい IBM UrbanCode Deploy コンポーネントを定義して、「Application instance」という名前を付けます (図 10 を参照)。

図 10. 「Application instance」コンポーネントの作成
「Create New Component (新規コンポーネントの作成)」パネルのスクリーンショット
「Create New Component (新規コンポーネントの作成)」パネルのスクリーンショット

「Application instance」コンポーネントのデリバリー・プロセスを実装するには、少なくとも以下の 3 つの新規コンポーネント・プロセスを作成する必要があります。

  • Update Component (コンポーネントの更新)
  • Tag resource to be updated (更新するリソースへのタグの追加)
  • Remove Tag resources to be updated (更新するリソースからのタグの削除)

Update Component (コンポーネントの更新): アプリケーション・インスタンスを更新します。このプロセスは、管理対象のアプリケーションによって異なります。

Tag resource to be updated (更新するリソースへのタグの追加): ステップ 2 で作成した「Find and tag resource to be updated (更新するリソースを検出してタグを追加する)」汎用プロセスを実行します。このプロセスが入力として取るのは、更新する必要がある顧客環境の ID のリストです。図 11 に、「Tag resource to be updated (更新するリソースへのタグの追加)」プロセスのコンポーネント・プロパティーを示します。

図 11. 「Tag resource to be updated (更新するリソースへのタグの追加)」プロセスの入力プロパティー
「Component Process Properties (コンポーネント・プロセス・プロパティー)」ウィンドウの「Add Property (プロパティーの追加)」ボタンのスクリーンショット
「Component Process Properties (コンポーネント・プロセス・プロパティー)」ウィンドウの「Add Property (プロパティーの追加)」ボタンのスクリーンショット

「Tag resource to be updated (更新するリソースへのタグの追加)」プロセスは汎用プロセスを実行する 1 つのステップで構成されています。

汎用プロセスの入力パラメーター (図 12 を参照) は、以下のとおりです。

  • Resource Path: 汎用プロセスを実行するリソース。ここには、UrbanCode Deploy コマンド・ラインがインストールされているエージェントのリソース ID を指定する必要があります。
  • Resource to verify: このコンポーネント・プロセスの実行対象とする現行リソース
  • TagToUpdate: このステップの入力として渡される、このコンポーネント・プロセスの入力パラメーター
  • UdcCLIPath: UrbanCode Deploy コマンド・ラインのインストール・パス
図 12. 「List tagged resource (タグが付けられたリソースのリスト表示)」ステップの詳細プロパティー
このプロセスのプロパティーを示す図のスクリーンショット
このプロセスのプロパティーを示す図のスクリーンショット

「Remove Tag resources to be updated (更新するリソースからのタグの削除)」プロセスは、リソースから toBeUpdated タグを削除するためのプロセスです。このプロセスは、ステップ 2 で定義した「RemoveTagFromTheResource (リソースからタグを削除する)」汎用プロセスを使用します。このプロセスは、汎用プロセスを実行するための単一のステップで構成されます。

図 13. 「Remove tag (タグの削除)」ステップの詳細プロパティー
このプロセスのプロパティーのスクリーンショット
このプロセスのプロパティーのスクリーンショット

ステップ 4. アプリケーション環境を定義する

テナンシー、コンポーネント、仮想マシンを関連付けるには、アプリケーション環境を定義する必要があります。アプリケーション環境は、アプリケーションをホストするためにユーザーが定義したリソースの集まりで、各コンポーネントと、それらのコンポーネントをデプロイするエージェントを 1 つにまとめます。リソースはデプロイメント・ターゲットを表しており、リソースを管理するエージェントは、このデプロイメント・ターゲットと同じホスト上にあります。

IBM UrbanCode アプリケーションを作成し、「DevOps for SaaS」という名前を付けます。新しく作成したアプリケーションを開き、「Create New Environment (新規環境の作成)」をクリックして、新規アプリケーション環境を作成します。

図 14. 新規環境を作成するパネル
「Create New Environment (新規環境の作成)」パネルのスクリーンショット
「Create New Environment (新規環境の作成)」パネルのスクリーンショット

新規環境を作成したら、リソースを設定してその環境を構成する必要があります。図 15 に、作成した新規環境が表示されたアプリケーション・パネルを示します。環境を構成するには、環境の名前をクリックします。

図 15. 「Environments (環境)」ウィンドウ・タブ
アプリケーション用に作成した新規環境を示すウィンドウのスクリーンショット
アプリケーション用に作成した新規環境を示すウィンドウのスクリーンショット

図 16 に、「Create New Resource (新規リソースの作成)」ウィンドウを示します。最初に環境に追加しなければならないのは、顧客ごとのグループです。

  • Click 「Actions (アクション)」 > 「Add group (グループの追加)」の順にクリックします。
  • 「Name (名前)」フィールドに顧客の名前を入力します。
図 16. 「Create New Resource (新規リソースの作成)」ウィンドウ
新規リソースのプロパティーのスクリーンショット
新規リソースのプロパティーのスクリーンショット

各グループに、顧客 ID でタグを追加します。例えば、Customer1 の顧客 IDcus1 の場合、Customer1 グループにはタグ cus1 を追加します。

グループごとに、その顧客に固有のアプリケーション・インスタンスが含まれているエージェントを追加します。

図 17 を見ると、ucdsrv1 にはすべての顧客のアプリケーション・インスタンスが含まれています。

図 17. DevOps4SaaS 環境に定義されたタグ
環境に関連付けられたタグのスクリーンショット
環境に関連付けられたタグのスクリーンショット

次に、アプリケーション・インスタンス用に作成したコンポーネントを各リソースに関連付けます。

図 18. エージェントと環境の関連付け
コンポーネントを追加する画面のスクリーンショット
コンポーネントを追加する画面のスクリーンショット

この構成が完了すると、環境内で顧客ごとに 1 つのリソース (フォルダー・アイコンで表現) が割り当てられることになります。顧客のリソースに含まれているのは、アプリケーション・インスタンスが含まれるエージェント・リソースです。図 19 に、この環境の構造を示します。

図 19. 環境の概要
環境の概要を示す画面のスクリーンショット
環境の概要を示す画面のスクリーンショット

ステップ 5. 入力値を設定してアプリケーション・プロセスを定義する

最後のステップは、更新する必要のある顧客 ID のリストを入力として取るアプリケーション・プロセスを作成することです。このアプリケーション・プロセスは、入力として渡された顧客 ID に関連付けられているリソースだけを更新します。

まず、新しいアプリケーション・プロセスを定義し、「Update customer environment」という名前を付けます。

「Configuration (構成)」タブ (図 20 を参照) で、「Customer ID to update」というアプリケーション・プロパティーを追加します。

図 20. アプリケーション・プロセスに定義された入力パラメーター
入力パラメーターのスクリーンショット
入力パラメーターのスクリーンショット

「Customer ID to update (更新する顧客 ID)」プロパティーを定義するには、「Edit Property (プロパティーの編集)」ウィンドウで、「Type (タイプ)」ドロップダウン・メニューから「Multi Select (複数選択)」を選択します (図 21 を参照)。

図 21. 入力パラメーターに関する詳細プロパティー
入力パラメーターに関する詳細プロパティーのスクリーンショット
入力パラメーターに関する詳細プロパティーのスクリーンショット

新規顧客が環境に追加された場合、手作業で、または自動的に「Allowed Values (許容される値)」を更新することができます。アプリケーション・プロセスのプロパティーを自動的に更新するには、REST API を使用します。この方法を使用すると、アプリケーション・プロセスのプロパティーが上書きされるため、プロパティーが更新されるたびに、「Allowed Values (許容される値)」をすべて定義する必要があります。「Allowed Values (許容される値)」の定義は、以下のとおりです。

  • いずれかの顧客の ID: 選択されたこの ID の環境インスタンスが、実行時に更新されます。
  • 固定ストリング all: この ID が選択されると、実行時にすべての環境インスタンスに対する更新が行われます。
  • 固定ストリング none: この ID が選択されると、実行時にすべての環境インスタンスに対する更新が行われるのが回避されます。
リスト 2. アプリケーション・プロセス・プロパティーに許容される値を変更する PUT メソッド
method type:  PUT
 url:  http://<udeploy_server>:<port>/rest/deploy/applicationProcess/
{applicationProcessId}/savePropDef  

body: 
{
allowedValues: [ {label: "allowedLabel1", value: "allowedValue1"} , { label: 
"allowedLabel2", value: "allowedValue2"} ],
applicationProcessVersion: "current version",
description: "description",
existingId: "existing property id",
label: "property label",
name: "property name",
pattern: "",
required: "false",
type: "MULTI_SELECT",
value: ""
}

プロセスのプロパティーを定義した後は、プロセスを設計する必要があります。「Design (設計)」タブで、プロセスのステップを構成します。図 22 に、アプリケーション・プロセスを示します。

図 22. アプリケーション・プロセスの設計
アプリケーション・プロセスの設計フロー図
アプリケーション・プロセスの設計フロー図

最初のステップ「Tag resources to be updated (更新するリソースへのタグの追加)」で、「Application instance」コンポーネントのプロセスを実行します。「Tag resources to be updated (更新するリソースへのタグの追加)」ステップは、このプロセスに、顧客 ID タグのリスト (このアプリケーション・プロセスの入力) を入力として渡します。このステップでは、顧客 ID タグのリストに含まれるいずれかのタグが付いたリソースのすべてに、タグを追加します。リソースに追加されるタグは、toBeUpdated タグです。図 23 に、この新規ステップのプロパティーを示します。

図 23. 「Tag resources to be updated (更新するリソースへのタグの追加)」ステップ
プロセスのステップのプロパティーのスクリーンショット
プロセスのステップのプロパティーのスクリーンショット

「Update Application instance (アプリケーション・インスタンスの更新)」ステップでは、toBeUpdated タグが付けられたリソースに対し、「Application instance」コンポーネントのプロセス「Update Application instance (アプリケーション・インスタンスの更新)」を実行します。更新が開始されるのは、アプリケーション・プロセスの入力として指定された顧客環境に関連付けられているリソースのみです。

図 24. 「Update Application instance (アプリケーション・インスタンスの更新)」ステップの詳細
プロセスのステップのプロパティーのスクリーンショット
プロセスのステップのプロパティーのスクリーンショット

プロセスの終了時には、toBeUpdated タグがリソースから削除されています。「Remove TAG (タグの削除)」ステップと「Recovery action: Remove tag toBeUpdated (リカバリー・アクション: toBeUpdated タグの削除)」ステップの 2 つは、コンポーネントのプロセス「Remove Tag resources to be updated (更新するリソースからのタグの削除)」を実行します。このプロセスは、toBeUpdated タグが付けられたすべてのリソースに対して実行されます。

まとめ

このチュートリアルでは、共有されるオペレーティング・システム上にアプリケーションの複数のインスタンスがインストールされるマルチテナント環境で、IBM UrbanCode Deploy を使用して継続的デリバリー・プロセスを管理する方法を説明しました。

このソリューションにより、運用チームは更新するアプリケーション・インスタンスを、顧客 ID に基づいて柔軟に決定することができます。すべての顧客ではなく特定の顧客にだけコード・ドライバーが必要となるような状況であれば、常にこのソリューションが役立ちます。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=DevOps, Rational
ArticleID=1014840
ArticleTitle=マルチテナント環境での継続的デリバリー・プロセス
publish-date=09172015