Skip to content

Instantly share code, notes, and snippets.

@k-hoshina
Last active April 21, 2020 01:27
Show Gist options
  • Save k-hoshina/3193afdbee67fef7faa7c5586c5311e8 to your computer and use it in GitHub Desktop.
Save k-hoshina/3193afdbee67fef7faa7c5586c5311e8 to your computer and use it in GitHub Desktop.
circleci2.0でおもにgoをCIする

CircleCI2.0でGoをCIする

CircleCI2.0について

  • オープンβ(2017/04/12現在)
  • Native Dockerサポート
  • より自由度の高い設定
  • やたら早い(当社比二倍)

https://circleci.com/docs/2.0/

CircleCI2.0にするたったひとつの理由

version: 2
jobs:
  build:
    working_directory: /go/src/github.com/hoge/fuga
    docker:
      - image: circleci/golang:1.8.0
 steps:
      - checkout
      - run: go get ./...
      - run: go test -v ./...

working_directoryが指定できる => 1.0時代にやってた設定の半分くらい消える

イメージを選ぶ

イメージを作る

  • Dockerhubに自分で干す
  • アカウント登録してgithubと連携すればpushをトリガに自動でビルドしてくれる
  • goapp testしてnodeでJSビルドするイメージ無いので作った

circle.ymlを書く

インラインでざっくり解説

version: 2  # cirleci2.0モードで動作させる
jobs:
  build:
    docker: # 複数のイメージが設定できるぞ
      - image: circleci/cci-demo-go-primary:0.0.2 #プライマリコンテナ。各種コマンドは個々で実行される
      - image: postgres:9.4.1 # postgresのコンテナが立ち上がって標準ポートで待ち受ける
        environment: #環境変数が設定できるが1.0と違い${PATH}:/hoge/binと書いても変数は展開されないので注意
          POSTGRES_USER: ubuntu
          POSTGRES_DB: contacts

    working_directory: /go/src/github.com/circleci/cci-demo-go #リポジトリのチェックアウト場所

    environment:
      TEST_RESULTS: /tmp/test-results

    steps:
      - checkout #コードのチェックアウト

      - run: #コマンドの実行
          name: Waiting for Postgres to be ready
          command: |
            for i in `seq 1 10`;
            do
              nc -z localhost 5432 && echo Success && exit 0
              echo -n .
              sleep 1
            done
            echo Failed waiting for Postgres && exit 1
      
      - run: mkdir -p $TEST_RESULTS #コマンドの実行(省略版)

      # This should be in custom primary image, here is just for the sake of explanation
      - run:
          name: Install JUnit
          command: go get github.com/jstemmer/go-junit-report

      - run:
          name: Run unit tests
          environment:
            CONTACTS_DB_URL: "postgres://ubuntu@localhost:5432/contacts?sslmode=disable"
            CONTACTS_DB_MIGRATIONS: /go/src/github.com/circleci/cci-demo-go/db/migrations
          command: |
            trap "go-junit-report <${TEST_RESULTS}/go-test.out > ${TEST_RESULTS}/go-test-report.xml" EXIT
            make test | tee ${TEST_RESULTS}/go-test.out

      - run:
          name: Build service
          command: make

      - run:
          name: Start service
          environment:
            CONTACTS_DB_URL: "postgres://ubuntu@localhost:5432/contacts?sslmode=disable"
            CONTACTS_DB_MIGRATIONS: /go/src/github.com/circleci/cci-demo-go/db/migrations
          command: ./workdir/contacts
          background: true #バックグラウンドプロセスとして結果を待たない

      - run:
          name: Validate service is working
          command: curl --retry 10 --retry-delay 1 --retry-connrefused http://localhost:8080/contacts/test

      - store_test_results: #テスト結果の格納
          path: /tmp/test-results

チェックアウト

ローカルで実行

  • SSHログインができなくなった代わりにローカル実行がデキル
curl -o /usr/local/bin/circleci https://circle-downloads.s3.amazonaws.com/releases/build_agent_wrapper/circleci && chmod +x /usr/local/bin/circleci
circleci update
circleci build

並列

go list ./... | grep -v vendor | circleci tests split --split-by=timings --timings-type=filename | xargs  
  • ファイルリストを circleci tests split に流すと環境によっていい具合に振り分けてくれる
    • コンテナ2台で動かしてる場合、奇数行は1台目、偶数行は2台目で実行…みたいな
    • 実行結果を保存して、次回以降は実行時間の予測に応じて振り分けもできるらしい
    • go test、パッケージ単位でしかテストできないので振り分け具合は大味
      • デカイパッケージは分割できないので遅い
  • railsとかはspecファイル単体で動くので塩梅いいのかも

デプロイ

steps:
      - run: <do-some-stuff>
      - deploy:
          name: Maybe Deploy
          command: |
            if [ "${CIRCLE_BRANCH}" == "master" ]; then
              <your-deploy-commands>
            fi
  • シェルで頑張る
  • 無理して1行で書いてた頃よりは楽かもしれない
  • デプロイはansibleに投げるパティーンもあった

その他

  • 他にもdocker内でdocker走らせてマルチジョブとかできるっぽい
  • build以外のjobを定義できるのでテストのイメージとジョブ、ビルドのイメージとジョブ、デプロイのイメージとジョブ…みたいにわけられるかも
  • docker composeしてimageをデプロイとか
  • ただフロー管理みたいな仕組みはあんまりなさそう
    • Werckerでやれ

まとめ

  • よくわかんないけど速いのでとりあえず2.0にしてもいい
  • 日曜に7時間くらい止まったので所詮ベータだなという感はある
  • 軽いイメージに越したことはないけど1GB超えるイメージでもキャッシュに当たれば1秒で起動する
    • 運が悪いと40秒くらいかかる
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment