- オープンβ(2017/04/12現在)
- Native Dockerサポート
- より自由度の高い設定
- やたら早い(当社比二倍)
https://circleci.com/docs/2.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時代にやってた設定の半分くらい消える
- circleCI公式イメージ
- https://circleci.com/docs/2.0/circleci-images/
- 標準的な環境とツールが揃ってる
- とりあえずcircleci/golang:1.8.0とかでいいと思う
- Dockerhub
- golang公式イメージ https://hub.docker.com/_/golang/
- golang:1.8.0
- golang:1.8.1-alpine
- goのバイナリ動かすのにglibcが必要だけどalpineにない
- frolvlad/alpine-glibc https://hub.docker.com/r/frolvlad/alpine-glibc/
- apk add goでもインストールできる
- GAE/goのテストがしたい
- zadki3l/gae-go-alpine https://hub.docker.com/r/zadki3l/gae-go-alpine/
- golang公式イメージ https://hub.docker.com/_/golang/
- 野良イメージ怖い…
- だいたいはdockerhubにDockerfile載ってるので見て
- Dockerhubに自分で干す
- アカウント登録してgithubと連携すればpushをトリガに自動でビルドしてくれる
- goapp testしてnodeでJSビルドするイメージ無いので作った
- criff/docker-gae-go https://hub.docker.com/r/criff/docker-gae-go/
- https://circleci.com/docs/2.0/
- 置き場変わったらしい(./circle.ymlでもうごく)
- .circleci/config.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
- checkout書くだけでworking_directoryにクローンしてくれる
- 不思議なエラーが出るときがある
- 自前でチェックアウトのステップをつくる
- 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
- https://circleci.com/docs/2.0/parallelism-faster-jobs/
- コンテナを増やしてテストを並列実行が割と簡単にできる
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ファイル単体で動くので塩梅いいのかも
- https://circleci.com/docs/2.0/parallelism-faster-jobs/
- 1.0にあったようなブランチ名指定する機能はない
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秒くらいかかる