動機
せっかくカバレッジのレポートがあるのであれば、それを見やすいようにしたい。
ただし、お金はかけたくない。(Coverallsとかは、privateリポジトリだと金がかかる)
やったこと
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にコメントするスクリプトを配置します。
#!/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で書いてある通りですが、下記のような処理を行っています。
- Pull requestかどうかを判断します。
今回は、簡略のためにPull requestがある場合のみ行っています。 - Pull requestの番号(Issue番号)を取得します。
CircleCIのenvironment variableにはそのまま番号を取得できるようなものがなかったので、正規表現でURLから取得しようとしています。 - 実際にコメントをPOSTします。
感想
実際に動かしてみると、リポジトリ内の全てのプルリクに反応してコメントをつけてくるのは、かなりうざい気がしてきました。
CircleCIの結果のように、ステータスで表示することも考えましたが、それだとリンクは付けられるけど、数値が見えづらくなるので微妙だなと。
結論:金があれば、SaaS使いたい。