Circleci 2.0をReact、Goアプリに導入する

前回Dockerizeしたアプリに、Circleciを入れることで、continuous integration(継続的インテグレーション)する開発環境を作ります。

Circleciの公式サイト

また、今回はデプロイを考慮せずに、各アプリのテストが、githubのproject repoにpushされる度に通るようにします。

今回の目的の継続的インテグレーションについては、下のAWSにある説明が分かりやすかったです。


まずは、Reactで作ったアプリの .circleci/config.yml (circleciの設定ファイル)を作っていきます。イメージとして、公式サイトのdemo pageを、ほぼそのまま使っています。このファイルを作成したら、githubのproject repoにプッシュします。

.circleci/config.yml

version: 2
jobs:
build:
working_directory: ~/to-do-list
docker:
- image: circleci/node:latest-browsers
steps:
- checkout
- run:
name: update-npm
command: 'yarn global add npm@latest'
- restore_cache:
key: dependency-cache-{{ checksum "package.json" }}
- run:
name: install-npm-wee
command: yarn
- save_cache:
key: dependency-cache-{{ checksum "package.json" }}
paths:
- ./node_modules
- run:
name: test
command: npm test
background: true
      - run:
name: Run the application
command: yarn start
background: true
      - run: yarn run selenium-setup
- run: yarn run selenium-setup
- run: yarn run e2e-tests

dockerのイメージは、 circleci/node:latest-browsersで行うと、後のテストや依存性のインストールなどをスムーズに行えます。

また、npm installを使うより、yarnでdependenciesを取ってきています。

UIテストのseleniumを走らせる前に、アプリをバックで走らせます。

このproject repoをcircleci側に登録すれば、完了です。


React(node.js)のアプリに関しては、ほぼ公式のデモページで動かす事ができます。

では、次にGo言語のアプリにcircleciを入れていきます。

同様に、.circleci/config.yml の設定を次のように行います。GoとPostgreSQLの連携したアプリ用になります。

# Golang CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-go/ for more details
version: 2
jobs:
build:
docker:
# specify the version
- image: circleci/golang:1.8
- image: circleci/postgres:9.4
      # Specify service dependencies here if necessary
# CircleCI maintains a library of pre-built images
# documented at https://circleci.com/docs/2.0/circleci-images/
# - image: circleci/postgres:9.4
    #### TEMPLATE_NOTE: go expects specific checkout path representing url
#### expecting it in the form of
#### /go/src/github.com/circleci/go-tool
#### /go/src/bitbucket.org/circleci/go-tool
working_directory: /go/src/github.com/Akitsuyoshi/goWithDB
steps:
- checkout
      # specify any bash command here prefixed with `run: `
- run: go get -v -t -d ./... && go build -v ./...
- run: go get github.com/golang/lint/golint
- run: golint ./...
- run: go vet ./...
      - run: go get github.com/jstemmer/go-junit-report
      - 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: go test -v ./...

基本的な処理は、次の様になります。

  • GoとPostgreSQLのイメージを取ってくる。
  • アプリの依存パッケージを取ってきて、アプリをbuildする。
  • lint(インストールする必要あり)やgo vetで、コードの不具合を確認する。
  • DBの起動前にテストを行わないよう、呼び出しから起動までの時間を設ける。
  • テストを実行する。

また次のように、Circleciバージョン2の機能である、 setup_remote_docker でまた別のdocker containersを作成することもできます。

ただし、今回のようにキャッシュについて正しい設定を行わないと、DBなどのservice containerが入ってきた時にテスト時間が増大します。

# Golang CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-go/ for more details
version: 2
jobs:
build:
docker:
# specify the version
- image: circleci/golang:1.8
      # Specify service dependencies here if necessary
# CircleCI maintains a library of pre-built images
# documented at https://circleci.com/docs/2.0/circleci-images/
# - image: circleci/postgres:9.4
    #### TEMPLATE_NOTE: go expects specific checkout path representing url
#### expecting it in the form of
#### /go/src/github.com/circleci/go-tool
#### /go/src/bitbucket.org/circleci/go-tool
working_directory: /go/src/github.com/Akitsuyoshi/apiDocker
steps:
- checkout
      # specify any bash command here prefixed with `run: `
- run: go get -v -t -d ./...
- run: go get github.com/golang/lint/golint
- run: golint ./...
- run: go vet ./...
      - run: go test -v ./...
      - setup_remote_docker
- run:
name: Install Docker Compose
command: |
set -x
curl -L https://github.com/docker/compose/releases/download/1.11.2/docker-compose-`uname -s`-`uname -m` > ~/docker-compose
chmod +x ~/docker-compose
sudo mv ~/docker-compose /usr/local/bin/docker-compose
      - run: docker-compose build
      - run:
name: make image run
command: |
docker-compose up -d
      - run:
name: Waiting for mongo 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 mongo && exit 1
      - run:
name: Validate service is working
command: |
docker exec -it apidocker_api_1 bash
exit

現時点(2017/9/17)でのCircleci内での docker-compose は、versionによっては不安定な動きをします(buildやupにたまに失敗)。


感想

依存パッケージのインストールと、DBコンテナーの構築の際に、起動するまでの時間を考慮する必要を知りました。

Circleciのconfigファイルを作るときも、処理の流れ(Workflow)を、ブランチが複数あるような状況では使っていく必要性が出て来るのかな、と思います。

またReactに関してはキャッシュの設定が出来ましたが、Goの方は今回分からず、見送りました。

Goのアプリのシンプルさに対して長いテスト時間(3分)は、今後の課題です。