Edited at
LIFULLDay 10

CircleCI2.0を使ってGoで開発したツールをLint,UT,ビルドしてGithubにリリースする

More than 1 year has passed since last update.

この記事は LIFULL Advent Calendar 2017の10日目の記事です。

株式会社 LIFULL 技術開発部の冨田です。


はじめに

社内でも自分自身の開発しているツールでもCircleCI2.0を利用し始めるようになりました。

今回は下記のように動作するように設定しました


  • リモートにブランチをpushした時にLint,UT,カバレッジ計測する

  • リモートに「v[0-9]+(.[0-9]+)*」タグをpushした時にBuildしてGitHubにバイナリをアップロードする


環境


  • Go 1.9


  • CircleCI 2.0 CIサービス


  • codecov.io コードカバレッジ可視化できるサービス


  • golint Linter


  • goverage 複数パッケージを1発でカバレッジ計測できるツール


  • gox 複数OS、アーキテクチャをビルドできるツール


  • ghr GitHub Release pageにビルドしたバイナリをアップロードするツール


CircleCIの環境変数

CircleCIのコンソールからSettingsでリポジトリごとのEnvironment VariablesでTOKENを登録しておきます


CircleCIの設定ファイル

プロジェクト直下に.circleci/config.ymlを作成します

working_directoryは適宜変更してください


.circleci/config.yml

version: 2

jobs:
build:
environment:
- GOPATH: /home/circleci/go
docker:
- image: circleci/golang:1.9
working_directory: /home/circleci/go/src/github.com/tomiyan/pmd2cs
steps:
- run: echo 'export PATH=${GOPATH}/bin/:${PATH}' >> $BASH_ENV
- checkout
- run: go get -v -t -d ./...
- run: go get github.com/golang/lint/golint
- run: go get github.com/haya14busa/goverage
- run: golint ./...
- run: go vet ./...
- run: go test -v -race ./...
- run: goverage -coverprofile=./coverage.text ./...
- run: bash <(curl -s https://codecov.io/bash)
deploy:
environment:
- GOPATH: /home/circleci/go
docker:
- image: circleci/golang:1.9
steps:
- run: echo 'export PATH=${GOPATH}/bin/:${PATH}' >> $BASH_ENV
- checkout
- run: go get -v -t -d ./...
- run: go get github.com/mitchellh/gox
- run: go get github.com/tcnksm/ghr
- run: gox -output "${GOPATH}/pkg/{{.Dir}}_{{.OS}}_{{.Arch}}" ./ ./...
- run: ghr -u $CIRCLE_PROJECT_USERNAME $CIRCLE_TAG $GOPATH/pkg/

workflows:
version: 2
build:
jobs:
- build:
filters:
branches:
only: /.*/
deploy:
jobs:
- deploy:
filters:
branches:
ignore: /.*/
tags:
only: /v[0-9]+(\.[0-9]+)*/


これで完了です

CircleCI2.0で開発が自動化できますね🍻


ハマりどころ

私はPATHとgit tagのフックでハマりました


PATHの通し方

environmentにPATHを設定しても反映されません

run: echo 'export PATH=${GOPATH}/bin/:${PATH}' >> $BASH_ENV

のような形でstepのrunで指定する必要があります


git tagのフック

jobsのdeployに直接filtersを記述しても作用しません

workflowsでfiltersを記述する必要があります

また、branches ignoreをしていしないと、branch push時にもフックしてしまいます


参考文献