Salesforce CLIマスター:現代開発のためのsfdx開発者ガイド

役割:Salesforce 開発者


背景と応用シーン

Salesforceプラットフォームでの開発は、長年にわたり変更セット(Change Set)やAnt移行ツール(Ant Migration Tool)を中心とした、組織(Org)主導の開発モデルが主流でした。しかし、現代のソフトウェア開発では、バージョン管理システム(VCS)との連携、自動化、そして継続的インテグレーション/継続的デリバリー(CI/CD)が不可欠となっています。この流れに対応するため、Salesforceはソース駆動開発(Source-Driven Development)モデルを提唱し、その中核を担うツールとして Salesforce CLI (Command Line Interface、コマンドラインインターフェース) を提供しました。本記事では、Salesforce開発者の視点から、この強力なツールである sfdx の基本から応用までを解説します。

開発者として、私たちは日々の業務で以下のような課題に直面します:

  • 環境構築の煩雑さ: 新しい機能開発やバグ修正のために、クリーンな開発環境を迅速に準備したい。
  • 手動デプロイの非効率性: メタデータを手動で選択し、変更セットを作成・アップロードするプロセスは時間がかかり、ミスも発生しやすい。
  • チーム開発でのコンフリクト: 複数の開発者が同じSandboxで作業すると、意図しない上書きやコンフリクトが発生する。
  • テストとデータの準備: Apexテストの実行や、テストデータの投入を手動で行うのは手間がかかる。

Salesforce CLI(sfdx)は、これらの課題を解決するための強力なソリューションです。コマンドラインからSalesforce組織の操作を自動化し、スクリプト化することで、開発ライフサイクル全体を劇的に効率化します。特に、Scratch Orgs(スクラッチ組織)と呼ばれる一時的な開発環境と組み合わせることで、各開発者は独立したクリーンな環境で作業でき、ソースコードを信頼できる唯一の情報源(Single Source of Truth)として扱うことが可能になります。

原理説明

Salesforce CLIの力を最大限に引き出すためには、その背景にあるいくつかの重要な概念を理解する必要があります。

Dev HubとScratch Orgs

Dev Hub(開発ハブ)は、Scratch Orgsを作成および管理するための特別な機能を持つ本番組織またはDeveloper Edition組織です。開発チームの中心的な管理拠点となり、どの開発者がどのScratch Orgを使用しているかを追跡します。

Scratch Orgs(スクラッチ組織)は、Dev Hubから作成される、ソース駆動型の一時的なSalesforce環境です。設定ファイルに基づいて数分で作成でき、機能開発、テスト、レビューが完了すれば破棄できます。これにより、常にクリーンな状態で開発を開始でき、環境依存の問題を最小限に抑えられます。Scratch Orgはソース追跡機能が有効になっており、ローカルのソースファイルと組織内のメタデータの差分をCLIが自動で検知してくれます。

Salesforce DXプロジェクト

sfdxコマンドは、特定のディレクトリ構造を持つSalesforce DXプロジェクト内で実行されます。プロジェクトのルートには `sfdx-project.json` という設定ファイルが存在し、プロジェクトの名前、APIバージョン、ログインURLなどの重要な情報が定義されています。メタデータは `force-app/main/default` ディレクトリ以下に、Apexクラスは `classes`、Visualforceページは `pages` のように、種類ごとに整理されたフォルダに格納されます。

my-sfdx-project/
├── .sfdx/
├── config/
│   └── project-scratch-def.json
├── force-app/
│   └── main/
│       └── default/
│           ├── classes/
│           │   └── MyController.cls
│           ├── lwc/
│           │   └── myComponent/
│           └── objects/
└── sfdx-project.json

この標準化された構造により、開発者はGitなどのバージョン管理システムでコードを容易に管理できます。

ソース追跡とコマンド

sfdxの強力な機能の一つがソース追跡です。Scratch Orgでは、ローカルのファイルと組織のメタデータのどちらが最新かをCLIが追跡しています。これにより、以下の主要なコマンドが利用できます。

  • `sfdx force:source:push`: ローカルでの変更を検出し、差分のみをScratch Orgにプッシュ(デプロイ)します。
  • `sfdx force:source:pull`: Scratch Org上での宣言的な変更(例:項目作成)を検出し、ローカルのプロジェクトにプル(取得)します。

一方、Sandboxや本番組織のようなソース追跡が有効でない組織に対しては、従来のメタデータAPIをラップしたコマンドを使用します。

  • `sfdx force:source:deploy`: 指定したメタデータを組織にデプロイします。
  • `sfdx force:source:retrieve`: 指定したメタデータを組織から取得します。

開発者としては、日々の開発はScratch Orgと`push/pull`で行い、リリース準備が整った段階で`deploy`コマンドを使って統合環境(Sandbox)や本番組織にデプロイするのが一般的なワークフローです。

示例代码

ここでは、Salesforce開発者が日常的に使用する基本的なsfdxコマンドのワークフローを、公式ドキュメントに基づいたコード例とともに紹介します。

1. Dev Hubへの認証とプロジェクト作成

まず、Dev Hub組織にCLIを接続します。`--setdefaultdevhubusername`フラグを付けることで、この組織がScratch Orgを作成する際のデフォルトのハブとして設定されます。

# Dev Hub組織へのブラウザベースのログイン
# --setaliasフラグで、この接続に別名(エイリアス)を設定します
sfdx auth:web:login --setalias MyDevHub --setdefaultdevhubusername

次に、新しいSalesforce DXプロジェクトを作成します。

# 'MyProject'という名前で新しいプロジェクトを作成
sfdx force:project:create --projectname MyProject
# 作成されたディレクトリに移動
cd MyProject

2. Scratch Orgの作成と設定

Scratch Orgの定義ファイル(`config/project-scratch-def.json`)を編集して、必要な機能や設定を定義します。例えば、Person AccountsとSalesforce Functionsを有効にする場合は以下のようになります。

{
  "orgName": "My Company",
  "edition": "Developer",
  "features": ["PersonAccounts", "Functions"],
  "settings": {
    "lightningExperienceSettings": {
      "enableS1DesktopEnabled": true
    },
    "securitySettings": {
      "passwordPolicies": {
        "enableSetPasswordInApi": true
      }
    }
  }
}

この定義ファイルを使ってScratch Orgを作成します。

# project-scratch-def.jsonに基づいてScratch Orgを作成
# --setaliasでこの組織の別名を設定
# --durationdaysで有効期限(1~30日)を設定
sfdx force:org:create --definitionfile config/project-scratch-def.json --setalias MyScratchOrg --durationdays 7

3. ソースコードのプッシュとApexテストの実行

ローカルでApexクラスやLightning Web Componentを作成した後、`force:source:push`コマンドでScratch Orgにデプロイします。

# ローカルの変更をデフォルトのScratch Orgにプッシュ
sfdx force:source:push

デプロイが完了したら、品質を担保するためにApexテストを実行します。

# すべてのApexテストを実行し、結果を人間が読みやすい形式で表示
# --resultformat human は結果をコンソールに分かりやすく出力します
# --wait 10 はテストが完了するまで最大10分間待機します
sfdx force:apex:test:run --resultformat human --wait 10

4. 権限セットの割り当てとデータのインポート

開発した機能にアクセスするためには、ユーザーに権限セットを割り当てる必要があります。

# 'MyPermSet'という名前の権限セットをデフォルトユーザーに割り当て
sfdx force:user:permset:assign --permsetname MyPermSet

テストに必要なデータを投入するために、sfdxのデータ操作コマンドを利用します。まず、関連するオブジェクトのデータをエクスポートするクエリを記述したファイル(`data/sample-query.soql`)を用意します。

SELECT Id, Name, (SELECT Id, LastName, FirstName FROM Contacts) FROM Account WHERE Name = 'Sample Account'

このクエリを使ってデータをエクスポートし、別の組織にインポートできます。

# SOQLクエリに基づいてデータをJSON形式でエクスポート
sfdx force:data:tree:export --query "SELECT Name, Industry FROM Account LIMIT 5" --outputdir ./data --plan

# エクスポートされたJSONファイルを使ってデータをインポート
sfdx force:data:tree:import --plan ./data/Account-Plan.json

これらのコマンドをスクリプト化することで、新しいScratch Orgを作成した際に、環境設定、ソースコードのデプロイ、権限付与、データ投入までを完全に自動化できます。

注意事項

Salesforce CLIを効果的に利用するためには、いくつかの注意点を理解しておく必要があります。

権限

Dev Hub機能を有効にしたり、Scratch Orgを作成したりするには、適切な権限が必要です。Dev Hub組織では「Dev Hub」権限、API経由でメタデータを操作するためには「APIの有効化」および「すべてのデータの編集」権限が必要になる場合があります。

API制限

sfdxコマンドはバックグラウンドでSalesforce APIをコールします。そのため、組織のAPIコール制限(API Call Limits)を消費します。CI/CDパイプラインなどで大量のコマンドを頻繁に実行する場合は、API消費量に注意し、組織の制限を超えないように設計する必要があります。

エラー処理

デプロイやテスト実行のコマンドは失敗することがあります。スクリプトを組む際には、コマンドの終了コード(exit code)を確認し、エラーが発生した場合に適切な処理(ログ出力、通知など)を行うように実装することが重要です。例えば、`sfdx force:source:deploy`は成功時に`0`、失敗時に`1`を返します。

CLIとプラグインのバージョン

Salesforce CLIは定期的にアップデートされ、新機能の追加やバグ修正が行われます。安定した開発環境を維持するためには、CLI本体(`@salesforce/cli`)とプラグイン(例:`@salesforce/sfdx-scanner`)を定期的に最新バージョンに更新することが推奨されます。`sfdx update`コマンドで簡単に更新できます。

まとめとベストプラクティス

Salesforce CLI (sfdx) は、現代のSalesforce開発者にとって必須のツールです。ソース駆動開発モデルへの移行を支援し、開発、テスト、デプロイのプロセスを自動化・効率化することで、開発の生産性と品質を飛躍的に向上させます。

以下に、開発者としてのベストプラクティスをまとめます。

  1. バージョン管理を徹底する: すべてのメタデータはGitなどのバージョン管理システムで管理し、`sfdx-project.json`を含めてリポジトリにコミットします。これにより、プロジェクトの構成とソースコードが一元管理されます。
  2. Scratch Orgを積極的に活用する: 機能開発やバグ修正は、必ず新しいScratch Orgを作成して行います。これにより、他の開発者とのコンフリクトを避け、クリーンな環境で作業できます。
  3. スクリプトで定型作業を自動化する: Scratch Orgの作成、ソースのプッシュ、権限割り当て、データ投入など、一連のセットアップ作業をシェルスクリプトやnpm scriptsにまとめて自動化します。
  4. エイリアス(別名)を賢く使う: `sfdx force:org:list`で確認できる組織のエイリアスを適切に設定することで、コマンド実行時のターゲット組織の切り替えが容易になり、誤操作を防ぎます。
  5. CI/CDパイプラインに組み込む: Jenkins, GitHub Actions, GitLab CIなどのツールとSalesforce CLIを連携させることで、コードのマージ時に自動でテストを実行したり、特定のブランチへのマージをトリガーにしてSandbox環境へ自動デプロイしたりする仕組みを構築します。

Salesforce CLIを使いこなすことは、単なるコマンドの学習に留まりません。それは、よりモダンで、堅牢で、スケーラブルな開発プラクティスをチームに導入することを意味します。ぜひ今日からsfdxを日々の開発業務に取り入れ、そのパワフルな機能を体感してください。

コメント