Jenkinsと決別

これは <a href="http://qiita.com/advent-calendar/2016/mynet" target="_blank">マイネットエンターテイメント Advent Calendar</a> 20日目の記事です。

今年の1月からマイネットエンターテイメントでネイティブエンジニアをしております！
今回は自宅サーバのJenkinsを他社サービスに乗り換えるお話です。

## 自宅サーバの運用を辞めた

セキュリティの事を考えたり
外出先からVPN+SSHで自PCのターミナルを叩きたい事も減ったので
自宅サーバの運用を辞めることにしました。

しかし頻度は高くないものの、たまに趣味で個人開発をしたりしたい！
という時にCI環境が無いのはやっぱり面倒だと気づいた。

今使用しているメインPCが MacBook 2015 という

* ビルド遅い
* USBポートも少ない

という環境なので、基本的にデバイスをPCに挿していない状態です。


## プライベート環境から他社サービスへ移行

プライベート環境で運用できるものから、他社サービスに移行する。みたいなのは企業でもよくありますよね。
構築自体は楽でも継続運用していく上での保守、セキュリティの維持を考えるとそのコストは馬鹿になりません。

ソースコード管理、プロジェクト進行管理ツール、チャット/メールサーバ等様々です。

Jenkins自体も複数プロジェクト間でリソースを共有する事における危うさや管理の面倒な部分が多々あり
こういう部分を切り分けたいと考える時が来るかもしれません。事前に乗り換えを体験しておきたい。



## CIサービスを選ぶ

* <a href="https://travis-ci.org/" target="_blank">TravisCI</a>
* <a href="https://circleci.com/" target="_blank">CircleCI</a>

有名所だと上記2点をよく聞きますが、
今回選定したのは <a href="https://www.bitrise.io" target"_blank">Bitrise</a> です。

* 大体どこでもやりたい事ができそうだった
* 実際に触ってみて良かった
* 趣味で使うには無料枠でなんとかなりそうだった


## 最終的にやりたい事

(とりあえず面倒そうなiOS)

* Pushした際にWebHookでビルド開始
* iOSアプリのビルド
* iOSアプリの成果物をDeployGateにアップロード

## Xcodeで適当にプロジェクトを作成する

* ExampleApp

Gitリポジトリ化しておく


## Bitbucketにリモートリポジトリ作成

![create_repo.png](https://qiita-image-store.s3.amazonaws.com/0/150573/384981b3-c54d-9b56-7e39-b546ddc74408.png)

## ローカルリポジトリのPush

```
git remote add origin ssh://git@bitbucket.org/masanorythm/exampleapp.git
git push -u origin master
```

## Bitriseの設定

※ 会員登録は端折ります

Dashboardから `Add new app` します。

![create_proj_01.png](https://qiita-image-store.s3.amazonaws.com/0/150573/fc141e9f-0695-4642-3b56-56405dbb8762.png)

Bitbucketに作成した ExampleApp リポジトリを選択

## SSH鍵の作成

![create_proj_02.png](https://qiita-image-store.s3.amazonaws.com/0/150573/d77ebb32-b26c-fe5c-b7c1-8916f796a46c.png)

作成された公開鍵を Bitbucket に登録します。
GitHubも恐らく同じ手順でしょう。

## プロジェクトのスキャン

![create_proj_03.png](https://qiita-image-store.s3.amazonaws.com/0/150573/85c8dd05-2304-1fa0-a762-5c41c9a567eb.png)

自動的にどのタイプのプロジェクトか、異常は無いか等確認してくれます。
とりあえず masterブランチしかないのでそのままで。

![create_proj_04.png](https://qiita-image-store.s3.amazonaws.com/0/150573/8619252b-dbd7-ff5f-7908-e3ab0fcd42bd.png)

デフォルト状態だとワーニングが出ました。とりあえず無視してあとで直します。

![create_proj_05.png](https://qiita-image-store.s3.amazonaws.com/0/150573/a8a4df84-db4e-d713-bceb-bce7412df9b9.png)
Xcodeの Manage Schemes でこんな感じで多分おｋ

## ビルド設定

![create_proj_06.png](https://qiita-image-store.s3.amazonaws.com/0/150573/aa3bee6a-d0bf-554a-20c5-c2a19393730d.png)

プロジェクトファイル、スキーム、stackを設定します。選択肢が無い場合は自動で設定してくれます。
古いXcodeが必要な場合はstackを変更。用意されているXcodeは6.4が下限のようです。

## WebHook

![create_proj_07.png](https://qiita-image-store.s3.amazonaws.com/0/150573/10668ba9-a2bf-b3af-3100-e39e3b2e12b7.png)
とりあえず Register しときましょ
全てのPushに対してデフォルトのワークフローを実行してくれるようになります。


以上で初期設定が完了し、自動的にビルドが開始されます。

## ワークフローの修正

![workflow_modify.png](https://qiita-image-store.s3.amazonaws.com/0/150573/06b05285-5f17-409a-bb04-7e5f3e89748f.png)

ワークフローを初期状態から書き換えました。
Xcode Archive for iOS を入れて、無駄なものを削除しただけです。中身はいじっていません。

* SSH鍵の初期化
* リポジトリクローン
* 証明書の設定
* ipaファイルの作成

まだ、証明書を設定していないのでipaは作成できない状態です。
今回は Xcode8系で 空プロジェクトを作ったので初期状態で Automatic signing が有効化されています。
Automaticになってから、逆に複雑になっている気がしますが慣れていきたいのでそのままで。

## codesigndoc

https://github.com/bitrise-tools/codesigndoc
codesigndoc を使って、
そのプロジェクトがどの証明書とプロビジョニングプロファイルが必要かをワンライナーで教えてくれます。

```
cd project_path/
bash -l -c "$(curl -sfL https://raw.githubusercontent.com/bitrise-tools/codesigndoc/master/_scripts/install_wrap-xcode.sh)"
```

* .xcodeproj or .xcworkspace のファイル名を入力
* スキーム一覧が出るので数字を入力

Required Identities/Certificates
Required Provisioning Profiles

で表示された、証明書とProvisioning ProfileをBitriseにセットしてあげましょう。

![cert.png](https://qiita-image-store.s3.amazonaws.com/0/150573/b5e4787c-3285-05a5-4c64-87894e6b2b9e.png)

一度ビルドを実行し、成功が確認できれば証明書問題は完了。

## DeployGateにアップロード

![env.png](https://qiita-image-store.s3.amazonaws.com/0/150573/d268e62a-0f10-9d9d-f6bc-85b797ef0b6c.png)
Xcode Archive for iOS 完了時の変数です。
クラッシュレポートサービス使う時は、dSYMアップロードも組込むと良いですね。
今回は **BITRISE_IPA_PATH** を使います

DeployGate用のステップは無いようなのでスクリプトで代用します。

![image](https://qiita-image-store.s3.amazonaws.com/0/150573/8416d2d1-a8c6-6d13-4355-8d09e8cbe39f.png)


## ビルドステータスを表示

![image](https://qiita-image-store.s3.amazonaws.com/0/150573/a6392611-34a9-3610-02d7-6bb4590b9471.png)

Dashboardでステータス画像をクリックすると、表示方法を教えてくれます。
README.mdに追加してコミットしておきます。

ついでに、ソースコードと関係ないコミットで
WebHookでビルドを実行したくない場合にはコミットメッセージに

* [ci skip]
* [skip ci]

を追加して下さい。
今回はそのケースに該当するので、テストしてみます。

```
git add README.md
git commit -m "Add README.md [ci skip]"
git push
```
![image](https://qiita-image-store.s3.amazonaws.com/0/150573/9f24c627-844b-4edf-9f9e-441ddac360a3.png)
READMEにビルドステータスの追加も確認できました。


## WebHookをカスタマイズ

![image](https://qiita-image-store.s3.amazonaws.com/0/150573/be6bbc52-dc2d-c6e4-cc07-aa98817acb59.png)

プッシュ/プルリク/タグ をトリガーとして指定のワークフローを実行させる事が可能です。
ブランチ指定にはアスタリスクを用いたワイルドカード指定が可能です。

後は適当に開発して、バシバシプッシュするだけで
いつでも最新のアプリがDeployGateに配信されます。

## 個人開発おすすめ

好きな事に打ち込むと、覚えが良いです。
会社で好きな事ができなかった時のストレス解消にもなります。

日頃の業務を効率化し、早く帰ることが出来たならば試してみてはいかがでしょうか！
以上になります！

<br/>

次回は<a href="http://qiita.com/nohama" target="_blank">nohama</a>さんです。よろしくお願いします！