標準でないRailsのディレクトリ構成でCodecovを使ってハマった


# 本記事のサマリ
標準のディレクトリ構成ではないプロジェクトで、Codecovを利用する場合は、何も設定しないとCodecov側に実装したコード群がtrackされない。
その対処として、codecov.ymlにfixesを設定してマッピングすることでCodecovにtrackされるようになるが、codecov.ymlをプロジェクトのroot直下に配置しないとうまく動かなかった。
.codecov.ymlという名前でも動かなかったので要注意。


### 対象読者
* 事情があって標準でない構成のrailsアプリ(主に1階層深いところにappディレクトリがあるようなケース)を使っている方
* かつCodecovを使ってカバレッジを取得したい方
* codecov.ymlにfixesの設定をしているが、なぜかうまく動かなくてハマっている方

### 動作確認バージョン
```
rails --version
-> Rails 5.0.6
ruby --version
-> ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]
grep codecov Gemfile.lock
-> codecov (0.1.10)
grep simplecov Gemfile.lock  
-> simplecov (0.15.1)
     simplecov-html (~> 0.10.0)
   simplecov-html (0.10.2)
```

### 経緯
railsのプロジェクトでCodecovを利用しようと決めて導入してみたのですが、諸事情によりリポジトリのディレクトリ構成としては、railsのアプリケーションが1階層深いところにあり、codecov連携してみたら、うまくファイルが認識されずカバレッジは取得できるものの、404になってしまった。
codecov側で詳細を見ようとした場合に以下のような画面になる。
![Kobito.vGLVns.png](https://qiita-image-store.s3.amazonaws.com/0/47854/0c5d5677-86ed-1622-ed85-884e21d753e7.png "Kobito.vGLVns.png")

[https://docs.codecov.io/docs/fixing-paths](https://docs.codecov.io/docs/fixing-paths)
を参考にパスが違うことをcodecov側に教えようとしたが、うまく動かなくて思考錯誤したので、同じように困っている人がいたら助力になれるようにと思い投稿。

# Codecovとは
* コードのカバレッジ情報を収集して、カバレッジの変遷を可視化してくれるサービス。
* 2017/09/18時点、privateリポジトリ1個までは無料
* いろいろな言語に対応している
* railsではgemとcodecovというgemをインストールするだけで簡単に連携ができる。(裏ではsimplecovというgemを利用)

## RailsアプリにCodecovを導入
* 前提条件： railsアプリをgithubに登録済みであること

### 検証準備
#### 適当な標準構成ではないRailsアプリを作成
とりあえず適当なRailsアプリを作成して、dummy_dirというフォルダがルートになるようにしました。
今回の検証につかったリポジトリとブランチは、以下にあります。
https://github.com/yukimura1227/codecov_sample/tree/experiment/not_suitable_path_case


#### TravisCIの利用準備
ローカルからCodecovに情報を連携することもできるのですが、アップロード用のTokenの設定が必要になってしまうので、その設定が不要なTravisCI(CircleCIとAppVeyorも不要らしいです)でテストすることにします。
とりあえず、[https://travis-ci.org/profile/アカウント名](https://travis-ci.org/profile/アカウント名)にアクセスして、リポジトリをtravis.ciの対象にしてテストが動くようにしています。
![Kobito.VCwiDm.png](https://qiita-image-store.s3.amazonaws.com/0/47854/f501a6c9-ef30-d99a-0982-dacecbd661b6.png "Kobito.VCwiDm.png")

TravisCI側も、標準構成と異なるのでちょこっと設定が必要になるので、以下のように設定しました。(今回の記事の本質ではないので説明は省きます)

```/.travis.yml
language: ruby
install:
  - cd dummy_dir/
  - bundle install --path vendor/bundle
```

#### Codecovの利用準備
[https://codecov.io](https://codecov.io)
にアクセスして、githubでログインする。

リポジトリを登録する。
こんな画面でAddRepositioryボタンを押す
![Kobito.NwfiV6.png](https://qiita-image-store.s3.amazonaws.com/0/47854/6cdd873a-4d25-ffbe-7055-bf2352903e7e.png "Kobito.NwfiV6.png")

こんな画面に遷移するので、対象のリポジトリを探して追加する。
![Kobito.z3l1YG.png](https://qiita-image-store.s3.amazonaws.com/0/47854/44cb2143-b586-6f3e-f435-7cf295b9264e.png "Kobito.z3l1YG.png")

これでCodecov側の準備もOK.

#### テスト時にテスト結果を連携するように修正する。
gemの導入

```Gemfile
# ~中略~
gem 'codecov', require: false, group: :test
```
今回の検証には、テストのフレームワークとしてrspecを利用したので、spec_helper.rbにカバレッジの収集させるようにコードを追加



```spec/spec_helper.rb
# ~中略~
require 'simplecov'
SimpleCov.start

require 'codecov'
SimpleCov.formatter = SimpleCov::Formatter::Codecov
```
 
とりあえず、これで動くようになります。

#### 問題
ただこのままですと、modelなどのtrackingしてほしいファイルがtrackされないため、なんとなくカバレッジはでるものの、前のビルドとの差分を表示はしてくれません。

![Kobito.YFs4ly.png](https://qiita-image-store.s3.amazonaws.com/0/47854/5dae13a0-adc9-d2e1-9859-f72d5865bf9d.png "Kobito.YFs4ly.png")


#### うまくうごいた設定
[https://docs.codecov.io/docs/fixing-paths](https://docs.codecov.io/docs/fixing-paths)
にあるように、fixesでディレクトリの構成が違う場合にmappingをさせることでうまく動きます。
最終的にあれこれ検証して、たどりついたのは、わざわざ記事にするまでもない設定ファイルでした。。。

```/codecov.yml
coverage:
  fixes:
    - "::dummy_dir/"
```

#### ハマったポイント
前述の設定ファイルに行き着くまでに、いろいろあったのですが、とりあえずハマりポイントだけ列挙しておきます。
たぶん、[https://docs.codecov.io/docs/fixing-paths](https://docs.codecov.io/docs/fixing-paths)の説明にある
`For Codecov to operate properly, all files must match the git/hg file structure.` のgit/hg file structureというのを僕が理解していないのが悪かったような気はしているのですが、未だにgit/hg file structureがわからないので、ご存知の方がいたらどこを見たら理解できるか教えてほしいです。

以下、ハマったポイントです。

* codecov.ymlのファイルは、rootに置かないと動かなかった。  
[https://docs.codecov.io/docs/codecov-yaml#section-repository-yaml](https://docs.codecov.io/docs/codecov-yaml#section-repository-yaml)には、任意のディレクトリでもよいと記述がありますが、fixesは動かなかったです。
* .codecov.ymlというファイル名では動かなかった  
上記に、.codecov.ymlというファイル名でもよいように記述があるのですが、.codecov.ymlという名前にした場合、rootにおいてもfixesは動かなかったです。(codecov.ymlで動作確認済みのものを.codecov.ymlにするとtrackファイルではなくなってしまった。)
* とりあえず、yamlの構成はしっかり確認しましょう。[https://github.com/codecov/support/wiki/Codecov-Yaml#full-yaml](https://github.com/codecov/support/wiki/Codecov-Yaml#full-yaml)
  * `curl --data-binary @codecov.yml https://codecov.io/validate` でyamlを検証してくれます。

#### 成功した場合のCodecov側のイメージ
以下のようなかんじでdummy_dirから表示されます。
![Kobito.qyFIpc.png](https://qiita-image-store.s3.amazonaws.com/0/47854/bab8167f-140e-4940-4242-bc118eee1c02.png "Kobito.qyFIpc.png")

前述した404のエラーページの場合は、appから表示されてしまっていました。