SalesforceのCI/CD その２

## 要件
SalesforceのDeployとソース管理はSalesforce自身の機能でまたできていないです。
Continuous Integration and Continuous DeploymentはSfdcコマンドとAzureのDevopsで実装します。
※おれたちの案は世界一ですよ。

### 実装イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/486afa26-2786-9a93-c839-52308173bbb5.png)

### ④ 自動配布
CI/CDの一つ核心はバージョン管理、もう一つは自動配布です。
自動配布機能はないと、CDにならないです。
①‐③までの説明
　- [SFDCのCI/CD対策（その1/2　CI）](https://qiita.com/chunqiangHu/items/b82d801cb2ec42709e5b)を参考してください

本節の参照資料は下記です。
　- 参考資料：https://abhisheksubbu.github.io/salesforce-azure-devops/
#### ④‐1　salesforce環境接続用キー作成
普通のSFDCへの認証は画面にID、Passwordで行いますが、自動配布になるとこれは実用できないです。
認証方式はJWTになります。認証証明書が必要です。そのため、自分で認証キーと証明書を作成します。
- salesforce環境とAzure Devops Repo接続用認証ファイル作成:
  - `openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out server.key` でプライベートキー**server.key**作成
  - `openssl req -new -key server.key -out server.csr`プライベートキーで**server.csr**を作成
  - `openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt`認証証書**server.crt**を作成


#### ④‐2 salesforce環境接続用アプリケーション作成
Salesforce側に④‐1の証明書を使って、外から認証を受ける接続アプリケーションを作成する
  - 「アプリケーションマネージャ」で「新規接続アプリケーション」を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/d55ebb4c-369a-8d2f-fd87-2d1b91c134ec.png)

  - 基本情報を設定、名前とメールは任意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/c51040bc-7745-ce22-ca17-d23967d0557f.png)

  - 「OAuth 設定の有効化」をチェック入れ、以下のように設定、その内コールバック URLをhttp://localhost:1717/OauthRedirectに設定、デジタル署名で前に作成した**server.crt**をアップロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/284068b6-4682-83c2-7c82-4532a4711528.png)

  - 作成したアプリケーションの「manage」をクリック、「ポリシーを編集」クリック、「OAuth ポリシー」の「許可されているユーザ」を「管理者が承認したユーザは事前承認済」に設定
  - 作成したアプリケーションの「manage」をクリック、「プロファイル」欄で「システム管理者」「API　ONLY」のプロファイルを追加
  - 作成したアプリケーションの「参照」をクリック、「コンシューマ鍵」が取得できます、後pipelineで使用されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/4b032f0b-e4ab-1c4f-6835-f9b6094f42fb.png)


 

#### ④‐3 azure pipeline作成
上記④‐1、④‐2で作成した認証情報を利用して、自動配布のPipelineを作成する。
 - salesforce環境にdeployしたいazure repoのブランチに、前に作成した**server.key**をアップロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/72b6e2b2-a6be-6a1a-669b-bbe68e07ce8c.png)

 - ブランチのrootにpipelineのyamlファイル「azure-pipelines-dev01.yml」を作成
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/28c3694a-aa8c-970a-bf7d-59a4436755f4.png)

 - pipelineを編集の場合、azure devopsのpipelineタグで作成したpipelineを探し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/9b6803ee-2466-5609-8b91-67855de06ff1.png)

 - ここでpipelineの毎回実行のlogが表示され、pipelineの編集は「edit」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/e2dc207f-3b44-b9e0-7dd0-a4bfe4d67be7.png)

 - pipelineコーディング画面で、左上ブランチ遷移でき、右上パラメータ設定できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/0920cd1d-4e44-ca6f-d557-50596a39c7d2.png)

 - pipelineコード保存後、右上「run」をクリックにより、pipelineの手動起動ができます。


##### コード説明　azure-pipelines-dev01.yml（STS-Team-Business-Sys-dev01-test01）
##### 用途：dev01ブランチ内容が更新されるとき、資材をft01環境へdeploy
- pipeline起動条件をdev01ブランチ内容更新される場合に設定、且つ頻繁操作有りの場合batch実行行い、起動回数を減らす。

```
trigger: 
  batch: true
  branches:
    include:
    - dev01
```
- pipelineプラットフォームをMicrosoftでホストされているLinuxマシンに設定（デフォルト）

```
pool:
  vmImage: ubuntu-latest
```
- プラットフォームにSFDX CLIをインストール
```
- bash: npm install sfdx-cli --global
  displayName: Install Salesforce CLI
```
- sfdx-cliのバージョン確認（pipelineに影響無し）
```
- bash: sfdx --version
  displayName: Show Salesforce CLI Version
```
- SFDXプロジェクを作成
```
- bash: sfdx force:project:create -n .
  displayName: Create a salesforce Project
```

- salesforce sandbox ft01環境に接続、四つのパラメータを渡す：
  - $(SALESFORCEDEVORGCLIENTID)、前に作成した salesforce環境接続アプリケーションの「コンシューマ鍵」を入力
  - $(SALESFORCEJWTKEYFILEPATH)、sandboxを接続の場合https://test.salesforce.comを入力、本番環境を接続の場合https://login.salesforce.comを入力
  - $(SALESFORCEDEVORGUSERNAME)、接続先環境の「システム管理者」プロファイルを持つ「ユーザ名」を入力
  - $(SALESFORCEDEVORGINSTANCEURL)、前にazure repoのブランチにアップロードしたserver.keyのファイルpath
```
- bash: sfdx force:auth:jwt:grant --clientid $(SALESFORCEDEVORGCLIENTID) --jwtkeyfile $(SALESFORCEJWTKEYFILEPATH) --username $(SALESFORCEDEVORGUSERNAME) --instanceurl $(SALESFORCEDEVORGINSTANCEURL) -a DepolyOrg
  displayName: Authorize salesforce org
```
- 本番deployの前に、資材deploy出来るが如何かの検証；一つのパラメータを渡す：
  - $(deploy_from_pkdiff.xml)：pkdiff.xml中の資材をdeploy、毎回修正された資材のみ含まれる
  - $(deploy_from_package.xml)：package.xml中の資材をdeploy、新しい環境作成ため全ての資材が含まれる　参考資料：[デプロイ手順](https://dev.azure.com/Interactive-Services-Pj/Cloud-Cam-Service/_wiki/wikis/Cloud-Cam-Service.wiki/280/%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E6%89%8B%E9%A0%86)
```
- bash: sfdx force:source:deploy -c --manifest manifest/$(deploy_from_pkdiff.xml) -u DepolyOrg 
  displayName: Deploy test OK
```
- 本番deploy
```
- bash: sfdx force:source:deploy --manifest manifest/$(deploy_from_pkdiff.xml) -u DepolyOrg 
  displayName: Deploy "manifest/$(deploy_from_pkdiff.xml)" to Sandbox DepolyOrg
```

pipelineの各ステップ、その内　「DisplayName:」を使用して、pipeline実行のlogでステップを表示できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/5f972c96-d18e-ce20-936a-fdaf6adaa6a4.png)


#### ④‐4 配布前のValidation（オプション)
コード説明　dev01-check_deployable_on_PR.yaml（STS-Team-Business-Sys check-SFdeploy）
#### 用途：dev01ブランチにpull Request出す時、deploy予定の資材がft01環境へdeploy出来るかどうかを検証、エラーの場合資材の再修正が必要
- pipeline起動条件をdev01ブランチにpull Request出す時場合に設定
```
trigger:
# 正式なやり方は不明だが、PRのときだけ走らせるため、存在しないブランチ名を指定しておく https://maku.blog/p/i6549xd/
- DUMMY_BRANCH_TO_BUILD_ONLY_ON_PR
pr:
# dev01をターゲットとしたPR時にトリガーする
- dev01
```
- pipelineプラットフォームをMicrosoftでホストされているLinuxマシンに設定（デフォルト）
```
pool:
  vmImage: ubuntu-latest
```
- 中身はazure-pipelines-dev01.ymlと同じ、但し本番deployのコードを抜き
```
steps:
- bash: npm install sfdx-cli --global
  displayName: Install Salesforce CLI
- bash: sfdx --version
  displayName: Show Salesforce CLI Version
- bash: sfdx force:project:create -n .
  displayName: Create a salesforce Project
- bash: sfdx force:auth:jwt:grant --clientid $(SALESFORCEDEVORGCLIENTID) --jwtkeyfile $(SALESFORCEJWTKEYFILEPATH) --username $(SALESFORCEDEVORGUSERNAME) --instanceurl $(SALESFORCEDEVORGINSTANCEURL) -a DepolyOrg
  displayName: Authorize salesforce org
- bash: sfdx force:source:deploy -c --manifest manifest/$(deploy_from_pkdiff.xml) -u DepolyOrg 
  displayName: Checking deployment "manifest/pkdiff.xml" to Sandbox DepolyOrg
```
###dev01ブランチにこのPipelineを設置
- 　dev01-check_deployable_on_PR.yaml（STS-Team-Business-Sys check-SFdeploy）を作成
- ブランチ画面でdev01ブランチの「branch policies」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/16413a81-0c9e-2306-68af-a5d8ca26bd16.png)

- 設置画面で「build validation」エリアの「enabled」をONにして、右上の”＋”をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/ce35b8ec-ab49-0dbc-1e28-96ac4d0c9e63.png)

- 先作成されたpipelineを選択し、要求により設置を変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/24035e6b-2f56-0f18-d1e8-dc67c944517d.png)