iOSアプリCI構築メモ_Jenkins+rbenv+bundler+fastlane

# はじめ
本メモは、業務でiOSアプリをテスト実行などができるように、CI構築について書いたものです。
実際に会社のMac miniで構築したが、コロナウイルスにより在宅ワークをすることになったので頓挫しました。
せっかく調べた物なので、メモだけでもアウトプットします。

# 各種ツール
## Jenkinsとは
Jenkinsは、CIツールの一つで設定したジョブを実行することでShellを動かすことができます。
例えば、以下のことができます。

- Gitでpushしたタイミングでジョブを実行することができる
- 指定したGitリポジトリをクローン、特定のブランチをチェックアウトしてshellを実行することができる

## rebenvとは
Rubyのバージョンを切り替えることができるツールです。
ここでは、Bundlerと呼ばれるコマンドを実行させるために、Rubyのバージョンを柔軟に指定します。
## bundlerとは
Bundlerとは、gem専用のパッケージ管理ツールです。
Gemfileに記載されたパッケージをインストールする時に使用しています。

## fastlaneとは
　fastlaneでは、iOSアプリの自動リリース、自動テスト、スクリプトの実行など色々できます。

# セットアップ
## Jenkinsのセットアップ
Jenkinsをインストールします。

```
brew install jenkins
```

Jenkinsを常時起動して欲しので設定します。

```
ln -sfv /usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
```
jenkinsの初期設定は`http://localhost:8080/`なのでブラウザで開いて下さい。
もし、httpアドレスを変更したい際は、`homebrew.mxcl.jenkins.plist`の中身を編集すればいいです。

Admin権限のユーザを生成します。
特別な操作はなくて、以下の文献通りすればできると思います。
[Jenkinsを使ってiOSの自動ビルドおよびテストをする（Jenkins準備編）]("https://hopita.hatenablog.com/entry/2017/05/28/123950")



jenkinsが各種コマンドを実行できるように、環境変数を設定します。
<img width="452" alt="スクリーンショット 2020-03-12 12.18.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181903/fd2bca71-229c-cf48-92c7-9248c45353a3.png">

<img width="762" alt="スクリーンショット 2020-03-12 12.21.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181903/df287422-8710-31d5-64fa-1b3f52bf2b85.png">


次にJenkins上でRubyのバージョンが変更できるようにrebenvのプラグインを入れます。
`Jenkins > Jenkinsの管理 > プラグインの管理`でプラグインの画面が開けます。
以下のプラグインをインストールしてください。

- rbenv plugin

## ジョブの作成
　`新規ジョブ作成`を選択してジョブを作成しましょう。
![スクリーンショット 2020-03-09 18.26.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181903/a0b267e5-2fc1-dd34-2464-aef7730a4251.png)
適当名前を付けて`フリースタイル・プロジェクトのビルド`を選択して下さい。

ジョブの管理画面が表示されると思うので、動作確認を行なってみます。
私の場合は以下のように設定して保存しました。

- ソースコード管理
  Gitを選択  
　リポジトリURL：https://hoge.com/hoge/hoge-test.git  
　ブランチ指定子：*/develop  
　※説明の便宜上、架空のGitリポジトリを指定しています。
- ビルド環境
　rbenv build wrapperにチェック  
　※rebenvのプラグインがインストールされていたら、追加されるはずです。  
　The Ruby version：2.7.0  
　Preinstall gem list：bundler  
- ビルド
　シェルの実行を選択  
　※bundlerの設定とfastlaneの設定を後にやります。今はビルド確認したいだけなので空でも問題ありません。

## ビルド実行
　ジョブの設定が完了したらビルド実行しましょう
ビルドが成功すると青のマーカーが着きます。
ビルド内容を詳しく知る方法としてコンソールがあるので確認することができます。
もし、ビルドに失敗したら設定を見直して下さい。
<img width="348" alt="スクリーンショット 2020-03-12 15.57.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181903/f009e4fd-de73-86a3-6374-c362fdf3b88f.png">


## rbenvのセットアップ
jenkinsとは別に手元の環境でrbenvを動かしたいので準備します。

```
# Jnekinsと同様rbenvをinstalします。
brew install rbenv ruby-build
# rubyのバージョンもJnekinsに合わせます。
rbenv install 2.7.0
rbenv global 2.7.0
```
rubyのバージョンが切り替わっているか確認します。

```
$ rbenv versions
  system
* 2.7.0
$ ruby -v
ruby 2.7.0
```
rbenv上ではバージョンが切り替わったが、rubyではバージョンが変更されない場合があるかもしれません。
Rubyコマンドの参照先を変更する必要があるかもしれないので、以下の記事を参考にして下さい。
[Rubyのバージョンが切り替わらない時の対処法！](https://qiita.com/opiyo_taku/items/3312a75d5916f6cd32b1)

# bundlerのセットアップ
bundlerをインストールします。

```
$ gem install bundler
```
Gitリポジトリにbundlerで実行するGemfileを生成して設定を書きます。

```
# Gemfileの雛形ファイルを生成する
$ rbenv exec bundle init
```

```txt:Gemfile
source "https://rubygems.org"

gem 'fastlane',  '2.143.0'
gem 'fastlane-plugin-xcodegen', '0.1.0'
gem 'cocoapods', '1.9.0'
```

Gemfileから一括でインストールします。

```
$ rbenv exec bundle install --path=vendor/bundle
```

# fastlaneのセットアップ
fastlneを導入しましょう

```
$ rbenv exec bundle exec fastlane init
```

Fastfileが生成されるので、設定を書きましょう。
なお、このファイルはRubyの構文が書けます。

```ruby:fastlane/Fastfile
default_platform(:ios)
platform :ios do
  # fastlaneの処理が開始される前に一度だけ実行する
  before_all do
   # ファイルパスや各種設定のパラメータを定義するときに書きます。
  end
  desc "動作確認用"
  lane :operation_test do
   # cartahge、xcodegen、cocoapods、test実行、ipaファイルの生成など書いていきます
  end
```

Fastffileの`operation_test`を指定して動作確認してみましょう。

```
rbenv exec bundle exec fastlane operation_test
```

動作がうまくことが確認できたら、これらのことをJenkinsで行いたいので、Gitリポジトリに反映させましょう。
Gemfileとfastlaneディレクトリ内のだけでいいです。



# Jenkinsでfastlaneを動作させる
前回作成したジョブを使ってfastlaneを動かしてみましょう。
`ビルド> シェル実行`に以下のようなスプリプトを記述して保存して下さい。

```shell
# fastlaneは内部でrubyを使っているので、文字コードがUTF-8に設定
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
rbenv exec bundle install --path=vendor/bundle
rbenv exec bundle exec fastlane operation_test
```

次にjenkinsでビルド実行を行なって、動作確認を行なって下さい。
多分、ビルド成功になると思います。

# まとめ
多分今年の後半あたりにGitHub Enterprise ServerにGitHub Actionsが追加されると思います。
https://github.blog/jp/2019-08-21-github-actions-now-supports-ci-cd/

そのタイミングに構築できたらなと思っています。