[Salesforce DX] Scratch Orgを使った開発フローをためしてみた

どうも!西村祐二@大阪です。

最近、オープンベータとして発表された「Salesforce DX」についていろいろ調べています。
その「Salesforce DX」では「Scratch Org」という開発環境が提供されました。
今回は「Scratch Org」を使って「Salesforce DX」で想定されている開発フローを試してみたいと思います。

Scratch Orgとは

こちらの公式ページに記載の文章を引用すると下記になります。

これは、Salesforce コードとメタデータのソース主導で、使い捨て可能なデプロイメントです。 scratch org は完全に構成可能で、開発者は異なるエディションをさまざまな機能とプリファレンスでエミュレートできるため、開発プロセスにおける開発者の生産性とコラボレーションの促進に重要な役割を果たします。 また、自動化されたテストや包括的な継続統合スイートの実装の一部として使用することもできます。

実際に触ってみた印象はDockerコンテナ的な印象をうけました。
すぐにクローン環境ができるので使い勝手がよいです。
さっそく、「Scratch Org」を使ってみましょう!

開発の主な流れ

基本となる主な開発のフローは下記となります。

  1. ローカルプロジェクト作成
  2. Scratch Org作成
  3. ローカルでプログラミング or GUIからScratch Org更新
  4. ローカルプロジェクトとScratch Orgを同期
  5. 手順3,4を繰り返す
  6. テスト
  7. 実環境へデプロイ

事前準備

下記リンクを参考にこちらをご準備ください。

・DevHubが有効なSalesforce環境
・Salesforce cli

ベータ版Salesforce DXをセットアップしてみた

環境

mac : macOS Sierra 10.12.5
Salesforce cli : sfdx-cli/5.7.6-d42cf65 (darwin-amd64) go1.7.3 sfdxstable
Salesforce : v40

プロジェクトの作成

「Salesforce DX」で開発をはじめるときは
まず、ローカルにプロジェクトを作成します。
下記コマンドを打つと雛形ファイルが作成されます。

$ sfdx force:project:create -n testdx

target dir = /Users/nishimura.yuji/study/salesforcedx
   create testdx/sfdx-project.json
   create testdx/README.md
   create testdx/config/project-scratch-def.json

このファイル群をGithubなどのVCSで管理し開発状況を共有したりできます。

Scratch Orgの作成

次にプロジェクトと紐付けする「Scratch Org」を作成します。
エイリアス名をtestscratchとして、先程作成したプロジェクト内にある
コンフィグファイルを指定し作成します。

$ sfdx force:org:create -s -f config/project-scratch-def.json -a testscratch

Successfully created scratch org: 00YY000000XXXXXXX, username:xxxxxxxxxx@yyyyyyyyy.net

-sオプションは作成するScratch Orgをデフォルトとして設定します。

下記コマンドにて、現在のDevHubやScratch Orgを確認できます。

$ sfdx force:org:list
=== Organizations
     ALIAS       USERNAME                                    ORG ID              CONNECTED STATUS
───  ──────────  ──────────────────────────────────────────  ──────────────────  ────────────────
(D)  DevHub      xxxxxxxxxx@yyyyyyyyyyy.jp                   00xxx000000xxxxxxx  Connected


     ALIAS          SCRATCH ORG NAME        USERNAME                                      ORG ID              EXPIRATION DATE
───  ─────────────  ──────────────────────  ────────────────────────────────────────────  ──────────────────  ───────────────
(U)  testscratch    xxxxxxxxxxxxxx Company  xxxxxxxxxxxxxxxxx@nxxxxxxxxxxxxxxx_xxxxx.net  00xx000000xxxxxxxx  2017-07-14

Scratch Orgにログイン

「Scratch Org」作成時-sオプションを指定したので
特にScratch Orgのエイリアスを指定せずにログインできます。

$ sfdx force:org:open
or
$ sfdx force:org:open -u testscratch

コマンド実行後はブラウザが開き
いつもと変わらないSalesforceの画面に来ているかと思います。
違う所としてはURLが「Scratch Org」用のユニークなアドレスになっているぐらいです。

カスタムオブジェクトを作ってみる

作成した「Scratch Org」にログインできたら、その環境でカスタムオブジェクトを作成してみましょう。
ここでは、取引先の情報や取引先を登録する際に「AWSの利用費」の項目を追加したいと想定します。

下記が項目を追加する手順です。

  • SalesforceのGUI上に移動します。
  • クイック検索欄から検索し「オブジェクトマネージャ」を選択します。
  • 取引先をクリックします。
  • 「項目とリレーション」セクションで、「新規」をクリックします。
  • 「数値」を選択し、「次へ」をクリックします 。
  • 項目の表示ラベル:AWS利用費,桁数:18,小数点の位置:0,項目名:AWS を入力し、「次へ」をクリックします。
  • 「次へ」をクリックして「標準ユーザー」のみ選択します。
  • 「次へ」をクリックし、その後、保存します。

次に、新しく作成されたAWS利用費欄へのフィールドレベルのアクセスを制御する権限セットを定義します。

  • 「クイック検索」から「権限セット」を選択します。
  • 新規をクリックします。
  • 「ラベル」には、「AWS」を入力します。
  • 「保存」をクリックします。
  • 「アプリケーション」の「オブジェクトの設定」をクリックします。
  • 取引先をクリックします。
  • 編集をクリックします。
  • 「AWS利用費」で、「参照アクセス権」「編集アクセス権」を選択します。
  • 「保存」をクリックします。

次に、この権限セットをユーザに割り当てましょう。CLIで次のコマンドを実行します。

$ sfdx force:user:permset:assign -n AWS

Permission Set successfully assigned

GUIでの変更箇所をローカルプロジェクトにpull

GUIで行ったScratch Orgの変更をローカルプロジェクトに同期させます。

$ sfdx force:source:pull

STATE    FULL NAME                               TYPE           PROJECT PATH
───────  ──────────────────────────────────────  ─────────────  ─────────────────────────────────────────────────────────────────────────────────────
Changed  Account                                 CustomObject   force-app/main/default/objects/Account.object-meta.xml
Add      Account-Account Layout                  Layout         force-app/main/default/layouts/Account-Account Layout.layout-meta.xml
Add      Account-Account %28Sales%29 Layout      Layout         force-app/main/default/layouts/Account-Account %28Sales%29 Layout.layout-meta.xml
Add      Account-Account %28Support%29 Layout    Layout         force-app/main/default/layouts/Account-Account %28Support%29 Layout.layout-meta.xml
Add      Account-Account %28Marketing%29 Layout  Layout         force-app/main/default/layouts/Account-Account %28Marketing%29 Layout.layout-meta.xml
Add      AWS                                     PermissionSet  force-app/main/default/permissionsets/AWS.permissionset-meta.xml

上記のように変更箇所のメタデータがファイルとしてダウンロードされます。
ベストプラクティスとしてはローカルのプロジェクトに持ってきたソースをGithubなどのVCSにコミットするのがいいでしょう。Scratch Orgは一時的な環境なので、ローカルに保存した作業のバックアップが常に必要です。

サンプルデータ作成

Scratch OrgのGUI画面に戻り、「アプリランチャー」をクリックして「取引先」を選択し 、「新規」をクリックします。
下記画像のように、「取引先名:hoge、AWS利用費:10000」としてサンプルデータを作成します。

2017-07-08 1.44.20

※取引先を追加する際に作成したAWS利用費の項目がない場合は
ブラウザをリロードして再度確認してみてください。
それでも表示されない場合はページレイアウトを確認してみてください。

CLIからSalesforceに登録されている情報を確認

下記コマンドのようにcliからクエリーをなげ情報を取得することができます。
先程GUIより追加した情報もしっかり取得できていることがわかります。

sfdx force:data:soql:query -q "SELECT AWS__c, Name FROM Account" -u testscratch

AWS__C  NAME
──────  ───────────────────────────────────
10000   hoge
null    Edge Communications
null    Burlington Textiles Corp of America
null    Pyramid Construction Inc.
null    Dickenson plc
null    Grand Hotels & Resorts Ltd
null    United Oil & Gas Corp.
null    Express Logistics and Transport
null    University of Arizona
null    United Oil & Gas, UK
null    United Oil & Gas, Singapore
null    GenePoint
null    sForce
Total number of records retrieved: 13.

サンプルデータをエクスポート

Salesforce DXには、Scratch Orgから簡単にデータを取得してローカルプロジェクトに取り込むコマンドが用意されています。そのデータをVCSにコミットすることができます。そうすれば、他の開発者が新しいScratch Orgを起動したときにロードすることができます。

エクスポートしたファイルの保存先ディレクトリ作成
$ mkdir data

エクスポート
$ sfdx force:data:tree:export -q "SELECT Name, AWS__c FROM Account WHERE AWS__c != NULL" -d ./data

Wrote 1 records to data/Account.json

エクスポートしたファイルを確認する。

$ data/Account.json
{
    "records": [
        {
            "attributes": {
                "type": "Account",
                "referenceId": "AccountRef1"
            },
            "Name": "hoge",
            "AWS__c": 10000
        }
    ]
}

テスト:動作確認

大規模な開発になってくると実環境へデプロイするときと同じ条件にするために新しいScratch Orgを作成し、今まで作成したプログラムをプッシュし動作確認するのがよいでしょう。

テスト用のScratch Org「checkorg」を作成します。

$ sfdx force:org:create -f config/project-scratch-def.json -a checkorg
Successfully created scratch org: 00xXXX000000XXXXX, username: xxxxxxxx@xxxxxx.net

ローカルプロジェクトを作成した「checkorg」にプッシュします。

$ sfdx force:source:push -u checkorg
STATE  FULL NAME                               TYPE           PROJECT PATH
─────  ──────────────────────────────────────  ─────────────  ──────────────────────────────────────────────────────────────────────────────────────────────
Add    Account-Account %28Marketing%29 Layout  Layout         force-app/main/default/layouts/Account-Account %28Marketing%29 Layout.layout-meta.xml
Add    Account-Account %28Sales%29 Layout      Layout         force-app/main/default/layouts/Account-Account %28Sales%29 Layout.layout-meta.xml
Add    Account-Account %28Support%29 Layout    Layout         force-app/main/default/layouts/Account-Account %28Support%29 Layout.layout-meta.xml
Add    Account-Account Layout                  Layout         force-app/main/default/layouts/Account-Account Layout.layout-meta.xml
Add    Account                                 CustomObject   force-app/main/default/objects/Account/Account.object-meta.xml
Add    Account.AWS__c                          CustomField    force-app/main/default/objects/Account/fields/AWS__c.field-meta.xml
Add    Account.AccountNumber                   CustomField    force-app/main/default/objects/Account/fields/AccountNumber.field-meta.xml
Add    Account.AccountSource                   CustomField    force-app/main/default/objects/Account/fields/AccountSource.field-meta.xml
.
.
.

権限を付与します。

$ sfdx force:user:permset:assign -n AWS -u checkorg
Permission Set successfully assigned

サンプルデータをインポートします。

$ sfdx force:data:tree:import --sobjecttreefiles data/Account.json -u checkorg
=== Import Results
REFERENCE ID  TYPE     ID
────────────  ───────  ──────────────────
AccountRef1   Account  0010m00000610GRAAY

「checkorg」にログインして動作確認します。

$ sfdx force:org:open -u checkorg

Scrartch Org以外の環境にデプロイ

メタデータ変換

Scrartch Org環境ではメタデータを小さなファイルに分割して管理していますが、
通常はひとつのファイルに保存されています。
そのため、Scratch Org以外の環境にデプロイする場合は
メタデータを変換する必要があります。
ソースをMetadata APIで使用できる形式に変換します。

ディレクトリ作成
$ mkdir mdapioutput

$ sfdx force:source:convert -d mdapioutput
Source was successfully converted to metadata api format and written to the location: /Users/nishimura.yuji/study/salesforcedx/testdx/mdapioutput

デプロイ

Scratch Orgでない通常のSalesforce環境にデプロイします。
デプロイ先はDevHubとします。
下記コマンドより、現在の状況を確認できます。

また、デプロイ内容にLightningコンポーネントが含まれている場合は
下記リンクを参考にドメイン設定を行っておく必要があります。

「私のドメイン」の設定

環境確認
$ sfdx force:org:list

DevHubにデプロイします。

$ sfdx force:mdapi:deploy -d mdapioutput/ -u DevHub -w 100

sfdx force:mdapi:deploy -d mdapioutput/ -u DevHub -w 100
7910 bytes written to /var/folders/cv/xxxxxxxxxxxxxxxxxxxxx/T/mdapioutput.zip using 62.311ms
Deploying /var/folders/cv/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/T/mdapioutput.zip...

=== Status
Status:  InProgress
jobid:  xxxxxxxxxxxxxxx
Component errors:  0
Components deployed:  0
Components total:  7
Tests errors:  0
Tests completed:  0
Tests total:  0
Check only: false


Deployment finished in 1000ms

=== Result
Status:  Succeeded
jobid:  xxxxxxxxxxxxxxxxxxxxxxx
Completed:  2017-07-08T02:42:56.000Z
Component errors:  0
Components deployed:  3
Components total:  3
Tests errors:  0
Tests completed:  0
Tests total:  0
Check only: false

※デプロイが上手くいかない場合は変換したメタデータ内にある
package.xmlやobjectsディレクトリ内にあるファイルを更新した箇所のみに修正すると
うまくいくかもしれません。


ユーザに権限を付与します。

$ sfdx force:user:permset:assign -n AWS -u DevHub
Permission Set successfully assigned

ログインしデプロイができているか確認します。

$ sfdx force:org:open -u DevHub

さいごに

いかがだったでしょうか。

Scratch OrgはGUIでしかできないことはGUIで行い
ローカルとの差分をpullすることでプロジェクトフォルダに
メタデータがダウンロードされ同期がとれる仕組みとなっておりかなり楽だなと感じました。
しかし、Scratch Orgで作成したプログラムを
Scratch Org以外の環境にデプロイするときは少し手間がかかるため
スクリプトをかいて自動化しておくのがよいかもしれません。