SFDCのCI/CD対策（その1/2　CI）

### 要件
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/f20bc8bb-3162-b87c-d58f-682b4851274d.png)
・①開発環境から資材を取得する。初期の場合、時間をかけて、初期package.xmlを作成する。
・②デプロイ用ブランチ(dev01)と開発済み資材ブランチ(一時ブランチ tmp-dev01)の差分をとり、開発した資材のリストはpkdiff.xmlを格納。
　不要なソース(開発で変更しない標準オブジェクト等)は.gitignoreに追記し、管理対象としない。

・③改修内容（PBI/タスク）をコミットコメントに設定し、dev01にコミット。
　一時ブランチを削除
　AzureへPushする

・④Pipelineで自動的にデプロイを実施
　sfdx force:resouce:deploy xxx.xml -u ターゲット環境

### ⓪　事前準備
　Vscodeとsfdxのインストール
　　https://www.escortia.net/s/article/visual-studio-code-salesforce-MCETGZ7ONG25AKRHSVN2NQCAMMDY
　Gitのインストール
　　https://www.atlassian.com/ja/git/tutorials/install-git
  Azureの無料アカウント（Version管理のReposを作成する　例：dev01）
　　https://azure.microsoft.com/

#### ⓪ー1プロジェクトを作成
    プロジェクト名:dev01env(例）
　　実行：
　　　・VscodeのTerminalを開き、作業用フォルダで下記コマンドを実行し、sfdxプロジェクトフォルダ（＋デフォルト資材）を作成する
　　　・code dev01env を実行し、作成したsfdxプロジェクトフォルダを開く
　　　　※実行できない場合、Shift+Control+Pで、コマンドパレットを開いてそこから実行ください
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/dbc3c161-d061-e58c-160a-7fc8bc223361.png)
      ・初期化

```
sfdx force:project:create -n .
```

#### ⓪−2 git環境の構築
　　・作業フォルダーはプロジェクトの直下にする
　　・gitリポジトリ初期化
　　　　git init
　　・Azure上のリモートリポジトリと繋げる
　　　アカウント設定：（AzureのReposで自分の情報を確認）
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/26e7b514-a42a-5ffb-4faa-f36a507f8225.png)

　　　git config --global user.name "hu.chunqiang"
　　　git config --global user.email "xxxx"
　　　git config --global user.password "xxxxx" 
　　　git config --global core.quotepath false　　※漢字の文字化け対応

　　　git remote add origin https://XXX-Services-Pj@dev.azure.com/XXXXX/_git/XXXX
　　　git pull origin dev01  ※Azureのdev01がロカールへチェックアウト

　　・確認
　　　git config --global -l
　　　git branch -a 

　　・VscodeのTerminalにBashを選択し、シェルで操作する
　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/b3f9bd44-64b6-7988-2cdd-56fb59e27b65.png)

　　　.gitignoreが矛盾の場合、ロカールのものを削除する
　　　　rm .gitignore
      git  checkout -b dev01 origin/dev01  ※ローカルBranch

#### ⓪−3 Sandboxと繋ぐ
　　・ログイン設定
　　　sfdx force:auth:web:login -r https://test.salesforce.com -a sd-dev01 -s
　　　　※　-a 別名　-s DefaultUserOrg
　　　sfdx force:config:set defaultusername=sd-dev01　　※Default指定
　　　確認
　　　　 sfdx force:org:list
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/edadf1fe-b6ea-a254-f5c1-9b82c2e5db9d.png)

### ① 開発中資材（Sandbox資材）をローカルにダウンロードする
#### ①ー1 初期準備　Package.xmlの作成と整理
　　　最初のPackage.xmlを自動的にSandboxから作成する
　　　mkdir manifest
　　　sfdx force:source:manifest:create --fromorg sd-dev01 --manifestname ./manifest/pack-dev01.xml
　　　※開発環境sd-dev01のソースは全部リストされましたが、標準のモジュールが多いので基本的に管理したいものがすくないです。不要なものはpackage.xmlから削除する。

#### ①ー2 管理ソースはローカルへダウロード
　　・初回の場合
　　　sfdx force:source:retrieve --manifest ./manifest/package.xml
　　・初回以外は、管理モジュールが明確になるので、指定してダウロードする
　　　例：　//Apexクラス
　　　　　　sfdx force:source:retrieve -m ApexClass -u sand1
　　　　　　//Lightning Auraコンポーネント
　　　　　　sfdx force:source:retrieve -m AuraDefinitionBundle -u sand1
　　　　　　//Lightning Webコンポーネント
　　　　　　sfdx force:source:retrieve -m LightningComponentBundle -u san1
　　　　　　// CustomObject
　　　　　　sfdx force:source:retrieve -m CustomObject -u sand1
　　　　　　// standard Object
　　　　　　sfdx force:source:retrieve -m CustomObject:Account -u sand1
　　　　　　// flow
　　　　　　sfdx force:source:retrieve -m Flow:yourflowName -u sand1
　　　　　　// ApexPage
　　　　　　sfdx force:source:retrieve -m ApexPage -u sand1
　　　確認　ソースはforce-app/main/defaultにダウロードされる


### ②　開発した資材の差分XMLを抽出する
#### ②−１　一時ブランチと開発資材用ブランチで差分を取る
　　　・実行

　　　　git checkout -b tmp-dev01							→今のdev01から、ブランチを新規
　　　　git add force-app							→フォルダーforce-appの下ものは全部臨時ブランチに追加
　　　　git commit -m "XXXX"							→コミットする（-m オプションの値としてコミットコメントを設定。修正内容（PBI/タスク名など）を入力する）

```
　　　sfdx force:source:manifest:create --sourcepath \`git diff dev01 tmp-dev01 --name-only --diff-filter=MRA| awk '{printf ","$1;} \'` --manifestname ./manifest/history/pkdiffxxxx.xml
```
	
##### 2022/06/22 追記　追加差分のみにする。--diff-filter=MRAを追加、M−修正、R−名前変更、A−追加
削除部分を作成する（D−削除、R−名前変更の元）.操作前に修正元ブランチをチェックアウトする。

```
sfdx force:source:manifest:create --sourcepath `git diff fix/del5851-2 fix/del5851 --name-only --diff-filter=R | awk '{printf ","$1;} '; git diff fix/del5851 fix/del5851-2 --name-only --diff-filter=D | awk '{printf ","$1;} '` -t post
```
プロジェクトの直下に作成されるので、manifestへ移動する。mv destructiveChangesPost.xml manifest/.


　　　　※差分xmlのネーミングルール：固定「pkdiff」＋タスク番号		
#### ②‐2 以下のコマンドでデプロイ検証を行う※問題ある場合、解決した上で再度検証を行う

```
fdx force:source:deploy -c --manifest manifest/history/pkdiff5851.xml --postdestructivechanges manifest/destructiveChangesPost.xml -u sd-dev01 -g 	
```


   ※ -c 検証  -u ターゲット環境 -g ワーニングを無視
		
　　アンコミットのコマンド：

　　　git reset --soft HEAD^					→UnCommit
　　　git reset  HEAD xxxx/xxx/file    			→ git addから外す


#### ②‐3 下記のコマンドで差分package.xmlをpkdiff.xmlに上書きする
　　cp manifest/history/pkdiff5086_sample.xml manifest/pkdiff.xml
　　pkdiff.xmlに新規されたモジュールはpackage.xmlに手で追加してください。
　　（差分Deployはpkdiff.xmlを使う。新規環境の場合、package.xmlを使う）
　　最後、追加済かは下記コマンドで検証する
　　　	grep manifest/pkdiff.xml -v -f manifest/package.xml | wc -l
　　git add .
　　git commit -m "xxxxx"

#### ②ー4 コミットした資源をAzure上のリモートリポジトリに反映する
　　　git push -u origin tmp-dev01
     ※ローカルのブランチを削除
　　　　git branch --delete fix/5086


### まとめ
　　コマンドだけでソースのVersion管理とリリースはできて、画面操作より正確だし、はやいです。
　　次はAzureでソースが更新されると、自動的にDeployすることを紹介いたします。