LoginSignup
9
7

More than 5 years have passed since last update.

simplecovの結果を、Pull requestのコメントに貼る

Last updated at Posted at 2015-10-07

動機

せっかくカバレッジのレポートがあるのであれば、それを見やすいようにしたい。
ただし、お金はかけたくない。(Coverallsとかは、privateリポジトリだと金がかかる)

やったこと

image

CircleCI上でカバレッジをとり、Artifactsとして保存、それをGitHubのプルリクにコメントとして載せました。

手順

CircleCIの設定

GitHubのPersonal access tokenを取得し、GITHUB_ACCESS_TOKENというNameで、"Environment variables"に設定しておきます。

simplecovの設定

CircleCI上で動く場合に、$CIRCLE_ARTIFACTS/coverage以下に結果を出力するようにします。

公式には、spec_helper.rbなどで指定するような記述がありましたが、
今回は別のエンジニアが.simplecovで指定していたので、そちらを変更しました。

SimpleCov.start 'rails' do
  if ENV['CIRCLE_ARTIFACTS']
    coverage_dir File.join(ENV['CIRCLE_ARTIFACTS'], "coverage")
  else
    coverage_dir 'public/coverage'
  end
end

circle.ymlの設定

コミットに反応し、実際に処理を行います。
simplecovは、test時にカバレッジを出力してくれるので、test.postに該当の処理を行うように設定しました。

test:
  post:
    - scripts/comment_cov.sh

スクリプトの作成

実際にGitHubにコメントするスクリプトを配置します。

comment_cov.sh
#!/usr/bin/env bash

set -eu

echo 'check pull request'

if [ "$CI_PULL_REQUEST" == false ] || [ -z "$CI_PULL_REQUEST" ]; then
  echo 'not pull request.'
  exit 0
fi

echo 'get pull request number'

if [[ $CI_PULL_REQUEST =~ ([0-9]*)$ ]]; then
  PR_NUMBER=${BASH_REMATCH[1]}
else
  echo 'cannot get pull request number. maybe bug.'
  exit 1
fi

echo "pull request number is $PR_NUMBER"

echo 'add comment'

COV_URL="https://circle-artifacts.com/gh/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/$CIRCLE_BUILD_NUM/artifacts/0$CIRCLE_ARTIFACTS/coverage/index.html"
PERCENTAGE=`cat $CIRCLE_ARTIFACTS/coverage/.last_run.json | jq '.result.covered_percent'`
COMMENT_BODY="Coverage report\\n$COV_URL\\n$PERCENTAGE%"
POST_BODY="{\"body\": \"$COMMENT_BODY\"}"
curl -XPOST \
  -H "Authorization: token $GITHUB_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$POST_BODY" \
  https://api.github.com/repos/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/issues/$PR_NUMBER/comments

echoで書いてある通りですが、下記のような処理を行っています。

  1. Pull requestかどうかを判断します。
    今回は、簡略のためにPull requestがある場合のみ行っています。
  2. Pull requestの番号(Issue番号)を取得します。
    CircleCIのenvironment variableにはそのまま番号を取得できるようなものがなかったので、正規表現でURLから取得しようとしています。
  3. 実際にコメントをPOSTします。

感想

実際に動かしてみると、リポジトリ内の全てのプルリクに反応してコメントをつけてくるのは、かなりうざい気がしてきました。
CircleCIの結果のように、ステータスで表示することも考えましたが、それだとリンクは付けられるけど、数値が見えづらくなるので微妙だなと。

結論:金があれば、SaaS使いたい。

9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7