この記事は 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を登録しておきます
- CODECOV_TOKEN
- https://codecov.io/ でリポジトリを選択するとTOKENが発行されるのでそれを利用します
- GITHUB_TOKEN
- https://github.com/settings/tokens/new で public_repo を選択して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時にもフックしてしまいます