search
LoginSignup
10
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

lifullLIFULL Advent Calendar 2017 Day 10

posted at

updated at

Organization

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

この記事は 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時にもフックしてしまいます

参考文献

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
What you can do with signing up
10
Help us understand the problem. What are the problem?