SalesforceのCIをJenkinsで構築する

この記事は[Salesforce Platform Advent Calendar 2019](https://qiita.com/advent-calendar/2019/salesforce-platform)の14日目です。

上長からJenkinsを使えばSalesfoceのCI/CDができると聞いたので環境を構築しました。
初めてなので最初はCIから作成し、手順を記事にしました。
CDに進化したらそのうち記事にします。

# やったこと
JenkinsをインストールしたサーバからSalesforce環境へ接続し、テストを実施するジョブを作成しました。
普段の開発環境ではブラウザからログインすればいいので楽でしたがCUIでは手順がおおく躓くことが多いイメージでした。

# Jenkins環境の構築
## Docker環境の構築
javaや前提パッケージのインストールは~~めんどい~~本題ではないのでDockerでJenkinsコンテナを立てます。
また、コンテナビルド時にSFDX CLIも一緒にインストールします。
※Dockerfileは割愛
参考：[Salesforce CLI のインストール - Linux での CLI のインストール
](https://developer.salesforce.com/docs/atlas.ja-jp.sfdx_setup.meta/sfdx_setup/sfdx_setup_install_cli.htm)
## Jenkinsへ接続確認
http://[IPアドレス or localhost]:8080にアクセスし、Jenkinsのセットアップ画面が表示されればJenkins環境の構築完了

# Salesforceへの接続
参考：[接続アプリケーションの作成 単元 \| Salesforce Trailhead](https://trailhead.salesforce.com/ja/content/learn/modules/sfdx_travis_ci/sfdx_travis_ci_connected_app)
## 自己証明書の作成
参考：[非公開鍵と自己署名デジタル証明書の作成](https://developer.salesforce.com/docs/atlas.ja-jp.sfdx_dev.meta/sfdx_dev/sfdx_dev_auth_key_and_cert.htm)
参考元を見つつサーバの秘密鍵と自己証明書を任意のディレクトリに作成

```bash
$ cd ./certificates
$ ls -l
-rw-rw-r-- 1 ec2-user ec2-user 1103 12月  2 14:49 server.crt
-rw-rw-r-- 1 ec2-user ec2-user  993 12月  2 14:49 server.csr
-rw-rw-r-- 1 ec2-user ec2-user 1675 12月  2 14:46 server.key
```
## 接続アプリケーションの作成
参考：[接続アプリケーションの作成](https://developer.salesforce.com/docs/atlas.ja-jp.sfdx_dev.meta/sfdx_dev/sfdx_dev_auth_connected_app.htm)
※参考元の12〜16も行う
次工程のJWTベースフローを使用した認証で使用するので表示された「コンシューマ鍵」をメモ帳等にコピーしておく
<img width="1165" alt="スクリーンショット 2019-12-14 11.34.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218344/7b86a224-1029-f14c-3559-e9b8e33b0347.png">
## JWTベースフローを使用した組織の認証
参考：
[JWT ベースフローを使用した組織の認証](https://developer.salesforce.com/docs/atlas.ja-jp.sfdx_dev.meta/sfdx_dev/sfdx_dev_auth_jwt_flow.htm#sfdx_dev_auth_jwt_flow)
[[Salesforce DX]Salesforce CLIを使ってJWTべアラートークンフローを試してみる ｜ Developers.IO](https://dev.classmethod.jp/cloud/salesforce-cli-jwt-token/)

環境変数にコンシューマ鍵、自己証明書への絶対パス、ユーザ名を設定する
（GUIブラウザがないため一般的なブラウザからのログインができないため）設定した環境変数を利用してJWTベースフロー認証を行う

```bash
# 環境変数の設定
export SFDX_USE_GENERIC_UNIX_KEYCHAIN=true
export CONSUMER_KEY=[コピーしたコンシューマ鍵]
export JWT_KEY_FILE=/path/to/certificates/server.key
export HUB_USERNAME=[ユーザ名]

# JWTベースフローを使用した組織の認証
$ sfdx force:auth:jwt:grant -i ${CONSUMER_KEY} -u ${HUB_USERNAME} -f ${JWT_KEY_FILE} -a jwt
Successfully authorized yamashita_daisuke+dev2@infonic.co.jp with org ID 00D0o000000RtMIEA0

# 認証情報の確認
$ sfdx force:auth:list
=== authenticated orgs
ALIAS  USERNAME   ORG ID   INSTANCE URL                OAUTH METHOD
─────  ────────  ────────  ──────────────────────────  ────────────
jwt    [ユーザ名]  [組織ID]  https://ap8.salesforce.com  jwt
```

# Jenkinsの設定
## JenkinsにSalesforce認証情報を登録する
Jenkins管理>システムの設定からグローバル プロパティに環境変数を設定する
<img width="1056" alt="スクリーンショット 2019-12-14 12.12.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218344/b45fabbf-0926-72c8-4d4d-ac9e146ebe0b.png">
## 自己証明書を登録
Jenkins Admin Credentialsインターフェイスを使用して、生成したserver.keyファイルをJenkinsシークレットファイルとして保存する
先に設定した環境変数「SERVER_KEY_CREDENTIALS_ID」の値（本記事ではSF_Develop）をIDに設定する
<img width="1007" alt="スクリーンショット 2019-12-14 15.33.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218344/4d7fe6af-2abe-9c42-32c8-b8c8905d7496.png">
## Custom Tools Pluginのインストール
Jenkinsの管理>プラグインの管理>利用可能 へと順番に押下し、フィルターに「Custom Tools」と入力しCustom Tools Pluginをインストールする
## Custom Toolsの設定
Jenkinsの管理>Global Tool Configuration からCustom toolの設定をする
<img width="1045" alt="スクリーンショット 2019-12-14 16.06.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218344/afcf0b23-e329-2b9c-5299-1264f3297767.png">

# Jenkinsでテストの実施
下記URLのJenkinsファイルをコピーしてジョブを作成する
https://github.com/forcedotcom/sfdx-jenkins-org/blob/master/Jenkinsfile

あとはジョブを実施してテスト三昧の毎日をお過ごしください:sunny:

# CIからCDへ
SFDX CLIを使用すると本番環境へのデプロイも可能らしいので近いうちにやってみたいですが、安全な環境でデプロイのテストってどうやるんですかね？
ご存知の方がおられたらコメントお待ちしております。

# 参照元
Salesforce DX 開発者ガイドで紹介されている組織開発モデルでCIを行うJenkinsのリポジトリです。
正直このレポジトリのReadmeに全て書いてあります。
[GitHub - forcedotcom/sfdx-jenkins-org: Jenkins example with org development](https://github.com/forcedotcom/sfdx-jenkins-org)

# 免責事項
当記事のコンテンツや情報において、可能な限り正確な情報を掲載するよう努めています。しかし、誤情報が入り込んだり、情報が古くなったりすることもあります。必ずしも正確性を保証するものではありません。また合法性や安全性なども保証しません。