# Salesforce Force.com Apex のテストを CircleCI 2.0 で行う

*2017-04-19*

> Salesforce Apex のテストを CircleCI 2.0 で行うための Docker Image とサンプルプロジェクトを公開しました。

[CircleCI] の新バージョン 2.0 は現在、パブリックベータとして提供されており、現行版の 1.0 とは違い、ビルドを実行する Docker Image を指定できるようになっています。

ref: [CircleCI 2.0](https://circleci.com/beta-access/)

これを利用して、Salesforce [Force.com Apex] のテストとデプロイを行うための Docker Image とサンプルプロジェクトを公開しました。

- [サンプルプロジェクト](https://github.com/ngs/apex-circleci-example)
- [atsnngs/force-com on Docker Hub](https://hub.docker.com/r/atsnngs/force-com/)
- [ngs/apex-circleci-example on CircleCI](https://circleci.com/gh/ngs/apex-circleci-example)

以下にセットアップ手順を記載します。

<!--more-->

## 設定手順

### 1. ディレクトリ構成

ディレクトリ構成は [Force IDE] が使用しているファイル・ディレクトリ名に互換しています。

```sh
.
├── src
│   ├── classes
│   │   └── MyClass.cls
│   └── triggers
│       └── MyTrigger.trigger
│
└── wsdl # 後述
    ├── apex.wsdl
    └── enterprise.wsdl
```


### 2. WSDL のダウンロード

WSDL ファイルと、それを元に生成される Java ライブラリは、インスタンスの状態によって内容が違うため、Docker Image には含んでいません。

以下の手順で WSDL ファイルをプロジェクトに追加します。

1. _設定_ のクイック検索から _API_ 画面を検索
2. _Enterprise WSDL の生成_ と _Apex WSDL_ を右クリックメニューなどからコンピュータにダウンロード
3. プロジェクトディレクトリ内 `wsdl` フォルダに `.wsdl` という拡張子で保存し、バージョン管理に追加

### 3. .circleci/config.yml

CircleCI の設定は今までの `circle.yml` ではなく、 `.circleci` というディレクトリに `config.yml` というファイル名で記述します。記述内容には互換性はありません。

ref: [Configuring Jobs](https://circleci.com/docs/2.0/executor-types/)

`master` ブランチのビルドでは、後述の環境変数で設定したインスタンスに Apex コードを反映します。

```
version: 2
jobs:
  build:
    working_directory: /repo
    docker:
      - image: atsnngs/force-com:latest
    steps:
      - checkout
      - run:
          command: rm -rf /src /wsdl &&  mv /repo/src /src && mv /repo/wsdl /wsdl
      - run:
          command: export DEPLOY=$([[ $CIRCLE_BRANCH == 'master' ]] && echo 1 || true); /entrypoint/run.sh
```

### 4. 環境変数の設定

CircleCI のプロジェクト設定内 Environment Variables 画面にて、必要な環境変数を設定します。
#### `SF_SERVER`

API エンドポイント。利用しているインスタンスのドメインを元にします。

例: `https://ap5.salesforce.com` の場合 `https://ap5-api.salesforce.com`

#### `SF_USERNAME`

Salesforce のログイン ID。

#### `SF_PASSWORD`

Salesforce のログインパスワード。

もし2段階認証を有効にしている場合は、パスワードに続けてセキュリティートークンを入力します。

セキュリティートークンの取得方法がわからない場合は以下のヘルプドキュメントを参照してください。

- [セキュリティトークンのリセット](http://sforce.co/2eDfIwC)

## その他 活用方法

今回の目的は継続的ビルドと配信でしたが、ローカルの Docker を使ったコマンドラインビルドにも活用できます。

```sh
docker pull atsnngs/force-com

cat > envfile.txt <<ENVFILE
SF_USERNAME=you@example.com
SF_PASSWORD=PASSWORD+SECURITY_TOKEN
SF_SERVER=https://xxx-api.salesforce.com
ENVFILE

docker run \
  -v $(pwd)/wsdl:/wsdl \
  -v $(pwd)/src/classes:/src/classes \
  -v $(pwd)/src/triggers:/src/triggers \
  --rm \
  --env-file envfile.txt \
  atsnngs/force-com
```

Salesforce プラットフォームを利用したアイデアや困りごとがありましたら、ぜひディスカッションしましょう。

[Force IDE]: https://developer.salesforce.com/page/JP:Force.com_IDE
[CircleCI]: https://circleci.com/
[Force.com Apex]: https://developer.salesforce.com/page/JP:An_Introduction_to_Apex


