salesforce metadataの管理

##### 目次
- [metadata管理イメージ](#metadata管理イメージ)
- [salesforce metadataの追跡機能](#salesforce-metadataの追跡機能)
- [vscodeでsf環境接続とmetadataバックアップ](#vscodeでsf環境接続とmetadataバックアップ)
- azure pipelineやgit actionでCICD実現
  - [vscodeを使って、salesforce（sfdx）とgit（azure repos）接続環境を構築](#vscodeを使ってsalesforceとgit接続環境を構築)
  - [git actionとsalesforce環境の連携でCICD実現](#git-actionとsalesforce環境の連携でcicd実現)
  - [資材deploy用xml作成コマンド](#資材deploy用xml作成コマンド)
  - [pipelienコードの例](#pipelienコードの例)
- salesforce devops centerでCICD実現（[official説明](https://help.salesforce.com/s/articleView?id=sf.devops_center_setup_install.htm&type=5),  [詳しい説明書PDF](https://trailhead.salesforce.com/trailblazer-community/download/file/0694S000000FsamQAC)）
  - 2022年12月新サービスの為、問題出やすい [devops centerについての問題](https://salesforcedevops101.com/2022/12/01/top-solutions-devops-center-issues/)、[カスタム表示ラベルが取得できない問題](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Jg1o1SAB)、[devops center issue feedback](https://github.com/forcedotcom/devops-center-feedback/issues)
  - [devops center上のCICD環境構築](#devops-center上のcicd環境構築)
  - [scratch組織作成と接続](#scratch組織作成と接続)
-------

##### metadata管理イメージ
- 初期ブランチ作成
  - ![初期ブランチ作成export.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/fd14166f-ea39-38f9-7bb6-4ef0a8852e22.png)
- １ヶ月の定期リリース
  - ![１ヶ月の定期リリースexport.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/48b954bd-d6a9-7bff-f741-97236cfe90b5.png)
- ３ヶ月以上の長期開発
  - ![３ヶ月以上の長期開発.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/bddc9f34-0686-0c9e-0e18-794f331abc1e.png)
- 緊急リリースの場合
  - ![緊急リリースの場合.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/6cf28c7b-77b4-67b6-d4a3-09d18b3abf8b.png)


##### salesforce metadataの追跡機能
salesforceのmetadataの変更を追跡するには
- まず本番組織（sandboxやscratch元の組織）の中、「dev　hubを有効化」と「developer　sandboxおよびdeveloper　pro sandboxのソース追跡を有効化」をonにする
![スクリーンショット 2023-03-30 15.43.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/46126e25-b769-8504-97c4-67a9eba6fd3a.png)
- そして本番組織からsandboxやscratch組織を作成。注意が必要のは、本番組織がソース追跡機能をコントロールしているが、ソース追跡は使えない、使えるのはsandboxやscratch組織。
- そしてsandboxやscratch組織と接続したvscodeで、`sfdx force:source:status`を入力すると、以下の様な追跡結果がでます
  ```
  Source Status
   STATE      FULL NAME                                              TYPE           PROJECT PATH 
   ────────── ────────────────────────────────────────────────────── ────────────── ──────────── 
   Remote Add object20230316test01__c.field20230316test01__c         CustomField                 
   Remote Add object20230316test01__c                                CustomObject                
   Remote Add unfiled$public/TestMailTemplate01                      EmailTemplate               
   Remote Add unfiled$public/TestMailTemplate02                      EmailTemplate               
   Remote Add unfiled$public/TestMailTemplate03                      EmailTemplate               
   Remote Add object20230316test01__c-object20230316test01レイアウト Layout                      
   Remote Add test02_20230310
  ```


##### vscodeでsf環境接続とmetadataバックアップ
**ローカル環境上の事前準備**
- [salesforce CLIをインスドール](https://developer.salesforce.com/ja/tools/sfdxcli)
- vscodeアプリをインスドール
  - vscodeの中、「Salesforce Extension Pack」をインスドール
    ![110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/3c75295a-0dc3-bfbc-3b24-dfd126a564f1.png)
- [gitをインストール](https://git-scm.com/downloads)

**ローカル環境上、作業用プロジェクトを作成、そしてsalesforce環境との接続**
- ローカル環境上作業用プロジェクトを作成
  - vscodeで作業フォルダーに入り、「view」タグの「Command Palette」をクリック
    ![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/1b57c37d-abc7-a1df-b1ba-6930e6f28626.png)
  - ”SFDX”を入力、「create project」をクリック
    ![112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/cc9aebe7-c485-e5c3-71c9-02a8243178ea.png)
  - 「standard」をクリック
    ![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/21ec54f8-0926-c6aa-d914-eb9069ffcd6b.png)
  - プロジェクト名（今回の作業プロジェクトを含むフォルダーの名）を入力
    ![113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/a6a7f39a-bd97-cc88-e3e6-ca663faaab51.png)
  - pathを選択、「create project」をクリック
    ![114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/b6eeaee3-c8cc-2e8e-aaa0-2d69140952a2.png)
  - 作業用プロジェクトが作成され、名前は先ほどの入力と同じ
    ![115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/f3a4b08d-fa77-415f-b629-9b07a045fdb5.png)
- ローカル環境とsalesforce環境との接続
  - 「view」タブの「Command Palette」をクリック
    ![120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/2db3b30f-ad1c-efd9-0bb7-68c5d250d714.png)
  - ”SFDX”を入力、「Authorize an Org」をクリック
    ![156.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/336e2c27-bdc5-9d99-3165-b65237ee40f0.png)
  - 接続先salesforceの種類を選ぶ、sandboxの場合は「sandbox」、本番の場合は「production」をクリック
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/24e8a5dd-0cf8-d5a5-7742-5a4d7c4869a1.png)
  - 接続先salesforceの仮名を入れる（齟齬を避けるため、出来るだけローカル作業用プロジェクト名、salesforce環境名、ここで入力の仮名を同じにする）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/507e10af-3fc1-3708-0d3c-eba53df78cbf.png)
  - 入力完了後、「enter」キーを押す、salesforce環境との接続を開始
    ![121.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/64119e34-14a3-5254-1520-278661f5ce58.png)
  - ブラウザから登録ページが表示され、ユーザ名とパスワードを入力、ログインボタンをクリック
    ![122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/754ec613-5e41-3105-82df-c0ec8efe150e.png)
  - 登録成功後、vscode画面で「successfully」のポップアップが表示され、同時に画面の左下で先入力した接続先salesforceの仮名が表示される
    ![123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/30a5e8d8-df6b-3be8-ba75-21effc2c7b75.png)
  - vscode左のプラグイン欄で「雲マーク（org browser）」をクリック、接続先salesforce環境のmetadataが表示される。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/3db19f4d-8599-1b60-7072-191abe082e5a.png)

**既存の作業用プロジェクトをダウンロード、そしてsalesforce環境との接続（backlogの例）**
- 先ずローカル環境上、作業フォルダーを作成（齟齬を避けるため、出来るだけローカル作業フォルダー名、salesforce環境名を同じにする）。
  ![130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/97800874-8bb1-15fe-6fa3-4b2c51d0faa0.png)
- vscodeで作業フォルダーに入り、左プラグイン欄で「ブランチマーク（source control）」をクリック、「Initialize Repository」をクリック
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/313db0e4-e0de-fc69-f116-301a3b644151.png)
- 「view」タグの「Command Palette」をクリック。
  ![131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/4b274c6d-cd9a-719b-ff57-5377a59fe994.png)
- ”git”を入力、「add remote」をクリック。
  ![132.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/22d2ab4b-50cb-7317-031b-8b633932df31.png)
- backlog git画面でURLをコピー、vscodeコマンド欄にペースト、「enter」キーを押す
  ![133.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/1b1f20ee-02fb-56b4-09c8-8a1332c4e2b5.png)
  ![134.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/2b5d382a-4382-3a5c-a181-e5ce0f91e968.png)
- gitの倉庫名を入力（齟齬を避けるため、出来るだけbacklog gitと同じにする）。
  ![135.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/049d2778-f20f-8c12-8d50-15d5419d12e2.png)
- 接続完了後、画面右下のブランチアイコンをクリック、「masterブランチ」を選択、リモート倉庫のmasterブランチをローカル環境にダウンロードする
  ![136.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/00f9c6db-2b4d-8e79-56f1-0f551dc78320.png)
  ![137.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/471ddff4-a6d9-c327-4030-e80c1ad4daa9.png)
- vscode左のプラグイン欄で「雲マーク（org browser）」をクリック、この時まだsalesforce環境に接続していないため、内容がない。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/9ca38ed8-cec0-9b2d-07f1-c4245053edc4.png)
- 画面下の「No Default Org Set」をクリック、「 Authorize an Org」コマンドをクリック
  ![138.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/e2dee44c-5936-6f54-37f8-3ed5e6b29bbd.png)
- 接続先salesforceの種類を選ぶ、sandboxの場合は「sandbox」、本番の場合は「production」をクリック
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/00da58e1-52f1-29ae-d291-f8093cdfd985.png)
- 接続先salesforceの仮名を入れる（齟齬を避けるため、出来るだけローカル作業フォルダー名、salesforce環境名、ここで入力の仮名を同じにする）
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/92f5d4c2-a9df-a03b-8128-ec22e9cffce3.png)
- 入力完了後、「enter」キーを押す、salesforce環境との接続を開始
  ![139.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/afccf9e3-636f-7fa9-671c-6c6f0274bd82.png)
- ブラウザから登録ページが表示され、ユーザ名とパスワードを入力、ログインボタンをクリック
  ![140.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/3db90ac1-0665-12dd-6ce8-8fd53b082ce6.png)
- 登録成功後、vscode画面で「successfully」のポップアップが表示され、同時に画面の左下で先入力した接続先salesforceの仮名が表示される
  ![141.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/36f89ac0-c727-53d7-f5a5-b892fe2ae491.png)
- vscode左のプラグイン欄で「雲マーク（org browser）」をクリック、接続先salesforce環境のmetadataが表示される。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/afcbf661-a8f7-6d2b-5f79-d26d247b002a.png)

**開発資材metadataを倉庫へ反映**
- 作業ブランチを作成
  - vscode画面右下のブランチボタンをクリック。例として、for-code-reviewブランチをクリック。もし存在し無い場合は、下の雲マークが付いてるfor-code-reviewをクリック
    ![150.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/5e8b3798-6921-92a5-830a-904f919deea4.png)
  - 現在いるブランチはfor-code-reviewである事を確認
    ![151.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/4bb12c96-ddfd-9ea8-7503-60965cddcfd6.png)
  - 「git pull XXX_XX for-code-review」コマンドで最新のfor-code-reviewブランチをローカルにダウンロード。「XXX_XX」はbacklog git倉庫名
  - 「git branch 作業ブランチ名」コマンドで作業ブランチを作成
  - 「git checkout 作業ブランチ名」コマンドで作業ブランチに切り替える、右下のブランチ名を確認。
    ![152.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/df75aab1-8424-b11f-d8e7-c673a84a9c97.png)
- salesforce環境からか開発資材metadataをダウンロード
  - vscode画面上「org browser」をクリック、接続salesforce環境から資材種類を選択、ダウンロードボタンをクリック。例えばApex classの場合は「Apex Classes」、Apex triggerの場合は「Apex Triggers」
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/6c987ec0-6849-00d1-5554-812c7c891f2a.png)
  - vscodeの「Explorer」に入り、「force-app/main/default」パスの下で、資材を確認。例えばApex classの場合は「classes」、Apex triggerの場合は「triggers」
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/2406c54d-0b37-edfe-84af-33f4986f94f6.png)
  - 資材を修正、保存した後、「Source Control」マークをクリック、資材の変更内容を確認。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/c10feb6e-0d2f-6950-5a7e-0925ccdaf2ec.png)
- 作業ブランチをbacklog gitへアップロード
  - 「git add .」と「git commit -m '作業についての説明'」コマンドで今回の作業内容をcommitし、「git push 目標リモート倉庫名 作業ブランチ名」コマンドで今回の作業ブランチをリモート倉庫へアップロード。アップロード完了後、backlog git上作業ブランチを確認できる

**git操作コマンド例**
- `git fetch origin リモート倉庫中ブランチ名` リモート倉庫中のブランチをローカル環境にダウンロード
- `git pull XXX_XX for-code-review` リモート倉庫（XXX_XX）からブランチ（for-code-review）をダウンロード
- `git branch 新規ブランチ名` 当前の作業ブランチをコピーし、新しいブランチを作成
- `git checkout ブランチ名` 目標ブランチに切り替える
- `git add .` 作業ブランチに対しての変更をcommitできる様にする
- `git commit -m '作業についての説明'` 作業ブランチに対しての変更をcommitし、一つの記録を残す
- `git push XXX_XX for-code-review` リモート倉庫（XXX_XX）に向けってブランチ（for-code-review）をアップロード
- `git branch -d ブランチ名` 目標ブランチを削除。削除できない場合、”-D”で強制的削除


##### 資材deploy用xml作成コマンド
前提条件：sfdx CLI、gitを環境にインストール済
作業ブランチで修正されたmetadata資材を、xmlファイルに追加。手動でdeploy用xml作成の手間は省ける。
本来awkを使ってもっと簡単なコマンドでできるが、sfdx資材には”Case-Case Layout.layout-meta.xml”みたいな、ファイル名に空白が有る標準オブジェクトのレイアウトがある、でもsfdxコマンドで資材deployの時、空白の左右が二つの資材とみなされる。その為「"」を使って、資材名を囲む必要がある。
```shell:pkdiff.xml作成コマンド；作業ブランチ、元ブランチ、xmlパスのパラメータの用意が必要
sfdx force:source:manifest:create -p "`git diff 【作業ブランチ名】 【元ブランチ名】 --name-only --diff-filter=MRA | awk '{ o = NF > 1 ? "'\''" $0 "'\''" : $0; s = length(s) > 0 ? s "," o : s = o } END{ print s }'`" -n 【生成されたxmlのパス、例：./manifest/history/pkdiff9999.xml】
```


##### pipelienコードの例
```yaml:
jobs:
  # 実行ジョブ判定
  - job: DetermineReplaceability
    # Branch policy起動の場合、ソースブランチ判定は「System.PullRequest.SourceBranch」変数を使用すれば可能
    condition: not(startsWith(variables['System.PullRequest.SourceBranch'], 'refs/heads/gitresource'))
    steps:
      # 置換対象の検索結果を内部変数に保持し、後続のジョブに出力
      - bash: echo "##vso[task.setvariable variable=result;isoutput=true]`find force-app/main/default -type f | xargs grep -ls 'REPLACE_TO_ENV_ORG_EMAIL_ADDRESS'`"
        name: searchTargets
        displayName: Search for a file to replace.
      - bash: echo $(result)

  # Check and Deploy by Salesforce Cli
  - job: CheckDeploy
    dependsOn: DetermineReplaceability
    variables:
      # 前のジョブから置換対象の検索結果を受け取る
      sourceFiles: $[ dependencies.DetermineReplaceability.outputs['searchTargets.result'] ]  
    condition: and(succeeded(), eq(variables.sourceFiles, ''))
    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
      # SFDXデプロイ可能性チェック
      - bash: sfdx force:source:deploy -c --manifest manifest/pkdiff.xml --postdestructivechanges manifest/destructiveChangesPost.xml -u DepolyOrg 
        displayName: Check to Deployable
      # SFDXデプロイ
      - bash: sfdx force:source:deploy --manifest manifest/pkdiff.xml --postdestructivechanges manifest/destructiveChangesPost.xml -u DepolyOrg 
        displayName: Check to Deployable

  # Check and Deploy by Salesforce Cli　After　Replacement 
  - job: ReplaceAndCheckDeploy
    dependsOn: DetermineReplaceability
    variables:
      sourceFiles: $[ dependencies.DetermineReplaceability.outputs['searchTargets.result'] ]  
    condition: and(succeeded(), not(eq(variables.sourceFiles, '')))
    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: echo "##vso[task.setvariable variable=ENV_ORG_EMAIL_ADDRESS]sample@mail.com" && echo "[ENV_ORG_EMAIL_ADDRESS = $(ENV_ORG_EMAIL_ADDRESS)]"
        displayName: Set Organizational Email Address to variable.
      # REPLACE_TO_ENV_ORG_EMAIL_ADDRESSを置換すべきアドレスに置換
      - bash: find force-app/main/default -type f | xargs grep -ls 'REPLACE_TO_ENV_ORG_EMAIL_ADDRESS' | xargs sed -i.bak s/REPLACE_TO_ENV_ORG_EMAIL_ADDRESS/$(ENV_ORG_EMAIL_ADDRESS)/g;find force-app/main/default -type f -name '*.bak' | xargs rm -f
        displayName: Replace REPLACE_TO_ENV_ORG_EMAIL_ADDRESS to Organizational Email Address.
      # SFDXデプロイ可能性チェック
      - bash: sfdx force:source:deploy -c --manifest manifest/pkdiff.xml --postdestructivechanges manifest/destructiveChangesPost.xml -u DepolyOrg 
        displayName: Check to Deployable
      # SFDXデプロイ
      - bash: sfdx force:source:deploy --manifest manifest/pkdiff.xml --postdestructivechanges manifest/destructiveChangesPost.xml -u DepolyOrg 
        displayName: Check to Deployable

  # Gitリソースのマージ
  - job: UpdateGitResources
    # Branch policy起動の場合、ソースブランチ判定は「System.PullRequest.SourceBranch」変数を使用すれば可能
    condition: startsWith(variables['System.PullRequest.SourceBranch'], 'refs/heads/gitresource')
    steps:
      - script: echo Git資材更新
```


##### vscodeを使ってsalesforceとgit接続環境を構築
この操作は既にgit資材がある前提、且つ「.gitignore」でsfdx関連のファイルを全部排除の場合のみ適用する
- 先ず倉庫をローカルへコピーする
  ![スクリーンショット 2022-10-04 19.44.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/61b78b6b-7e0d-5bbb-ccb6-7a7b4d549d5c.png)
  ![スクリーンショット 2022-10-04 19.44.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/80033d4e-a860-8413-31b8-c89b6f827442.png)
- コピー後は自動的にリモート倉庫と繋ぐ状態です。そしてここでbranchは「dev01」の状態である事を確認、もし別のbranchなら、originから「dev01」を取って、切り替える
- そしてローカル環境で、一つのsalesforceプロジェクトを作る、そしてプロジェクトの中を全部ローカル倉庫dev01ブランチに入れる
  ![スクリーンショット 2022-10-04 19.48.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/b9eaffbb-3abd-0c83-ef7a-a3aa28138a54.png)
- コピペーの時、“重複ファイルの上書きをスキップしますか？“みたいな確認選択が出ると思います。この時“重複ファイルを上書きしない“を選択。もし間違えて“上書きする“を選び、或いはコピー後gitから差分が検出された場合、この時一気に更新を消す
  ![スクリーンショット 2022-10-04 19.50.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/c451bd28-6a84-483b-5189-bd1fed33cc81.png)
- こうしたら、「.gitignore」で排除された、salesforce設定に関するファイルは残され；この時直接コマンド「SFDX: Authorize an Org (SFDX: 組織を認証)」で組織と繋げます

##### git actionとsalesforce環境の連携でCICD実現
salesforce上の設置
- JWTbearer authorization為の
  - server.keyとserver.crt　（証明書）をローカル環境で作成。参考:[Salesforce CI/CD using Azure DevOps Services](https://abhisheksubbu.github.io/salesforce-azure-devops/)
  - server.key作成
    `openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out server.key`
  - server.csr作成
    `openssl req -new -key server.key -out server.csr`
  - server.crt作成、誘導を従う、メールアドレスや地名は認証作業に影響なし
    `openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt`
  - 補充説明、salesforce組織上直接証明書の作成方法。
    （JWTbearer authorizationの方法でsalesforce組織接続の場合、以下の組織上直接証明書作成の方法は進めない、理由は、`force:auth:jwt:grant`コマンドのserver.keyが作成できないから）
    開発者のユーザに登録し、JWTベアラートークン作成。クイック検索で「証明書と鍵の管理」画面に入り、「自己署名証明書の作成」で証明書作成、そしてダウンロード  [参考：自己署名証明書の生成](https://help.salesforce.com/s/articleView?id=sf.security_keys_creating.htm&type=5)
  ![スクリーンショット 2023-02-07 10.33.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/8341b0a5-76ef-abcf-17aa-17511f424442.png)
  ![スクリーンショット 2023-02-07 10.37.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/fe026563-4bf2-f9c2-1519-e0382da47727.png)

- クイック検索で「アプリケーションマネージャ」画面に入り、「新規接続アプリ」を作成。
  - 「取引先責任者 メール」には開発者のメールアドレスを入れ、
  - 「OAuth 設定の有効化」をONにする、コールバック URLに`http://localhost:1717/OauthRedirect`入れ、
  - さっき作成したデジタル署名をアップロード、
  - 「選択した OAuth 範囲」は
    `API を使用してユーザデータを管理 (api)`
    `Web ブラウザを使用してユーザデータを管理 (web)`
    `いつでも要求を実行 (refresh_token, offline_access)`にする
  ![スクリーンショット 2023-02-07 10.49.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/ac69231a-95d6-1312-c683-1913dc32c163.png)
  ![スクリーンショット 2023-02-07 10.50.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/1f687660-8965-c383-ce01-6d733349e5b6.png)
  - 保存後、「Manage」をクリックし、「ポリシーを編集」 をクリック、sessionとトークンの有効期間を設置できる。この接続アプリを使用出来るユーザに制限付けのも出来る、今回は「システム管理者」プロファイルを持つユーザに制限した。
  ![スクリーンショット 2023-02-07 10.57.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/8d7c4379-876c-ae70-1b2c-3493d8bc4874.png)
  ![スクリーンショット 2023-02-07 10.58.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/51d8c23d-33f9-111f-a1f7-2df2cdc2cf76.png)
  ![スクリーンショット 2023-02-07 11.08.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/d2f39f97-b2ea-25a4-31c5-78257d7e9b88.png)
  ![スクリーンショット 2023-02-07 11.11.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/07d23e2c-b93a-ef4f-607c-566bc213fb0c.png)

  - 接続アプリから「コンシューマ鍵」と「コンシューマの秘密」を取得。接続アプリ参照画面に入り、「コンシューマ詳細管理」をクリック、現在登録中のユーザメールアドレスで確認メール受けた後、確認コードを入力、表示画面で「コンシューマ鍵」と「コンシューマの秘密」を取得。
  ![スクリーンショット 2023-02-08 11.08.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/23e2fd9a-b1ff-dc80-ad89-66b29716abb9.png)
  ![スクリーンショット 2023-02-08 11.10.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/f06c0f6e-b0d3-0d1d-c154-b91585eef048.png)

  - GitHub倉庫に、salesforce環境接続為のgit action用keyを入力。github倉庫に入り、「setting」タブ下の「secrets and variables」の「actions」に入り、「new repository secret」をクリック、以下のkeyを作成（keyの名前は強制しないが、git actionに使う為、ネーミングルールを考慮べき）
    - ORG_USER: Salesforceで作成したユーザーのユーザー名（今回接続アプリに「システム管理者」プロファイルの制限ある為、「システム管理者」ユーザを入れる）
    - CLIENT_ID: 接続アプリケーションのコンシューマ鍵
    - PRIVATE_KEY_BASE64ED: 接続アプリケーションのコンシューマの秘密
  ![スクリーンショット 2023-02-08 11.17.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/c96d9cb7-2e92-a85a-4886-d6c32280a632.png)

  - 参考：[GitHub Actions と Salesforce DX CLI を使って Salesforce開発でCI/CDする（まずは認証編）](https://tech.isid.co.jp/entry/2022/11/15/GitHub_Actions_%E3%81%A8_Salesforce_DX_CLI_%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6_Salesforce%E9%96%8B%E7%99%BA%E3%81%A7CI/CD%E3%81%99%E3%82%8B%EF%BC%88%E3%81%BE%E3%81%9A%E3%81%AF%E8%AA%8D%E8%A8%BC%E7%B7%A8)


##### devops center上のCICD環境構築
devops centerはsalesforce上metadataを管理、そしてdeploy（CICD）用のAPP、GitHub倉庫と開発環境→ テスト環境（追加できる）→ 本番環境への資材反映pipelineを作成できる。
- 環境構築手順。事前用意必要のは：GitHub倉庫、システム管理者ユーザを持っているsf環境（開発、テスト、本番）、devops centerをインスドール環境（テストや本番のsalesforce組織、sandbox不可）
  - devops centerをインスドール。クイック検索で「devops」検索、インスドール時、「管理者のみのインスドール」を選択
参考資料：[Install and Configure DevOps Center](https://help.salesforce.com/s/articleView?id=sf.devops_center_setup.htm&type=5)
    ![スクリーンショット 2023-02-10 11.03.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/f2bb9c3d-9289-f074-9840-87e55a3b20c7.png)
    ![スクリーンショット 2023-02-10 11.05.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/f0cd60eb-b928-9fd7-7844-e51e2e67f9c7.png)
  - インスドール完了後、「インストール済みパッケージ」で表示される
    ![スクリーンショット 2023-02-10 12.11.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/7491b62e-0e24-cb95-0dc2-635122b0b452.png)
  - devops centerをインスドールした組織で接続アプリを作成。その内、「取引先責任者 メール」は特に制限がない、「開始 URL」を`/sf_devops/DevOpsCenter.app`にする。
    ![スクリーンショット 2023-02-10 12.21.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/b719bc52-d515-95bb-45ee-c35a8eec36a2.png)
    ![スクリーンショット 2023-02-10 12.23.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/6ad41161-f5d6-b7ae-f65d-41fc8735a66e.png)
  - 保存後、接続アプリの「manage」画面に入り、「権限セットの管理」で「sf_devops_NamedCredentials」権限セットを追加。そして開発者（ユーザ）に「sf_devops_NamedCredentials」の権限セットも追加、こうすると、権限セットを持つユーザは、アプリケーションランチャーから「DevOps Center」をアクセスできる。
    ![スクリーンショット 2023-02-10 12.25.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/5bc7f2fe-3f9e-834e-4175-83e0fc051636.png)
    ![スクリーンショット 2023-02-10 12.25.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/3f8fb7f9-2af7-4c0a-21df-4fbb2dd77c43.png)
    ![スクリーンショット 2023-02-10 12.28.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/ecc80d95-34d4-def2-5f1d-5ed1e8ce56ba.png)

- pipelineを作成、github倉庫、開発環境、テスト環境、本番環境を接続。
  - devops centerに入った後、「新しいプロジェクト」をクリック。
     ![スクリーンショット 2023-02-13 15.47.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/46261a3a-ee74-3f35-461e-06ea76cf3605.png)
  - 前で用意したgithubアカウントで登録、そして今回の開発の為、新倉庫、又は既存の倉庫を紐付ける。
    ![スクリーンショット 2023-02-13 15.51.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/500df1ff-274e-2b7d-a978-0a59b1a4d35a.png)
  - 新倉庫作成を選択する場合、新しいpipelineが作成された同時に、関連されたGitHub倉庫も自動的に作成。
    　- 新作成倉庫はデフォルトで「private」タイプ
    　- もしGitHub上倉庫の名前を手動で修正したら、pipelineからエラーが出る
    ![スクリーンショット 2023-02-13 15.56.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/bf2b1a1c-afbf-b3f0-291c-e9349883f29a.png)
    ![スクリーンショット 2023-02-13 15.59.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/6feada1d-8cf6-cd8d-e2e5-e2adf2a1a93e.png)
  - 現在のpipelineはGitHub倉庫と接続済が、salesforceの開発環境、テスト環境、本番環境と未だ接続してない。先ず「クリックして接続」をクリックし、開発資材を最終的に反映したい本番環境を接続
    ![スクリーンショット 2023-02-13 16.18.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/68321d60-237e-2da2-9958-05cf82f065bb.png)
  - 接続環境の種類を選択、本番組織（ここではProfessional Edition、Enterprise Edition、Developer Editionなど、正式のsalesforce組織）の場合、ログインURLは`https://login.salesforce.com/`。sandboxとScratchの場合、ログインURLは`https://test.salesforce.com`
    ![スクリーンショット 2023-02-13 16.22.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/ce9f83e3-2c56-a478-4d2b-f74b26bbc219.png)
    ![スクリーンショット 2023-02-13 16.35.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/189b7262-ce36-7f82-51b8-a07668e4596e.png)
  - pipelineをクリックし、詳細画面に入ると、pipelineに開発、又はテストのフェーズを追加や削減することができる。各フェーズを該当するsalesforce環境とgithubブランチに接続。
    - 一番前の「開発環境」が接続できるのは「sandbox」と「scratch組織」のみ、salesforce本番組織は接続出来ない。
    ![スクリーンショット 2023-02-13 16.40.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/788a1006-b2f9-bb02-30d5-42d5c68a3d37.png)
    ![スクリーンショット 2023-02-13 16.45.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/ff42663c-fab6-c800-6f59-415af98dccc9.png)
    ![スクリーンショット 2023-02-13 17.13.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/adc485bd-e383-cc62-8eb3-15feac156819.png)

- pipelineを有効化し、資材開発→ テスト環境→ 本番環境、この資材反映の簡単な流れ
  - 有効化した即後、無効化出来る
    ![スクリーンショット 2023-02-14 13.38.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/53972db6-c0a9-13fc-5f65-fc805bf80984.png)
  - 「作業項目」の「新しい作業項目」ボタンで新開発のタスクを作成。
    ![スクリーンショット 2023-02-14 13.40.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/4d8fc434-410f-9ec0-d8dc-d49297a7b15b.png)
    - 作業項目の「ID」は自動追番され、そして同じdevops centerの下では一意。例えは、pipeline001の中、作業項目が5個作成された場合、新しいpipeline002を作成、そしてpipeline002の中で作業項目を作成したら、この作業項目は「000006」で始める。
      ![スクリーンショット 2023-02-14 13.44.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/2e153a74-82eb-2f62-dbd0-689730373d56.png)
  - 作業項目に入り、開発資材取得方式を選ぶ。
    - salesforce環境から取得の場合、devops centerは自動的に開発環境上資材の変更を洗い出し、そしてユーザは他環境へ反映したい変更を選ぶ。
    - GitHubブランチから取得の場合、ユーザは手動で反映したい資材を作業項目に合わしたブランチに入れる必要がある。
    ![スクリーンショット 2023-02-14 13.52.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/18f9bd73-65c3-af9b-d3ea-b369f49b5840.png)
  - devops center使うため、salesforce環境から取得を選択。そして開発環境をテスト環境と同期させる。同期後、開発環境は「最新」の表示が出る。
    ![スクリーンショット 2023-02-14 14.11.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/6cdd8c98-8758-95ef-70d7-965c5e4bfb40.png)
    ![スクリーンショット 2023-02-14 14.11.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/8b7fd546-d4e3-33c2-b7f6-f0a3167e7f5b.png)
    ![スクリーンショット 2023-02-14 14.13.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/6abbfc78-0808-0f44-b950-611d1352b40c.png)
    ![スクリーンショット 2023-02-14 14.13.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/6225aacb-bc7c-850f-1659-452af6ca1ec0.png)
  - 例えば「Hello」と言うapex calssとそのtest classを作成、そしてテスト環境、本番環境へ順番に反映の場合、まず開発環境でapex classを作成、そして作業項目の中で「変更を取り込み」ボタンで画面を更新、そして変更項目にチェック入れ、「コメント」を入力、「変更を確定」ボタンをクリック。この時、作業項目と関連されたGitHubブランチを見ると、関連資材の変更を含むcommitが作成される。
    ![スクリーンショット 2023-02-14 14.34.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/e56e0dcd-1288-e419-48f9-12bfefe78054.png)
  - 変更を確定したら、「レビューを作成」ボタンを押すと、作業項目の状態は「レビュー中」に入り、そして「変更要求を表示」をクリックと、作業項目ブランチからテスト環境へのpull requestが作成される。
    ![スクリーンショット 2023-02-14 14.45.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/2414a723-5dbb-bebe-c0aa-6462ad91cb19.png)
    ![スクリーンショット 2023-02-14 14.46.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/e46e3a27-7e7a-bffd-8569-cf0af1a4f227.png)
    ![スクリーンショット 2023-02-14 14.47.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/644e683b-53e4-5553-f7f4-c2f11536a165.png)
    - もしGitHub側では、pull request作成の時conflict発生した場合、以下の画面が出て、conflict解消する前、昇格準備は出来ない
      ![スクリーンショット 2023-02-14 16.03.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/efb56033-04d0-4451-2e8e-dd8ac5f7f5d1.png)
  - コードレビューした後、「昇格準備完了」をonにすると、作業項目の修正ができなくなる。この時「パイプライン」の「フェーズ」画面では、開発資材をテスト環境へ反映できる。
    ![スクリーンショット 2023-02-14 14.55.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/b7c907aa-f408-1512-10ab-281328501e2d.png)
    ![スクリーンショット 2023-02-14 14.57.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/8671b602-4e62-0570-0c85-69b2c21afa0d.png)
  - 「選択したものを昇格」をクリック、昇格をオプションを設置、「昇格」ボタンをクリック。昇格後、テスト環境から本番環境への反映が可能になる。そして作業項目ブランチからテスト環境ブランチへのpull requestはmerge済状態になる。同時にapex classがsalesforceテスト環境上に反映される。
    ![スクリーンショット 2023-02-14 14.59.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/618e7482-c7e1-1401-a23c-56e50232e177.png)
    ![スクリーンショット 2023-02-14 15.01.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/369dc3a6-ccdb-e71c-fdf0-d2c44e0c94bb.png)
    ![スクリーンショット 2023-02-14 15.10.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/7779abe1-b7c1-caad-df32-013ab8428bfe.png)
    ![スクリーンショット 2023-02-14 15.02.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/d8e869f3-1f8b-a04f-0eeb-f70794b8fff6.png)
  - 同じ操作でテストフェーズから本番環境へ資材を反映
    ![スクリーンショット 2023-02-14 15.06.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/f022913f-d4cf-c0bd-a1a7-e9d2c1e1f5ff.png)

- [参考資料：[Salesforce]DevOps Center(ベータ版)を使ってみた](https://zenn.dev/yfujii01/articles/50d40ca0ba731a)
  [SalesforceのDevOps Centerがリリースされたので設定](https://qiita.com/geeorgey/items/7562499bb17fde577e62)


##### scratch組織作成と接続
- salesforce環境上クイック検索で「Dev Hub」を検索し、有効かする。
- ローカルvscodeで有効かしたsalesforce环境に接続
  `sfdx auth:web:login`
- 例えは、`mywork`と言うスクラッチ組織(scratch org)生成
  `sfdx force:project:create -—projectname mywork`
- `mywork`と言うスクラッチ組織に臨時ユーザ作成、
  `sfdx force:org:create -f config/project-scratch-def.json -a mywork`
  臨時ユーザ作成後、以下の様な内容が表示される、
  ![スクリーンショット 2023-03-09 15.41.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/b3bf90f8-8778-be59-3210-cfccc2170d6b.png)
  この時`sfdx force:org:list --all`で組織の接続状況を表示すると、作成されたscratch組織状態が`Active`になる。
  ![スクリーンショット 2023-03-09 15.44.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/e572d1b3-f944-407f-4854-a22ed4b8e7e9.png)
- 作成されたユーザにパスワードつける
  `sfdx force:user:password:generate -u mywork`
  ![スクリーンショット 2023-03-09 15.45.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/da65a743-0027-bc99-c77b-6fd726f2b830.png)
- ユーザ`test-mu6cbgoyx03n@example.com`の詳細情報を見る、「Instance URL」はブラウザ上scratch組織のアクセス用URL。
  `sfdx force:user:display -u test-mu6cbgoyx03n@example.com`
  ![スクリーンショット 2023-03-09 15.51.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747384/322a305d-fa3b-e4ca-114a-f3d3575d7a9a.png)
- 現在ローカル環境とsf組織の接続状況listを見る
  `sfdx force:org:list --all`
  - その内、ブラウザ上srcaltch環境にloginする場合、「Login Url」項目のリンクでloginする。
- myworkと言組織ページを開く
  `sfdx force:org:open -u mywork`
- 参考：[[Salesforce]DevOps Center(ベータ版)を使ってみた](https://zenn.dev/yfujii01/articles/50d40ca0ba731a#%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83(scratch%E7%B5%84%E7%B9%94)%E3%81%AE%E4%BD%9C%E6%88%90)