GitLab Auto DevOps を試してみた (その二)

# GitLab Auto DevOps を試してみた (その二)
これは [GitLab Advent Calendar 2017](https://qiita.com/advent-calendar/2017/gitlab) の 15 日目の記事です。

[その一](https://qiita.com/masakura/items/2a23b3c02529b77ba5d3)では、GitLab Auto DevOps の [Auto DevOps: quick start guide](https://docs.gitlab.com/ee/topics/autodevops/quick_start_guide.html) をなぞってみました。

今日はそれを一つ一つ見ていこうと思います。


## Auto Build
[Auto Build](https://docs.gitlab.com/ee/topics/autodevops/#auto-build) は `Dockerfile` を検出して自動で Docker Image のビルドから GitLab Container Registry へのアップデートまで自動でやってくれるそうです。


```
$ # Auto DevOps variables and functions # collapsed multi-line command
$ setup_docker
$ build
Building Dockerfile-based application...
Sending build context to Docker daemon  144.4kB

Step 1/6 : FROM ruby:2.4.1-alpine
2.4.1-alpine: Pulling from library/ruby
90f4dba627d6: Pulling fs layer

...

Pushing to GitLab Container Registry...
The push refers to repository [registry.gitlab.com/masakura/minimal-ruby-app/master]
7b433b3bc1d5: Preparing
e7d3ac95d998: Preparing

...

Job succeeded
```


## Auto Test
[Auto Test](https://docs.gitlab.com/ee/topics/autodevops/#auto-test) は [herokuish](https://github.com/gliderlabs/herokuish) とやらを利用して実行されています。

あまり Ruby や Heroku に詳しくないのですが、`rake test` を実行しているのだけは分かりました!

```
$ setup_test_db
$ cp -R . /tmp/app
$ /bin/herokuish buildpack test
-----> Ruby app detected
-----> Setting up Test for Ruby
-----> Using Ruby version: ruby-2.4.1
-----> Installing dependencies using bundler 1.15.2
       Running: bundle install --without development --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment

...

-----> Running test: bin/rake test
       /app/vendor/ruby-2.4.1/bin/ruby -w -I"lib:." -I"/app/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib" "/app/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib/rake/rake_test_loader.rb" "test/app_spec.rb"
       Run options: --seed 44318
       # Running:
       .
       Finished in 0.001106s, 904.4740 runs/s, 904.4740 assertions/s.
       1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
Job succeeded
```


### Auto Code Quality
[Auto Code Quality](https://docs.gitlab.com/ee/topics/autodevops/#auto-code-quality) は [Code Climate](https://codeclimate.com/) を利用したコード検査です。

```
$ # Auto DevOps variables and functions # collapsed multi-line command
$ setup_docker
$ codeclimate
Unable to find image 'codeclimate/codeclimate:0.69.0' locally
0.69.0: Pulling from codeclimate/codeclimate

...

Generating .codeclimate.yml...
Config file .codeclimate.yml successfully generated.
Edit and then try running 'validate-config' to check configuration.
Generating default configuration for engines...
Config file .rubocop.yml successfully generated.
WARNING: A new version (v0.70.5) is available. Upgrade instructions are available at: https://github.com/codeclimate/codeclimate#packages
Uploading artifacts...
codeclimate.json: found 1 matching files           
Uploading artifacts to coordinator... ok            id=44392657 responseStatus=201 Created token=o9ZJXsdP
Job succeeded
```

コード検査の結果はジョブの成果物に登録されます。TODO が残ってるよ! と教えてくれました。

```json
[
  {
    "categories": [
      "Bug Risk"
    ],
    "check_name": "TODO",
    "description": "TODO found",
    "location": {
      "lines": {
        "begin": 8,
        "end": 8
      },
      "path": "server.rb"
    },
    "type": "issue",
    "fingerprint": "d307efde33ac46498148e96379df0fc5",
    "severity": "minor",
    "engine_name": "fixme"
  }
]
```

Code Quality は Merge Request と組み合わせると面白いんですが、それはまた後程!


## Auto Review Apps
[Auto Review Apps](https://docs.gitlab.com/ee/topics/autodevops/#auto-review-apps) はすごいです!

[Review Apps](https://about.gitlab.com/features/review-apps/) は Merge Request (Pull Request の GitLab 版) のアプリをプレビューする機能です。Merge Request 毎に、Kubernetes クラスターにビルドされたアプリが設置され、専用の URL でアクセスできるようになります。

ちょっとやってみます。

`server.rb` を `こんにちわ` に書き換えて、ブランチ名を `hello` にし、`Start a new merge request...` にチェックを入れて `Commit changes` で Merge Request を作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103982/0b11aa79-5897-500a-3488-c2c78e5425ec.png)

こんな感じで Merge Request のパイプラインが始まります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103982/3333a67e-8143-69e6-3207-e024b1cf4098.png)

パイプラインが終わると Merge Request に URL が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103982/266e5e31-f7e6-8a01-3e4d-c4dc5a8243c4.png)

クリックすると、`こんにちわ!` となります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103982/aeac7df3-244b-dca9-a321-801f417244f4.png)

キマシター!

こんな感じで、Review Apps では、ソースコードだけでなくアプリの方もレビューができるわけです。

Code Quality もやってみましょう。検査エラーを出すために、`server.rb` に `TODO` を埋め込みます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103982/fae0d04c-b62e-12fc-624f-e3581d2c1409.png)

パイプラインが終了すると、こんな感じでコード検査の問題になる個所が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103982/6ea5028e-8406-010b-c072-065796eff8f6.png)

リンクをクリックすると、該当行へジャンプします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103982/2cb4744a-d817-7656-618b-e7ce29a68d4a.png)

なお、Merge Reuqest の Code Quality は Merge Request で変更されたもしくは新しく追加された部分のみが対象となります。もとからある `#TODO HTML...` には反応しません。


## Auto Deploy
[Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/#auto-deploy) は `master` にマージされたものをそのまま `production` として公開します。

先ほど `こんにちわ` と修正した Merge Request をマージすると、デプロイも含めたパイプラインが開始されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103982/0dcb57ad-7064-b3ae-d42e-ea0efb517d8f.png)

GitLab Project の `CI/CD` -> `Environment` -> `production` と選択します。新しいアプリがデプロイされたことが分かります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103982/692f247d-c7fc-b1fe-3585-ef21f9677c82.png)

`View deployment` をクリックすると、反映されていることが分かります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103982/3b88f60e-b374-0b30-b772-91345d5e6c8a.png)

余談ですが、`Rollback` ボタンをクリックすると、以前の `Hello, world!` のアプリにすぐに戻せます。便利ですねぇ。


## Auto Monitoring
[Auto Monitoring](https://docs.gitlab.com/ee/topics/autodevops/#auto-monitoring) はデプロイされたアプリをモニタリングできます。

新しいアプリをデプロイした直後、バグで負荷が急上昇するなど、トラブルがつきものです。GitLab でデプロイし、そのまま GitLab で不具合の兆候を調べられるので便利ですね。

この時点では私はまだうまくモニタリングできていません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103982/bed8986e-763f-2b73-af3b-8cbdea4d7543.png)

Prometheus をセットアップすればいいだけだとは思いますが、そこまでは Auto DevOps: quick start guide の方法ではやってくれないようです。

そのあたりはまた次回!


## まとめ
Auto DevOps そのものはまだベータで、本番プロジェクトでは使わない方がいいそうです。実際に、DevOps のフローはプロダクトや組織でかなり変わるので、個人的には Auto DevOps が役に立つかどうかまでは分かりません。

Auto DevOps で提供される機能は、すべてマニュアルで設定すれば使うことができます。マニュアルで設定していった方がいいとは思いますが、Auto DevOps を一度は試して、そこをベースに自分らに合わせて調整していく方法がよさそうです。Auto DevOps は GitLab が考える DevOps の具象化したものとして考えています。