Salesforce AppExchangeにアプリケーションを公開までの道のり

# 概要

　Salesforce AppExchangeに自社アプリケーションを公開するまでの道のりを私の経験をもとに説明させていただきます。
なお、公式ドキュメントで一連のフローが説明されていますが、細かい作業ベースの内容も以下に盛り込んでいきたいと思います。
また、私は後述のISVパートナーとして自社アプリケーションの開発に携わっていたが、他のパートナー契約の詳細を把握していませんので、割愛させて頂きます。

[パートナープログラム詳細](http://www.salesforce.com/jp/partners/isv_partners.jsp)


# Salesforce AppExchangeとは
 
 Salesforceプラットフォーム上で利用できる様々なアプリケーションが公開されているマーケットプレイス
ちなみにアメリカと日本では異なるマーケットプレイスになっています。
なお、日本の組織からアメリカのAppExchangeのアプリケーションをインストールは可能です。（その逆も可能）
アメリカのAppExchangeに公開したい場合は、別途契約が必要になります。

[アメリカ版 AppExchange](https://appexchange.salesforce.com/)
[日本版 AppExchange](https://appexchangejp.salesforce.com/)

# Salesforce AppExchangeの魅力

- Salesforceの販売チャネルを活かせる  
 - Salesforceの営業担当者や開発パートナさんが直接顧客に製品紹介をしてくれる（提供製品の性質次第）  
   そのため、少人数からスタートできる
 - エンタープライズ向けで、かつグローバルに展開している
- APIの活用により少ないコストでプロダクトを作ることができる
 - Salesforceの開発言語を詳しく知らなくても、アプリケーションは作れる  
   ほぼHTML + JavascriptでRESTfulにデータ取得が可能  
   また同様にHerokuやAWSなどからもRESTfulにデータ取得できるので、使い慣れた言語での開発が可能  
   （Heroku Connectを使えば、Salesforceとの通信の実装も不要になる）
- 開発コミュニティがしっかりしている
 - 開発コミュニティ向けのイベントが定期的に開催されていて、コミュニティのムードも和やかで、親切な方が多い  
   もちろん、技術的な話題の提供も惜しまない
- エンタープライズ向けということで顧客の業務に触れる機会がある
 - ただ単にApexchangeから提供製品を購入して使うケースもあれば、提供製品を使うためにSalesforceに加入する顧客もいらっしゃいます  
   そういったケースでは、顧客の利用シーンに合わせた導入提案をすることもありますので、  
   場合によっては新たなアイデアや新たな商談に繋がる場合もあります
- プラットフォームが進化し続けている
 - 年三回のプラットフォームアップデートがあるため、新たな価値を顧客に提供できる機会に繋がる  
   一方でアップデートによる製品の修正が発生することもある。。。
- グローバル対応が標準化されている
 - プラットフォーム自体がマルチ言語対応しているので、提供アプリで言語対応していれば簡単にマルチ言語対応ができる

# アプリケーション公開までの道のり

## 1. ISV / OEMパートナーになる

アプリケーションのみを販売するISVパートナーに参加します。
OEMパートナーの詳細をわかっていないので割愛します。

各プログラムの特徴は以下になります。

|                  |       ISVforce    |    OEM             |
|:-----------------|:------------------|:-------------------|
| 費用             | 1 アプリにつき初年度 270000 円、次年度以降 0 円(2019/3/1より) <br/>（ セキュリティレビュー費用 ）| ISVforce同様 |
| ロイヤリティ      |              あり |                あり |
| アプリケーション配布方法 |  AppExchange | AppExchange / Trialforce |

  パートナーの詳しい話は[セミナー](https://www.salesforce.com/jp/partners/partner-programs/overview/)が定期的に開催されています。
  すぐにパートナに参加したい場合は、[こちらの手順](https://developer.salesforce.com/docs/atlas.ja-jp.packagingGuide.meta/packagingGuide/isv1_1_quickstart.htm)に従って参加できます。


## 2. アプリケーションの開発

上記のパートナ契約後にパートナ用の開発環境（開発組織）を入手できます。
また、パートナー向けのコミュニティサイト([Partner Community](https://partners.salesforce.com/))のアカウントも入手できます。  

もし、パートナ契約の締結前に開発を始めたい場合は、一般開発者向けの組織を入手することですぐに開発を始めることができます。
パートナ用の開発環境を入手後にソースをデプロイすれば簡単に移行することができます。
※一般開発者向け組織で開発を始める場合で名前空間名を取得する際は同じ名前空間名は2度と入手できない（消すこともできない）ので、仮の名前空間名で開発してください。（AppExchangeに公開するアプリケーションには名前空間名が必須）

- [一般開発者向け開発組織の入手先](https://developer.salesforce.com/pages/developerfilm)
- [オンライントレーニング](https://trailhead.salesforce.com/)
- [開発者ドキュメント](https://developer.salesforce.com/docs/?filter_text=&service=Force.com&select_type=&version=37.0&lang=ja-jp&sort=title&show_en=yes)
- [コミュニティ](https://developer.salesforce.com/forums?communityId=09aF00000004HT8IAM)
- [開発者コミュニティ](https://www.facebook.com/groups/salesforcedugjapan/)
- [開発者向け有料研修](http://www.salesforce.com/jp/services-training/education-services/training/course-flow/)
 - [認定有料研修（ちょっと安い）](http://www.knowledgewing.com/kw/recommend/course/salesforce.html)
 - [認定有料研修2](https://www.pasonatquila.com/service/salesforce_training/)


### Partner Communityでできること
- 各種パートナー向けの問い合わせ（ケース）ができる
 - 問題が発生した場合や不明点などの問い合わせ  
 （事前にコミュニティで解決済みかどうかを調べてから問い合わせされたほうが早く解決する場合もあります。  
   また、Chatterや開発者コミュニティに質問するのも有効な手段になります。）
 - 各種申請  
  (環境ハブの有効化、LMAの有効化、セキュリティレビューの申請、機能(暗号化項目、インデックス付与など)の有効化等々)
- パートナ同士の交流の場（Chatter）
- パートナ向けのニュース配信

### 組織について
- Salesforceでは1社ごとの利用環境を「組織」と呼びます
 - 開発専用環境を開発組織  
   パートナ用開発組織(ライセンス数や利用できる機能やストレージ量が多め)  
   一般開発者向け開発組織
 - 本番環境を本番組織
 - 本番環境用の開発やテスト環境をSandbox組織

### ネーミング（任意）
　Salesforceの開発に限った話ではないですが、クラス、ページ、静的リソースなどの各種コンポーネントの名前に（先頭に）製品の略称を含めることをお勧めします。インストール先の組織でパッケージに含まれているリソースを参照する時にまとまって見れるので管理上便利です。（パッケージの名前空間名でページビューを作成してもいいですが･･･）


### 開発とパッケージング周りの注意事項
- アプリまたはLightning Componentsの一部にWebサーバーを含む場合は、そのサーバーとの通信はTLS1.1以降を行うこと
- Winter'17 でClassicアプリをパッケージング/更新し、Lightning Experienceで表示させたい場合には、表示の許可設定とClassic Appのアップグレード作業が発生します。なお、Winter'17以前のアプリについてはこれらの設定は不要（自動適用）

## 3. LMAと環境ハブの申請

新規パートナの場合は、パートナプログラム申請時にもらった組織で環境ハブが有効になっているため、申請は不要になります。
それ以外の場合は、パートナプログラム締結後にPartner Communityにてそれぞれの機能が利用できるようにケースで申請します。

### LMA(License Management Application)とは
AppExchangeで公開する自社アプリケーションのライセンスを管理するアプリケーション

- [LMAについて](https://developer.salesforce.com/docs/atlas.ja-jp.packagingGuide.meta/packagingGuide/packaging_manage_licenses.htm)
- [LMAについて2](https://developer.salesforce.com/docs/atlas.ja-jp.packagingGuide.meta/packagingGuide/lma_intro.htm)

### 環境ハブとは
各種組織（テスト用、パートナー向け開発用、デモ用）を生成するアプリケーション

- [環境ハブについて（リリースノートより）](https://releasenotes.docs.salesforce.com/ja-jp/winter14/release-notes/environment_hub_main.htm)


## 4. セキュリティレビュー向けのコードスキャン

開発が一通り完了してから[コードスキャナー](https://security.secure.force.com/security/tools/forcecom/scanner)でコードの脆弱性や安全性を機械的に解析する。
※一日に同一組織へのスキャン回数に制限があります。
スキャン結果で脆弱性が解消されるまでコードを修正し、再度コードスキャンしてください。

- [セキュアコーディング ガイドライン](https://developer.salesforce.com/page/JP:Secure_Coding_Guideline)
- [セキュリティレビューの手順](https://developer.salesforce.com/docs/atlas.ja-jp.packagingGuide.meta/packagingGuide/security_review.htm)
- **[セキュリティレビューチェック表（英語）](https://developer.salesforce.com/docs/atlas.en-us.packagingGuide.meta/packagingGuide/security_review_required_materials.htm)**  
  [※日本語版（要パートナコミュニティログイン）](https://partners.salesforce.com/0693A000006lQ3Z)

### セキュリティレビューとは  
 AppExchangeのアプリケーションの脆弱性や安全性などをSalesforce社が審査すること
App StoreやGoogle Playにアプリケーションを掲載する際の審査と同じイメージ
新規アプリケーション公開時は6～8週間かかります
アプリケーション公開後は毎年1回の更新用セキュリティレビューが実施されます

- [セキュリティレビューのQ&A](https://developer.salesforce.com/docs/atlas.ja-jp.packagingGuide.meta/packagingGuide/security_review_faq.htm)

## 5. 開発組織とPartner Communityの関連付け

Partner CommunityからAppExchangeに掲載するための管理ツールとしての役割もあるため、
パッケージの開発組織や後述のLMAをインストールする（ライセンスやリード管理）組織とPartner Communityとの関連付けが必要になります。
もし、複数の開発組織（複数のアプリケーション）やLMA組織（異なる組織でそれぞれライセンスを管理したい場合）が複数存在する場合は、それらをすべて登録します。
（契約によりますが、グループ会社でそれぞれ異なるアプリケーションを掲載する場合にそれらの組織をすべて関連付けする必要があります）

- [開発組織とPartner Communityの関連付け手順](https://developer.salesforce.com/docs/atlas.ja-jp.packagingGuide.meta/packagingGuide/appexchange_publish_organizations.htm)


## 6. AppExchangeに公開するページ（リスト）の作成

AppExchangeに公開されるアプリケーションページを作成します。
アプリケーションが複数ある場合は、それぞれ作成する必要があります。
※公開するページを「リスト」と呼びます

- [リストの作成について](https://developer.salesforce.com/docs/atlas.ja-jp.packagingGuide.meta/packagingGuide/appexchange_publish_listings.htm)


## 7. セキュリティレビュ－の準備

パッケージ開発組織で**リリースパッケージ**の作成（アップロード）を行います。
手順6で作成したリストのアプリケーション項目で該当アプリケーションを管理したいLMA組織と[関連付け](https://developer.salesforce.com/docs/atlas.ja-jp.packagingGuide.meta/packagingGuide/appexchange_publish_manage.htm)を行う。
セキュリティレビュー用のテスト組織を環境ハブより作成する
レビュー用の組織の条件は以下になります

- Sandbox組織はNG
- Lightning Componentsを含む場合は、LockerServiceを有効化した開発組織であること
 
テスト組織にリリースパッケージをインストールし、テストに必要なアカウントや権限などを予め設定する。
外部連携する場合はそれらも含めて準備すること。

それ以外で組織の設定が必要ことは以下になります。

- IP制限の緩和設定  
  テスト組織のログインポリシーが2ステップ認証になっている場合はレビュアーがログインできないので、
  テストユーザの各プロファイルのログインIPアドレスの制限を以下のように設定してください。

~~~
開始IPアドレス「0.0.0.0」
終了IPアドレス「255.255.255.255」
~~~


## 8. セキュリティレビューの申請

「Partner Community」 -「公開管理コンソール」で対象のアプリケーションのセキュリティレビューの申請を実施してください。
初回アプリケーションの申請完了後に、2営業日以内にSalesforceの担当者からセキュリティレビューの注文書のケースが発行されます。

※リリースパッケージのアップロード後すぐには公開管理コンソールに表示されないので、少し時間おいてください。

- [セキュリティレビューの申請手順](https://developer.salesforce.com/docs/atlas.ja-jp.packagingGuide.meta/packagingGuide/security_review_questionnaire.htm)


## 9. 注文書と手順書の準備と提出
~~## 9. セキュリティレビュー依頼に関するケースの提出~~

~~開発がすべて完了したら、Partner Communityでセキュリティレビュー申請のケースを提出する。~~
~~その後担当者といろいろ（見積書、注文書）やり取りがあります。~~
注文書の準備とセキュリティレビューの審査対象のアプリケーションの概要や簡単な操作手順を作成し、
8.で発行されたケースに添付してください。また、準備が完了した場合はその旨をケースに返答してください。

※新規アプリケーションのセキュリティレビュー依頼~~と毎年更新時のみケースからの依頼~~が必要です。
　それ以外のアプリケーションのバージョンアップ時は不要です。


## 10. 合否

~~セキュリティレビューの合否は後日ケースにて返答で通知されます。~~
合否については後日セキュリティレビュー申請者宛にメールで通知されます。
なお、結果が「不合格」だった場合は、
「コードの修正」->「コードスキャン」->「リリースパッケージの作成＆アップロード」->「公開管理コンソールでのセキュリティレビューの申請」->「ケースでレビュー再依頼」（以降不合格の場合はこのループ）

※なお、不合格になった場合でリリースパッケージを再作成する度にバージョンが上がりますが、これは仕方ありません。


## 11. AppExchangeへの公開

無事セキュリティレビューが「合格」になりましたら、公開管理コンソールで該当のアプリケーション（バージョン）を「公開」状態に設定

以上、お疲れ様でした。


# 年次更新時の手順

1. ケースよりセキュリティレビューの更新に関する通知が来ます  
~~2. 開発組織よりパッチ組織を作成する~~
2. 公開されている既存最新パッケージを対象にコードスキャナーの実施
3. 問題が発見した場合は、パッチ組織を作成し、脆弱性が見つからなくなるまで修正とスキャンを実施  
 ※パッチ版ではオブジェクトやページなどの追加や削除はできないので、ご注意ください  
~~4. パッチ組織でリリースパッケージのアップロード~~
4. レビュー用の組織やアカウントなどの準備
5. AppExchange公開コンソールでセキュリティレビューの申請  
  - パッケージの修正を行った場合は、新たにセキュリティレビューの申請を行う
  - 修正がなかった場合は、合格済みのセキュリティレビューのテスト組織の情報（ログインユーザIDなど）を更新してください
6. ケースにてレビュー開始の返答
7. 合否（不合格の場合は上記同様再修正＆再申請）
8. 公開（プログラム改修がある場合）

詳細な手順を「[[備忘録]Salesforce管理パッケージの年次セキュリティレビュー手順](https://qiita.com/comefigo/items/e87825de223017278d02)」にまとめました

# 最後に

　最近Salesforceのドキュメントがだいぶ整ってきましたので、次に何をすればだいたいわかるようなドキュメントになりました。
（2年前は全然情報量や鮮度が悪くて何していいのかが全然わかりませんでした。。。）
基本的に[ISVforceガイド](https://developer.salesforce.com/docs/atlas.ja-jp.packagingGuide.meta/packagingGuide/packaging_intro.htm)に一通りのことは書かれていますので、わからなくなったらこちらをご参照するか、ケースや担当営業の方々に問い合わせしてください。
また、ISVパートナー向けの開発者会([Facebookのコミュニティより](https://www.facebook.com/groups/salesforcedugjapan/))もありますので、ぜひ参加してあれこれを情報交換すればスペシャリストたちが答えてくれると思います。