見出し画像

[開発チュートリアル:第三部]パッケージ化してみる〜Salesforce フロー画面コンポーネントを含んだパッケージを作成しよう〜

はじめに

こんにちは、co-meetingにてエンジニアしているハナミズキです。この記事は、「Salesforce フロー画面コンポーネントを含んだパッケージを作成しよう」の第三部です。

 関連するパッケージの紹介:

ここで学習できること

  • Salesforce CLIを利用したSalesforceパッケージの作り方、リリースの仕方

ロック解除済みパッケージ化しよう

ロック解除済みパッケージ化の基本的な流れは公式ページの<ロック解除済みパッケージのワークフロー>を一度読むことをお勧めします。
 
チュートリアル第一部、第二部を通して作成したコンポーネントをパッケージ化して、Salesforce組織へインストールできる形に変換しましょう。

ロック解除済みパッケージの作成

VSCodeのターミナルを開き(Ctrl+J/Cmd+J)以下のコマンドを実行してロック解除済みパッケージを作成します。

sfdx force:package:create --name "Flow Component OuputField Sample" --path force-app --packagetype Unlocked

実行すると以下のようなログが出力されます。

sfdx-project.json has been updated.
Successfully created a package. 0Ho5h0000004CB4CAM
=== Ids
NAME        VALUE
──────────  ──────────────────
Package Id  0Ho5h0000004CB4CAM

ここで表示されるPackage Idは、のちほどパッケージを削除するときに利用するためメモしておくと便利です。

作成したロック解除済みパッケージリストの確認

VSCodeのターミナルを開き(Ctrl+J/Cmd+J)以下のコマンドを実行することで作成したパッケージバージョンをリストアップできます。

sfdx force:package:list

実行すると以下のようなログが出力されます。

=== Packages [1]
Namespace Prefix  Name                              Id                  Alias                             Description  Type
────────────────  ────────────────────────────────  ──────────────────  ────────────────────────────────  ───────────  ────────
                  Flow Component OuputField Sample  0Ho5h0000004CB4CAM  Flow Component OuputField Sample               Unlocked

ロック解除済みパッケージバージョンの作成

VSCodeのターミナルを開き(Ctrl+J/Cmd+J)以下のコマンドを実行してロック解除済みパッケージのパッケージバージョンを作成します。

sfdx force:package:version:create --package "Flow Component OuputField Sample" --codecoverage --installationkeybypass --wait 10

実行して成功すると以下のようなログが出力されます。なお、UnofficialSFのパッケージを活用してカスタムプロパティエディタを改修している場合は、この時にエラーが発生します。対策として後述の「UnofficialSFのパッケージをインストールしている場合の作成方法 」を参照してください。

Request in progress. Sleeping 30 seconds. Will wait a total of 600 more seconds before timing out. Current Status='Initializing'
Request in progress. Sleeping 30 seconds. Will wait a total of 570 more seconds before timing out. Current Status='Initializing'
Request in progress. Sleeping 30 seconds. Will wait a total of 540 more seconds before timing out. Current Status='Verifying metadata'
Request in progress. Sleeping 30 seconds. Will wait a total of 510 more seconds before timing out. Current Status='Finalizing package version'
sfdx-project.json has been updated.
Successfully created the package version [08c5h0000004CEwAAM]. Subscriber Package Version Id: 04t5h000000lSVkAAM
Package Installation URL: https://login.salesforce.com/packaging/installPackage.apexp?p0=04t5h000000lSVkAAM
As an alternative, you can use the "sfdx force:package:install" command.

この時に表示されるSubscriber Package Version Idがパッケージをインストールする際に利用する情報なのでメモが必要です。またこちらで表示されているPackage Installation URLを利用すると実際に別の組織にパッケージをインストールできるようになります。

UnofficialSFのパッケージをインストールしている場合の作成方法 

UnofficialSFのパッケージをインストールしてカスタムプロパティエディタを使いやすくしている場合は、sfdx-project.jsonを開き、以下のdependenciesプロパティを追記してください。
dependenciesプロパティは他のパッケージへの連動関係を追加するために存在しております。こちらを追加していなければエラー「ERROR running force:package:version:create:  cmOutputFieldEditor: No MODULE named markup://c:fsc_pickObjectAndField3 found : [markup://c:cmOutputFieldEditor]」が発生してパッケージバージョンを作成できません。

   "packageDirectories": [
       {
           "path": "force-app",
           "default": true,
           "package": "Flow Component OuputField Sample",
           "versionName": "ver 0.1",
           "versionNumber": "0.1.0.NEXT",
           "dependencies": [
             {
                "package": "04t8b000001Eh4YAAS"
             },
             {
               "package": "04t5G000003rUvVQAU"
             }
         ]
       }
   ],
  • 04t8b000001Eh4YAAS:FlowActionsBasePack@3.0.0のパッケージバージョンIDです

  • 04t5G000003rUvVQAU:FlowScreenComponentsBasePack@3.0.6のパッケージバージョンIDです

パッケージ連動関係を指定することで事前に組織に対して、FlowActionsBasePack Version 3.0.0やFlowScreenComponentsBasePack  Version 3.0.6をインストールせず当パッケージのみをインストールしようとすると以下のようなエラーが発生するようになります。

作成したロック解除済みパッケージバージョンリストの確認

VSCodeのターミナルを開き(Ctrl+J/Cmd+J)以下のコマンドを実行することで作成したパッケージバージョンをリストアップできます。

sfdx force:package:version:list --packages "Flow Component OuputField Sample"

実行すると以下のようなログが出力されます。

=== Package Versions [2]
Package Name    Namespace  Version Name  Version  Subscriber Package Version Id  Alias                   Installation Key  Released  Validation Skipped  Ancestor  Ancestor Version  Branch
──────────────  ─────────  ────────────  ───────  ─────────────────────────────  ──────────────────────  ────────────────  ────────  ──────────────────  ────────  ────────────────  ──────
CM OutputField             ver 0.1       0.1.0.1  04t5h000000lSVkAAM             CM OutputField@0.1.0-1  false             false     false               N/A       N/A
CM OutputField             ver 0.1       0.1.0.2  04t5h000000lSWTAA2             CM OutputField@0.1.0-2  false             false     false               N/A       N/A

ロック解除済みパッケージのインストール

パッケージインストール検証用スクラッチ組織の作成

検証用にパッケージをインストールするスクラッチ組織を作成します。

sfdx force:org:create --definitionfile config/project-scratch-def.json -a output_field_package_install_SCRATCH

パッケージインストール検証用スクラッチ組織にUnofficialSFのパッケージをインストール

UnofficialSFのパッケージを活用してカスタムプロパティエディタを改修している場合は、先ほど作成したロック解除ずみパッケージをインストールする前にFlowActionsBasePackとFlowScreenComponentsBasePackパッケージをインストールする必要があります。以下のコマンドを使ってインストールしてください。

FlowActionsBasePack

sfdx force:package:install --package 04t8b000001Eh4YAAS -u output_field_package_install_SCRATCH --wait 10 --publishwait 10

FlowScreenComponentsBasePack

sfdx force:package:install --package 04t5G000003rUvVQAU -u output_field_package_install_SCRATCH --wait 10 --publishwait 10

ロック解除済みパッケージのインストール

以下のコマンドの<SubscriberPackageVersionId>を置換して実行し、指定のスクラッチ組織にパッケージをインストールします。

sfdx force:package:install --package <SubscriberPackageVersionId> -u <スクラッチ組織のエイリアス名> --wait 10 --publishwait 10
// 例)sfdx force:package:install --package 04t5h000000lSVkAAM -u output_field_package_install_SCRATCH --wait 10 --publishwait 10

<補足>
以下URLの<SubscriberPackageVersionId>を置換してブラウザのアドレスバーにURLを貼り付けることでも、パッケージをインストールできます。

■本番組織にインストールしたい場合

https://login.salesforce.com/packaging/installPackage.apexp?p0=<SubscriberPackageVersionId>

■Sandboxやスクラッチ組織にインストールしたい場合

https://test.salesforce.com/packaging/installPackage.apexp?p0=<SubscriberPackageVersionId>

上記のURLを利用することで、任意のSalseforce組織にインストールできるようになります。

パッケージのインストール確認

パッケージをインストールした検証用のスクラッチ組織を開きます。

sfdx force:org:open -u output_field_package_install_SCRATCH

[設定] から、[クイック検索] ボックスに「パッケージ」と入力し、[インストール済みパッケージ]を選択します。
以下のように表示されていたらパッケージのインストール成功です。

また、[設定] から、[クイック検索] ボックスに「フロー」と入力し、[フロー]を選択します。
[新規フロー]ボタンを押して、[画面フロー]を選択し、[作成]ボタンをクリックします。[画面]を追加して開いた時に、以下のように左側のリストを一番下までスクロールすると、”カスタム”セクションに今回作成した画面フロー用のコンポーネントCM OutputFieldが存在していることまで確認しましょう。

このように組織の機能拡張できるパッケージを増やしていくことが可能です。

ロック解除済みパッケージのリリース

リリースする準備が整ったら、force:package:version:promoteを使用します。詳細は公式サイト<ロック解除済みパッケージのリリース>を参照してください。

sfdx force:package:version:promote --package <SubscriberPackageVersionId>

// 例) sfdx force:package:version:promote --package 04t5h000000lSWTAA2

実行すると以下のようなログが出力されます。本当にリリースを行うか質問がされるためyを入力してEnterキーを押しましょう。

Are you sure you want to release package version 04t5h000000lSWTAA2? You can't undo this action. Release package (y/n)?: y
Successfully promoted the package version, ID: 04t5h000000lSWTAA2, to released. Starting in Winter '21, only unlocked package versions that have met the minimum 75% code coverage requirement can be promoted. Code coverage minimums aren't enforced on org-dependent unlocked packages.

[コラム]ロック解除済みパッケージのバージョンアップとアップグレードについて

ロック解除済みパッケージをアップグレードする際は、sfdx-project.jsonを開き、versionNameversionNumberを更新して、パッケージバージョンを作成するだけで簡単に対応できます。
例えば以下のようにver 0.1からver0.2に変更してsfdx force:package:version:createを実行すると、新たにver 0.2用のパッケージバージョンが生成されます。

{
    "packageDirectories": [
        {
            "path": "sfdx-src",
            "default": true,
            "package": "Flow Component OuputField Sample",
            "versionName": "ver 0.2",
            "versionNumber": "0.2.0.NEXT"
,...省略

インストールについても、パッケージバージョン生成時に発行されるSubscriber Package Version Idを利用して、先ほどの例に従ってコマンドsfdx force:package:installを発行するだけで対象組織のパッケージをアップグレードできます。
今回作成したパッケージは、他のSalesforce組織にもインストール可能であり、外部組織にインストールされたパッケージをアップグレードする際は【転送アップグレード】を行う必要があります。
転送アップグレードのやり方は公式ガイド「パッケージアップグレードの転送」に記載されている通り第二世代管理パッケージと同じやり方です。
少し特殊であり、弊社サイトでも噛み砕いて記載しているので、是非参考にしてみてください。

ロック解除済みパッケージバージョンの削除

パッケージバージョンの削除はVSCodeのターミナルを開き(Ctrl+J/Cmd+J)以下のコマンドを実行することで対応できます。ロック解除済みパッケージは、リリース済みであろうと削除することができます。詳細は公式サイト<パッケージまたはパッケージバージョンの削除>以下を参照してください。

sfdx force:package:version:delete --package <SubscriberPackageVersionId>

// 例) sfdx force:package:version:delete --package 04t5h000000lSWTAA2

<SubscriberPackageVersionId>がわからない場合は、「sfdx force:package:version:list --packages "Flow Component OuputField Sample"」コマンドを実行して04で始まるIDを確認してください。

ロック解除済みパッケージの削除

パッケージの削除はVSCodeのターミナルを開き(Ctrl+J/Cmd+J)以下のコマンドを実行することで対応できます。関連するすべてのパッケージバージョンが削除されていなければパッケージは削除できないため注意してください。詳細は公式サイト<パッケージまたはパッケージバージョンの削除>以下を参照してください。

sfdx force:package:delete --package <PackageId>

// 例) sfdx force:package:delete --package 0Ho5h0000004CB4CAM

<PackageId>がわからない場合は、「sfdx force:package:list」コマンドを実行して0Hで始まるIDを確認してください。

おわりに

 チュートリアルをやってみて、いかがでしたでしょうか。VSCodeを利用して開発したことがある人には開発内容が少し物足りなかったかもしれません。しかし、画面フローに新たにコンポーネントを追加したことがない人、カスタムプロパティエディタを作ったことない人、またパッケージ化をしたことない人には少しは参考になったのではないでしょうか。

なお、ロック解除済みパッケージが生まれた歴史を振り返った時、少し思ったことがあります。

まず、Salesforceでは本番組織をカスタマイズするにあたって、従来、変更セットを利用した組織開発モデルを提供しておりました。今でも活用している組織はたくさんあるのではないでしょうか。

この変更セットを活用したカスタマイズは組織が成長し複数の開発チームが増えるたびに、他のユーザーが行った変更と混ざり合い、変更の追跡が複雑になるというデメリットが存在しております。

そこで「ロック解除済みパッケージを活用したパッケージ開発モデル」が生まれ推奨されるようになったらしいのですが、このパッケージ開発モデルで本番組織のカスタマイズしている組織はどれだけいるのだろうかと感じました。

ロック解除済みパッケージがGA(General Availability)となってから3年。奇しくも私が2019年の夏にSalesforceを始めた時と同じです。開発モデルを変えるような新しい文化が定着するには、メリットが界隈に浸透していなければなかなか定着しません。

ロック解除済みパッケージを使って組織をカスタマイズしているという事例が増えれば増えるほどパッケージ開発モデルも定着していくのかもしれませんね。

しかし、パッケージ開発モデルは開発者向けの知識が必要で、Salesforce管理者目線で考えるとハードルが高そうです。それを考えると変更セットを使った開発モデルはまだまだ廃れることはなさそうですね。このような変更セットの代替としてDevOps Centerという機能がリリース予定です。パッケージ開発とも今後どう関わっていくのか...実際どのような使い勝手になるか分かりませんが、だいぶ便利になりそうなので期待したいです。

最後になりますが、実際に本番組織を活用してパッケージ開発モデルを行うよう着手する際は、Trailheadのモジュール「パッケージ開発モデル」や「パッケージ開発の準備状況」や公式ガイドのロック解除済みパッケージのベストプラクティスも合わせて一読することをお勧めします。 

以上です、今回のチュートリアルが皆様の助けになれば嬉しいです。

 ではでは!

GitHub
https://github.com/co-meeting/flow-component-ouput-field-sample