Salesforce の Sandbox でソース追跡(ベータ)を試してみた。

この記事では、 Salesforce の Sandbox でソース追跡する方法ご紹介します。
ソース追跡はスクラッチ組織で開発を行う際に、組織上での変更とローカルプロジェクト上での変更を自動で検出し、開発中に行ったすべての変更作業を漏れなくテスト環境や本番環境にリリースできるようにするための仕組みです。この機能が(現在はベータですが)サンドボックスでも利用できるようになったため、変更セットを使った開発に代わる新たな開発手法として期待されています。

> Salesforce の Sandbox でソース追跡する機能は、本記事の投稿時点はベータ提供中の機能となります。

##本番組織でサンドボックスのソース追跡を有効化する
Sandbox でソース追跡をするには、Sandbox を作成する本番組織で `設定 > 開発 > DevHub > Enable Source Tracking in Developer and Developer Pro Sandboxes (BETA)` を予め有効化しておく必要があります。

![スクリーンショット_2020-12-25_11_07_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26378/35e5bfe3-4236-cbe5-8022-deb1a440cac9.png)

##Sandbox を作成する
Sandbox は `設定 > 環境 > Sandbox` から UI ベースで作成することもできますが、今回はせっかくなので Salesforce CLI で Sandbox を作成する方法を試してみます。

以下のコマンドでは本番組織にログインした後、その組織に対して MyDevSbx という名前の Developer Sandbox を作成しています。Sandbox の作成には数分かかるので `-w 30` を指定し、コマンド実行のタイミアウト時間を 30 分に延長(デフォルトは 6 分)しています。また、Sandbox にログインするためのユーザー名が自動で生成されますが、覚えづらいので `-a` で別名をつけておきます。

```bash
# Salesforce CLI で本番組織にログインし、MyOrg という別名をつけておく
$ sfdx force:auth:web:login -a MyOrg

# MyOrg に対し Sandbox を作成し、DevSbxForSourceTracking という別名をつけておく
$ sfdx force:org:create -u MyOrg -t sandbox sandboxName=MyDevSbx licenseType=Developer -a DevSbxForSourceTracking -w 30

> Name                         Value
> ───────────────────────────  ─────────────────────────────────
> Id                           0GRXXXXXXXXXXXXXXX
> SandboxName                  MyDevSbx
> Status                       完了
> CopyProgress                 100
> Description
> LicenseType                  DEVELOPER
> SandboxInfoId                0GQXXXXXXXXXXXXXXX
> SourceId
> SandboxOrg                   00DXXXXXXXXXXXX
> Created Date                 2020-12-26T06:30:48.000+0000
> ApexClassId
> Authorized Sandbox Username  user001@example.com.mydevsbx

# Sandbox が作成できたら、確認のためログインしてみる
$ sfdx force:org:open -u DevSbxForSourceTracking
```

ヘッダーに `Sandbox: MyDevSbx` と表示される Sandbox 組織が開いたら成功です。
![スクリーンショット 2020-12-26 15.57.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26378/bd9a9a19-65dc-c778-f9ca-f4066a71f6a3.png)

## Sandbox のソース追跡を試す
それでは、今作成した Sandbox でソース追跡が有効になっているかを確認してみます。
Sandbox 上で `取引先(Account)` オブジェクトに `テスト(Test__c)` という項目を追加しました。
![スクリーンショット 2020-12-26 16.05.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26378/0b28775c-d639-4b4d-ce94-05bda5105807.png)

そして、ソース追跡の状況を確認します。
下のように、`Account.Test__c` が `Remote` で `Add` された事が検出できているので、正常にソース追跡できています。

```bash
$ sfdx force:source:status -u DevSbxForSourceTracking
> === Source Status
> STATE       FULL NAME        TYPE         PROJECT PATH
> ──────────  ───────────────  ───────────  ────────────
> Remote Add  Account.Test__c  CustomField
```

最後にこの変更内容をソース形式のメタデータとしてローカルプロジェクトに取り込みます。

```bash
$ sfdx force:source:pull -u DevSbxForSourceTracking
=== Pulled Source
STATE  FULL NAME        TYPE         PROJECT PATH
─────  ───────────────  ───────────  ────────────────────────────────────────────────────────────────────
Add    Account.Test__c  CustomField  force-app/main/default/objects/Account/fields/Test__c.field-meta.xml
```

下のように、 `Test__c.field-met.xml` という名前のメタデータがローカルプロジェクト内に取得できました。このように、Sandbox 上で行った変更も自動で検出しローカルのプロジェクトフォルダ内に取り込めるので、リリース漏れの心配がなくなりますね。

![スクリーンショット 2020-12-26 16.14.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26378/a3b44b91-cc75-d7ad-412f-bbeb25c3a49d.png)


## おまけ: Sandbox のソース追跡を使った開発でよく使うコマンド
一緒に覚えておきたいよく使うコマンドたちもご紹介しておきます。

```bash
# Sandbox 上での変更は pull することでローカルプロジェクトに取り込める
$ sfdx force:source:pull -u DevSbxForSourceTracking

# ローカルプロジェクトでの変更は、push することで Sandbox に反映できる。
$ sfdx force:source:push -u DevSbxForSourceTracking

# Sandbox 上の既存のメタデータを取り込みたい場合は retrieve が使える
$ sfdx force:source:retrieve -u DevSbxForSourceTracking -m ApexClass:MyApexClass 
```

## 参考

- [Salesforce DX Developer Guide | Sandboxes](https://developer.salesforce.com/docs/atlas.en-us.228.0.sfdx_dev.meta/sfdx_dev/sfdx_dev_sandboxes.htm)
- [Salesforce CLI Command Reference](https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference.htm)