My External Storage

Dec 10, 2017 - 3 minute read - Comments - Go CI

[Go]CircleCI2.0+Codecovで作るGo学習環境

Goならわかるシステムプログラミングの写経、練習問題を解くにあたり、Goの軽いCI環境を作った。

TL;DR

自己学習や写経だと、レビューしてもらう(第三者の評価を得る)機会がない。それでも、自分の書いたコードに最低限の品質担保をする。 基本的にPublicリポジトリならば全て無料。

  • GitHubにプッシュするたびにCircleCIで自動ビルドを行う。
  • ビルド時にリポジトリに同梱されているテストを自動で実行する。
  • テストのカバレッジを計測し、Codecovで結果を可視化する。
  • 静的解析の結果をGo ReportCardで可視化する。
  • バッジで各サービスの結果がわかる。

以下の設定は次のリポジトリに対して行った。

https://github.com/budougumi0617/gsp

設定中に出てくるbudougumi0617/gspという部分は各自のリポジトリに合わせて修正していただきたい。

GitHubにプッシュするたびにCircleCIで自動ビルドを行う

今回はCircleCI2.0を使ってみる。まずCircleCIでリポジトリに対するビルドを有効にする。 CircleCIにログイン後、左のメニューから「Projects」を選び「Add Project」ボタンをクリックする。

circleci_add_project

Go用の設定を選んで「Start Building」ボタンをクリックすると、とりあえずビルドが実行される。 これでプッシュのたびに自動ビルドが始まる。

circleci_start_building

ビルド時にリポジトリに同梱されているテストプロジェクトが自動で実行される。

次に自分のリポジトリに.circleci/config.ymlを作る。内容はCircleCIGo用のサンプル設定ファイルとほぼ同じ。

ちゃんとしたCircleCi2.0のGoの設定をしたい場合は以下のQiita記事が参考になりそう。
CircleCI2.0を使ってGoで開発したツールをLint,UT,ビルドしてGithubにリリースする

# Golang CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-go/ for more details
version: 2
jobs:
  build:
    docker:
      - image: circleci/golang:1.9

    working_directory: /go/src/github.com/budougumi0617/gsp
    steps:
      - checkout

      # specify any bash command here prefixed with `run: `
      - run: go get github.com/pierrre/gotestcover
      - run: gotestcover -coverprofile=coverage.txt ./...
      - run: bash <(curl -s https://codecov.io/bash)

working_directoryは自分のリポジトリ名にする。 gotestcoverは複数パッケージのテストカバレッジをいい感じにまとめてくれる。写経などをしていると、リポジトリの中に複数パッケージが出来るので。 gotestcoverでまとめたテストカバレッジの結果はCodecovのスクリプトを実行すれば自動的にCodecovに送信される。

テストのカバレッジを計測し、Codecovで結果を可視化する。

上記設定をしたあと、以下のようなURLを確認すればカバレッジの結果が表示されるはずだ。

https://codecov.io/gh/budougumi0617/gsp

静的解析の結果をGo ReportCardで可視化する。

Go ReportCardはもろもろのgo toolの静的解析の結果や、複雑度、スペルミスまで解析してくれる。

https://goreportcard.com/

TOPページから自分のリポジトリのパスを入力して「Generate Report」しよう。

リポジトリを作ってから時間が経っているならば、既にページが存在しているかもしれない。

https://goreportcard.com/report/github.com/budougumi0617/gsp

バッジで各サービスの結果がわかる。

あとはREADMEにもろもろのサービスのバッジのリンクをつけておけば完成だ。

CircleCIは以下のようなURLからリンクを発行できる。

https://circleci.com/gh/{USER_NAME}/{REPO_NAME}/edit#badges

Codecovは以下のようなリンクから。

https://codecov.io/gh/{USER_NAME}/{REPO_NAME}/settings/badge

Go ReportCardはページのバッジをクリックするとリンクが表示される。

Get Badge

余談

以前はCodeClimateも使っていたのだが、今はバッジでGoのリポジトリの静的解析結果は表示してくれないようだ。 https://codeclimate.com/
Supported Languages for Maintainability
Pluginにもろもろを書けば、Issueという形でgo lintなどの結果は管理してくれる。

Available Analysis Plugins