Gitlab CI でカバレッジレポートを公開するメモ

Jenkins で PHPUnit 実行時に出力したカバレッジレポートを Jenkins 上で閲覧できるようにしているのですが、同じことを Gitlab CI でやるときのメモ。

Jenkins の場合

Jenkins なら HTML Publisher plugin でサクッと PHPUnit のカバレッジレポートを公開できます。

ビルドで↓のようにカバレッジレポートを HTML で出力して、

vendor/bin/phpunit --coverage-html=coverage/
# or
phpdbg -qrr vendor/phpunit/phpunit/phpunit --coverage-html=coverage/

ビルド後のアクションで↓みたいに公開するディレクトリを指定すれば OK です。

// jenkins dsl

job('test') {
    :
    publishers {
        publishHtml {
            report('coverage') {
                reportName('Coverage')
                reportFiles('index.html')
            }
        }
    }
}

Gitlab CI の場合

Gitlab CI で同じことをやるときは PHPUnit で出力したカバレッジレポートを Gitlab Pages で公開すると良いらしいです、下記によると。

下記のようなビルド設定でカバレッジレポートを Gitlab Pages で公開できます。

# .gitlab-ci.yml

before_script:
  - curl -fsSL https://getcomposer.org/download/1.4.2/composer.phar > composer.phar

phpunit:
  stage: test
  image: php:alpine
  script:
    - php composer.phar install --prefer-dist --no-progress --ansi --dev
    - phpdbg -qrr vendor/phpunit/phpunit/phpunit --coverage-html coverage/
  tags:
    - docker
  cache:
    paths:
      - vendor/
  # coverage/ ディレクトリを artifact として保存する
  artifacts:
    paths:
      - coverage/
    expire_in: 1 days

# Gitlab Pages のためのジョブ(pages という名前でなければならない)
pages:
  stage: deploy
  # phpunit ジョブの artifact を展開する
  dependencies:
    - phpunit
  # Pages で公開するファイルは public/ になければならない
  script:
    - mv coverage/ public/
  # artifact を移動させるだけならこうしとけば git clone/fetch や checkout されない
  variables:
    GIT_STRATEGY: none
  # Pages で公開するには artifact にしなければならない
  artifacts:
    paths:
      - public/
    expire_in: 1 days

Gitlab Pages のメモ

Gitlab Pages は要するに、pages というジョブのビルドの結果、 public というディレクトリが artifact として保存されれば、それが Gitlab Pages として公開される、です。GitHub Pages とはだいぶ感じが違います。

Gitlab Pages は最後にビルドされた結果しか公開されないので、ビルドごとのカバレッジレポートを閲覧したりはできなさそう。なのですべてのブランチでカバレッジレポートを保存するのではなく(Jenkins ではそうしてた)、master のときだけにしとくのが良さそう。トピックブランチのビルドで Gitlab Pages のカバレッジレポートが上書きされるのもどうかと思うので。

ただ、カバレッジレポートを artifact として保存しておけばダウンロードしてローカルで閲覧することはできるので、phpunit ジョブの artifact はそのままで、pages ジョブだけ特定ブランチに制限するのがよさそう。

ビルド履歴や成果物のメモ

artifact は有効期限を expire_in で指定しなければ無期限となるっぽい。expire_in を指定すると有効期限が切れると自動で削除されるが、ジョブの画面から Keep ボタンを押して有効期限をクリアする(無期限にする)こともできるっぽい。

成果物やビルドログはジョブの画面で Erase ボタンを押せば手動で消せる。artifact は上記の通り有効期限を付けて自動で消すこともできるけど、ビルドログは Erase ボタンで消さない限り消えなさそう。

Erase ボタンでもビルドログや成果物が消えるだけで、ビルドやパイプラインの履歴そのものは消せなさそう。一時的にパイプラインを無効→有効としても消えたりはしない。プロジェクトを削除すれば・・どうなるかは試していない。

Jenkins だとビルド履歴を世代数や日数で削除できるので、それができないことに違和感が無くもないけど、そもそもバージョン管理システムとはすべての履歴を残すためのものなんだから、ビルドの履歴が残るのもそういうものだと言われればそういうものな気もする。

強いて言えば試行錯誤した履歴まで残るのがちょっとかっこ悪い感じする。

アーティファクトのメモ

artifact、(この界隈では)日本語で成果物と訳されると思うけど、アーティファクトとカタカナで書くと、なんか、すごそう、すごい力を秘めてそうで違和感。