Salesforce DXプロジェクト「ebikes-lwc」をCircle CIで動かす

# はじめに

Salesforceの最近のサンプルアプリはみな[Circle CI](https://circleci.com/)を使っています。

* ご存知「DreamHouse」
    * https://github.com/dreamhouseapp/dreamhouse-sfdx
* 最近公開されたLWCのサンプル「ebikes-lwc」
    * https://github.com/trailheadapps/ebikes-lwc
* 先日紹介したISVパッケージ開発テンプレート「SFDX-Falcon」
    * https://github.com/sfdx-isv/sfdx-falcon-appx-package-kit

Circle CIの手順はSalesforce DX開発者ガイドの「[CircleCI を使用した継続的インテグレーション ](https://developer.salesforce.com/docs/atlas.ja-jp.sfdx_dev.meta/sfdx_dev/sfdx_dev_ci_circle.htm)」に書いてありますが、`ebikes-lwc`で設定を試してみましたので、手順をまとめておきます。

ドキュメントの[sfdx-circleci](https://github.com/forcedotcom/sfdx-circleci)リポジトリと違って、`ebikes-lwc`はCircle CIのWorkflowを使っていたり、LWCのコードのlintやユニットテストをしていますが、まあ動かす手順には特に関係ないですね。

# ポイント

ポイントはDevHub組織にどうJWT認証するかです。後はただ必要なsfdxコマンドを呼ぶだけです。

Salesforceのサンプルアプリだと2パターンあります。

1. JWT認証の秘密鍵を16進ダンプしてCircle CIの環境変数に設定する
2. JWT認証の秘密鍵をさらに暗号化してリポジトリに入れ、暗号化に使った秘密鍵とIVをCircle CIの環境変数に設定し、CIのジョブで復号化して認証する。

上に挙げた例だとSFDX-Falconが`1`で、残りは`2`ですが、ドキュメントもそうなっていますし、やはり安全を考えると２の一択になります。

Travis CIの場合は、`travis encrypt-file`というコマンドで2の処理が簡単にできますが、Circle CIにはその機能がないのでちょっとがんばる必要があります。

# ebikes-lwcをCircle CIで動かす

では、試しに[ebikes-lwc](https://github.com/trailheadapps/ebikes-lwc)をCircle CIで動かしてみましょう。

## 前提

* LWCアプリなので、DevHub組織としてSpring'19プレビュー組織を設定。
* 使わないのですが、パッケージ作成組織が必要。（「`SFDX_AUTH_PACKAGING`について」参照）

DreamHouseもたぶんほぼ一緒なのでSpring'19環境を用意するのが面倒な方はそちらを試してみてください。

## リポジトリをfork

まず、 https://github.com/trailheadapps/ebikes-lwc をforkしてください。

## 接続アプリケーションの作成

基本的に以下のTrailheadの通りに設定してください。

[接続アプリケーションの作成 単元 | Salesforce Trailhead](https://trailhead.salesforce.com/ja/content/learn/modules/sfdx_travis_ci/sfdx_travis_ci_connected_app)

SSL証明書を作るときは、`Country`に`JP`と`Common Name`だけ入れておけばとりあえず動きます。

## 暗号化した秘密鍵を作成

上記で作成した`server.key`を暗号化するための`key`と`iv`を作成します。

```
$ openssl enc -aes-256-cbc -k <パスフレーズ> -P -md sha1 -nosalt
key=*****99999
iv =*****99999
```

`server.key`を暗号化します。

```
$ openssl enc -nosalt -aes-256-cbc -in certificates/server.key -out certificates/server.key.enc -base64 -K <上のkey> -iv <上のiv>
```

`server.key.enc`ができるので、`.circleci/server.key.enc`と置き換えます。

`.circleci/server.key.enc`を置き換えたら、GitHubにpushしてください。

## Circle CIに設定

[SETTINGS] > [Projects]のforkした`ebikes-lwc`の歯車アイコンを開きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/27267/8477096d-84da-ba16-b915-a221c5d4cac5.png)

[Environment Variables]の[Add Variable]ボタンから以下の4つの環境変数を追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/27267/74c7d485-3d48-51f8-f464-229655648173.png)

* `CONSUMERKEY_PRERELEASE`: 作成した接続アプリのコンシューマキー
* `USERNAME_PRERELEASE`: DevHub組織のユーザ名
* `DECRYPTION_KEY`: 前の手順で作成した復号化のための`key`
* `DECRYPTION_IV`: 前の手順で作成した復号化のための`iv`
* `SFDX_AUTH_PACKAGING`: 後述

>※`ebikes-lwc`の場合はこのような環境変数になりますが、他のサンプルアプリだと環境変数名が異なったりするので、`.circleci/config.yml`を確認してください。

### `SFDX_AUTH_PACKAGING`について

`SFDX_AUTH_PACKAGING`はパッケージ作成組織の`sfdxAuthUrl`を指定します。

パッケージの作成のテストをするための設定で、`SFDX_TEST_PACKAGING`環境変数を`true`にすると、そのテストもしようとします。しかし、`scripts/packagingDeployment.sh`が存在しないので、エラーになります。[DreamHouseだとある](https://github.com/dreamhouseapp/dreamhouse-sfdx/blob/master/scripts/packagingDeployment.sh)ので、設定だけコピーしてきたんだと思います。そして、`true`以外にしてもパッケージ作成組織への認証をスキップはしてくれないので、一応設定します。

`sfdxAuthUrl`は、以下のコマンドで出力できます。出力JSON内の`sfdxAuthUrl`というキーの値を設定してください。`force://<clientId>:<clientSecret>:<refreshToken>@<instanceUrl>`のような形式になっています。

```
$ sfdx force:org:display -u <パッケージ作成組織のエイリアス> --json --verbose
```

まあどっちにしても動かないので、`SFDX_TEST_PACKAGING`は設定せず、`.circleci/config.yml`から以下の二行を削除してもよいと思います。

```
echo $SFDX_AUTH_PACKAGING > ~/auth.url
node_modules/sfdx-cli/bin/run force:auth:sfdxurl:store -s -a packagingorg -f ~/auth.url
```

## CIの実行

[Follow Project]ボタンをクリックすると、Workflowが実行されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/27267/57e50276-02b3-0830-4561-8e6088343072.png)

しばらく待つと[WORKFLOWS]タブで成功しているのが確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/27267/78c9263c-50d1-0554-9dba-60c8efbb00fb.png)

以降はpushする度にこのWorkflowが実行されます。

# おわりに

[Salesforce Platform Advent Calendar 2018](https://qiita.com/advent-calendar/2018/salesforce-platform)もいろいろ記事が上がっていますので、そちらもぜひお読みください。

昨日、私はこんな記事「[BlenderでSalesforce アストロくんのペーパークラフトを作る](https://qiita.com/atskimura/items/056b4d904dd140589cf3)」を書きましたが、他は真面目な記事ばかりでためになりますよ。