見出し画像

Lightning Flow Scannerで何が確認できるのか

こんにちは、co-meetingにてエンジニアしているハナミズキです。
今回のネタはLightning Flow Scannerです。

Lightning Flow Scannerは、Salesforceのフローを解析し、問題のある箇所をお知らせするツールです。
このツールについてはSalesforce Developerのyoutubeチャンネル codeLive 「codeLive: How to Optimize Flows Using Lightning Flow Scanner」で紹介されています。また、去年のQiitaのアドベントカレンダーでは「未使用変数を見逃すな!lightning-flow-scannerでフローのレビューを効率化」という記事で紹介されており、こちらも参考になりました。
私自身は今まで使ったことがなかったため、今回改めて何が確認できるのか調べ、その結果を紹介します。


1.Lightning Flow Scannerの概要

Lightning Flow Scannerは、Salesforceのフローを解析して問題のある箇所をお知らせしてくれるツールです。

Lightning Flow Scannerの開発には、Salesforce内部のスタッフと外部の専門家が共同で開発しているようです。

Lightning Flow Scannerは、フローにおける以下のような一般的な問題を特定して対処するのに活用できるツールです。

  • パフォーマンスに問題のある箇所は存在しないか

  • 脆弱性が存在していないか

  • 正常な動きだけではなく異常が発生した時も考慮して作られているか

  • 未使用変数が残ったままになっていないか

現在のLightning Flow Scannerは、Salesforce CLI プラグインもしくは、VSCode 拡張プラグインの形式で一般提供されています。

2.検知してくれる問題一覧

現時点では以下15種類の問題を検出してくれます。
  ※()内は私なりに解釈しました。

  1. Auto Layout(自動レイアウトではない)

  2. Copy API Name(コピーされたAPI参照名が存在する)

  3. DML Statement In A Loop(ループの中でDML操作している)

  4. Duplicate DML Operation(画面フロー間でDML操作が重複してしまう)

  5. Flow Naming Convention(フローの名前が命名規則から外れている)

  6. Hardcoded Id(ハードコートされたIDが存在する)

  7. Inactive Flow(フローが有効化されていない)

  8. Missing Flow Description(フローに説明が書いてない)

  9. Missing Fault Path(失敗時のパスが存在しない)

  10. Missing Null Handler(Nullチェックが必要ケースでチェックしていない)

  11. Outdated API Version(指定APIバージョンより古いバージョンである)

  12. Process Builder(フローに移行していないプロセスビルダーが存在する)
    ※現在プロセスビルダーを作成できないようになったため再現させることができませんでした。

  13. SOQL Query In A Loop(ループの中でレコード取得してる)

  14. Unconnected Element(接続されていない要素が存在する)

  15. Unused Variable(未使用の変数が存在する)

これら15種類の問題については、以下のページに詳細な説明が記載されているため気になる方は参考にしてみてください。

■lightning-flow-scanner-core | A rule engine capable of conducting static analysis on the metadata associated with Salesforce Lightning Flows, Process Builders, and Workflows.
https://lightning-flow-scanner.github.io/lightning-flow-scanner-core/

また、デモ用として、サンプルのフローも用意されているので、気になる方は参考にしてみてください。

■Lightning Flow Scanner Demo Repository - https://github.com/Lightning-Flow-Scanner/lightning-flow-scanner-example-flows

3.インストール方法

事前準備

  • Salesforce CLIのインストール: Salesforce CLIをインストールし、最新バージョンに更新します。

  • VSCodeのインストール: VSCodeをインストールし、Salesforce Extension Packを追加します。(関連: VS Code 向け Salesforce 拡張機能のインストール

Salesforce CLI プラグインの場合

sfdxコマンドを使ってインストールする場合

sfdx plugins:install lightning-flow-scanner

npmコマンドを使ってインストールする場合

npm install -g lightning-flow-scanner

VSCode 拡張プラグインの場合

VSCodeの拡張機能: マーケットプレースにて、「Lightning Flow Scanner」を検索すると対象の「Install」をクリックしてインストールしてください。
インストール成功すると左側のアクティビティバーにロボットアイコンが表示されます。

4.スキャンの流れ

解析したいフローを用意

Salesforce組織で事前にフローを作成し、解析したいフローを手元にダウンロードする必要があります。

方法は色々とありますが、以下のようなやり方があります。

  • Org Browserを使って「Flows」を選択し、「組織からソースを取得」アイコンをクリックしてダウンロードする。

  • sfdxコマンド「sf project retrieve start --metadata Flow:<フローのAPI参照名> -o <組織のエイリアス名>」を実行してダウンロードする。

コマンド例:
sf project retrieve start --metadata Flow:FlowTrigger_Account_Update -o playground_scratch

いずれも事前にDevHub認証が必要です。また、VSCodeの機能を使う場合は、デフォルトの組織を認証しておく必要があります。

これらは事前知識としてSalesforceの開発知識が必要であるため、
馴染みがない方は、Trailheadのプロジェクト「はじめての Salesforce 開発」をやってみることをお勧めします。

5.スキャンのやり方と実行結果

SFDXコマンド(CLI)を使ったLightning Flow Scannerの実行方法

事前に検知するルールを記載した設定ファイルを作成します。
設定ファイルには、実行するルールのリストを指定することができます。また、カスタムルールの追加や、特定のルールに違反した場合の重大度の定義、一部のルールに関連する属性の設定も可能です。

今回は以下のようなファイルを生成します。

// flow-scanner.json
{
  "rules": {
    "AutoLayout": {
      "severity": "warning"
    },
    "APIVersion": {
      "severity": "warning",
      "expression": ">50"
    },
    "CopyAPIName": {
      "severity": "warning"
    },
    "DMLStatementInLoop": {
      "severity": "warning"
    },
    "DuplicateDMLOperation": {
      "severity": "warning"
    },
    "FlowName": {
      "severity": "warning",
      "expression": "[A-Za-z0-9]+_[A-Za-z0-9]+"
    },
    "HardcodedId": {
      "severity": "warning"
    },
    "InactiveFlow": {
      "severity": "warning"
    },
    "FlowDescription": {
      "severity": "note"
    },
    "MissingFaultPath": {
      "severity": "warning"
    },
    "MissingNullHandler": {
      "severity": "warning"
    },
    "ProcessBuilder": {
      "severity": "warning"
    },
    "SOQLQueryInLoop": {
      "severity": "warning"
    },
    "UnconnectedElement": {
      "severity": "warning"
    },
    "UnusedVariable": {
      "severity": "error"
    }
  }
}

ルールファイルの書き方は以下を参考にしてください。
https://lightning-flow-scanner.github.io/lightning-flow-scanner-core/
Custom Rule Creation Guideなどカスタムルールを作成・追加する方法も公開されているため、柔軟なルール設定ができそうです。

コマンドを実行してスキャンします。

特定のフローのみをチェックしたい場合は、以下のような引数でコマンドを実行してください。

sfdx flow:scan -u <組織のエイリアス名> -p <フローのパス> -c <設定ファイルのパス>

特定のフォルダ内に含まれる全てのフローをチェックしたい場合は、以下のような引数でコマンドを実行してください。

sfdx flow:scan -u <組織のエイリアス名> -d <フローのフォルダパス> -c <設定ファイルのパス>

今回は以下コマンドを実行します。

コマンド例:
sfdx flow:scan -u playground_scratch -d force-app/main/default/flows/ -c ./config/flow-scanner.json

スキャン結果は以下のとおりです。


Retrieving Metadata...... Retrieve Completed ✔.
Identified 3 flows to scan... Scan complete

=== Flow: 取 (4 results)
Type: AutoLaunchedFlow

RULE                      TYPE           NAME            SEVERITY
────────────────────────  ─────────────  ──────────────  ────────
Outdated API Version      apiVersion     49              warning
Missing Flow Description  description    undefined       note
Missing Fault Path        recordLookups  get_Account     warning
Missing Fault Path        recordUpdates  update_Account  warning

=== Flow: 従 (1 results)
Type: AutoLaunchedFlow

RULE           TYPE    NAME  SEVERITY
─────────────  ──────  ────  ────────
Inactive Flow  status        warning

=== Flow: 不 (17 results)
Type: Flow

RULE                      TYPE           NAME                  SEVERITY
────────────────────────  ─────────────  ────────────────────  ────────
Auto-Layout Mode          CanvasMode     FREE_FORM_CANVAS      warning
Duplicate DML Operation   screens        X2                    warning
Flow Naming Convention    name           IncompleteScreenFlow  warning
Hardcoded Id              recordLookups  getAccountTest        warning
Inactive Flow             status                               warning
Missing Flow Description  description    undefined             note
Missing Fault Path        recordLookups  get_Account           warning
Missing Fault Path        recordCreates  create_CusObj         warning
Missing Fault Path        recordLookups  get_CusObj            warning
Missing Fault Path        recordCreates  X1                    warning
Missing Fault Path        recordLookups  getAccountTest        warning
Missing Null Handler      recordLookups  get_Account           warning
Missing Null Handler      recordLookups  get_CusObj            warning
Missing Null Handler      recordLookups  getAccountTest        warning
Unconnected Element       screens        screen_notConnect     warning
Unused Variable           variables      var_cusObjIds         error
Unused Variable           variables      var_tmpCusObjId       error

=== Total: 22 Results in 3 Flows.
- error: 2
- warning: 18
- note: 2

Be a part of our mission to champion Best Practices by starring us on GitHub:
https://github.com/Lightning-Flow-Scanner

フォルダを指定して実行したスキャンした結果ですが、日本語名で「取引先を取得して保存」「従業員数が100人を超えた場合はメモを追加するフロー」「不完全な画面フロー」という3件のフローに対してスキャンされました。それぞれ実行したフロー名が「」「」「」と省略され、どのフローに問題が発生しているのか少し分かりづらいですが、問題があることが確認できます。

VSCodeを使ったLightning Flow Scannerの実行方法

左側のアクティビティバーから「Lightning Flow Scanner」を選択します。

■Configure Rules(ルール設定)
Lightning Flow Scannerのボタンメニューから「Configure Rules」を選択すると 、どのルールを適用するか選べるようになりますので事前に選びます。

「Outdated API Version」や「Flow Name Convention」が選択肢に入っていると更にAPIバージョンの指定や命名規則を正規表現で入力するよう促されます。デフォルトでいい場合は、そのままEnterキーを押下して設定してください。

■Scan Flows(スキャン)
Lightning Flow Scannerのボタンメニューから「Scan Flows」を選択すると 、スキャンする対象のフローが格納されているフォルダを選択するダイアログが出てきます。個別でスキャンはできません。任意のフォルダを選んでください。

スキャンが完了すると解析結果が表示され、それぞれのフローにおいていくつ問題が検出されたか確認できます。

Detailsボタンをクリックすると以下のようにどこに問題が発生しているのか明確になります。

結果は、全て英語で返ってきます。しかし、ドキュメントと比較しながら確認すれば、何が問題かを判別することができます。例えば、この結果からは、未使用変数が存在すること/失敗時のパスを指定し忘れていたこと/IDをハードコーディングしてしまっていたことなどの問題が確認できます。
フローの見直しに役立てることができそうですね。

■Cale Coverrage %(テスト網羅率の追記)
この機能は 事前にApexテストクラスの用意Scan Flows実行必要です。Lightning Flow Scannerのボタンメニューから「Cale Coverrage %」を選択すると 、Apexテストを実行して検証結果(テスト網羅率)をスキャンリストへ追記してくれます。

■Fix Flows(問題の修正)
Lightning Flow Scannerのボタンメニューから「Fix Flows」を選択すると、フローを解析し、見つけた問題を自動で修正してくれます。

ただし、現時点では、UnconnectedElement(接続されていない要素)UnusedVariable(未使用変数)のような簡単な問題のみが対象となります。

また、画面フローに埋め込んでいる「表示テキスト」の一部「&lt;p&gt;」が「&amp;lt;p&amp;gt;」のように変換されるなど、一部破壊的な変更が入ることも確認できました。

今後のアップデートで影響範囲が変わる可能性も高く、利用する場合は実行前に必ずバックアップ(例えばgit addでステージング状態にしておくなど)を取り、Salesforce組織に自動修正されたフローをデプロイしなおして、動作に影響ない事をしっかり確認する必要がありそうです。

■Documentation
Lightning Flow Scannerのボタンメニューから「Documentation」を選択すると、各ルールに対する説明が表示されたパネルが追加されます。
内容は全て英語ですが、それぞれ解説ページへのリンクも埋め込まれているため、ちょっと気になるルールについては、リンクをクリックしてWebページを翻訳して読むなど活用できそうです。

6.活用シーン

改めてLightning Flow Scannerは以下のようなシーンで活用できると思いました。

  • 自分で作成したフローに問題ないか見直す時

  • 他の人に作成してもらったフローに問題ないかレビューする時

  • GitHub Actionsに組み込みプルリクにPushされた時に自動レビューさせたい時(Salesforce CLI プラグインを活用)

7.CLIとVSCodeの違いについて

Salesforce CLI プラグインとVSCode拡張プラグインにはそれぞれ特徴があり、現時点では以下のような違いがあります。

Salesforce CLI プラグインの場合

  • コマンドで動く(CI/CDに組み込みやすい)

  • 機能: スキャン/ルール設定/カスタムルールの追加

VSCode 拡張プラグインの場合

  • GUIで操作できる(視覚的に使いやすい)

  • 機能: スキャン/ルール設定/テスト網羅率の確認/自動修復

Salesforce CLI プラグインで作成した設定ファイルをVSCode拡張プラグインで活用できないのが残念です。
しかし、今後のアップデートに期待したいポイントですね。

おわりに

Lightning Flow Scannerは、Salesforceフローの品質向上に非常に有用なツールでした!本当にめっちゃ便利!

特にVSCodeの拡張プラグインで手軽に確認できるので、フロー作成後の自己レビューにすごく役立ちます。

また、コマンドで動く機能を提供しているため、CI/CDを組み込むことができ、問題を発見しやすくできます。

実際にGitHub Actionsを活用するやり方として以下のような記事を書いてくれた方もいて、大変ありがたいです!

未使用変数を見逃すな!lightning-flow-scannerでフローのレビューを効率化 - https://qiita.com/takaHAL/items/4b8243f99a6737037836

SFDXコマンドまたはVSCodeでしかスキャンできない事は残念ですが、GitHubを確認すると Salesforceで動作するアプリも開発中のようです!!!これがリリースされたら、VSCodeを使用できない管理者にとっても非常に有力なサポートツールとなりそうです。

以上です。ここまで見てくださり有難うございます。
この記事が誰かの役に立てれば幸いです。

ではでは!

■関連記事

※この記事は「ゆるっとSalesforceトーク#37」で紹介した内容を記事にしています。