Wercker v2でHerokuっぽい環境を作ってテストを動かす
こんにちは、浅野です。
今日は、Dockerに対応したWercker v2(Ewok)でHeroku+Postgresqlっぽい環境を作ってテストを実行するまでの手順を紹介します。
言語は相変わらずJavaです。(Java8+Gradle)
Werckerとは
Werckerは、TravisCIやCircleCIのようなCIサービスです。 無償プランでGithubのPrivateリポジトリがビルドできるため、Flectではよく使用されています。
Wercker v2
元々はBoxと呼ばれる独自の実行環境を使っていたのですが、V2からは実行環境にDockerHubのイメージを指定するようになっています。
テストを実行するDockerイメージを作る
HerokuがDockerをサポートしたこともあり、DockerHub上にHeroku謹製のcedarイメージがあります。 これがそのまま使えるかと期待したものの、上手くいきませんでした。
原因は、heroku/cedar:14
に標準インストールされているJDKが 1.7.0_79 だったためです。
なので、 heroku/cedar:14
をベースにJDK8入りのイメージを作ります。
こんなDockerfileで作ったイメージをDockerHubへ登録します。 (DockerHubのここのタグ0.2にこれで作ったDockerイメージが置いてあります)
FROM heroku/cedar:14 ENV DEBIAN_FRONTEND noninteractive RUN apt-get update RUN apt-get -y install software-properties-common python-software-properties RUN add-apt-repository -y ppa:openjdk-r/ppa RUN apt-get update RUN apt-get -y install openjdk-8-jdk RUN update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java RUN update-alternatives --set javac /usr/lib/jvm/java-8-openjdk-amd64/bin/javac
wercker.ymlを書く
ここにテストを実行するための環境・テストの実行ステップを定義します。
ベースイメージを指定する
先ほどDockerHubにUpしたDockerイメージをBoxに指定します。
box: yuasano/heroku:0.2
Postgresqlを追加する
次にHeroku Postgresqlアドオン相当のものを追加します。Werckerでは外部サービスを追加する時は service
を使います。
これは以下のようになります。 POSTGRES_USER
は省略可で、省略した場合はpostgresユーザが作られます。
services: - id: postgres env: POSTGRES_PASSWORD: YOUR_PASSWORD POSTGRES_USER: YOUR_NAME
詳しくは公式ドキュメントを参照してください。
DB接続用の環境変数 DATABASE_URLを定義する
次に、HerokuPostgresで追加される環境変数DATABASE_URL
を定義します。
これは、実行時に動的に決まる値なので、以下の環境変数群(どうもpostgresqlのDockerイメージがこういう環境変数を使うよう)を使って生成します。
POSTGRES_ENV_POSTGRES_USER=YOUR_NAME POSTGRES_ENV_POSTGRES_PASSWORD=YOUR_PASSWORD POSTGRES_PORT_5432_TCP_PORT=5432 POSTGRES_PORT_5432_TCP_ADDR=172.XX.X.XX
この値を組み合わせてDATABASE_URLを定義する手続きを、buildステップの最初に記述します。
build: steps: - script: name: set DATABASE_URL env code: | export DATABASE_URL="postgresql://${POSTGRES_ENV_POSTGRES_USER}:${POSTGRES_ENV_POSTGRES_PASSWORD}@${POSTGRES_PORT_5432_TCP_ADDR}:${POSTGRES_PORT_5432_TCP_PORT}/postgres"
Gradleのテストを実行するステップを作る
次に、 set DATABASE_URL envスクリプトの後にGradleのテストタスクを実行するステップを追加します。
- script: name: run test code: | ./gradlew test
これでWerckerV2の上で、Heroku+Postgresqlに近い環境でJava8+Gradleのテストが実行できるようになりました。
最終的に出来上がった wercker.yml は以下のようになります。
box: yuasano/heroku:0.2 services: - id: postgres env: POSTGRES_PASSWORD: mypage POSTGRES_USER: mypage build: steps: - script: name: set DATABASE_URL env code: | export DATABASE_URL="postgresql://${POSTGRES_ENV_POSTGRES_USER}:${POSTGRES_ENV_POSTGRES_PASSWORD}@${POSTGRES_PORT_5432_TCP_ADDR}:${POSTGRES_PORT_5432_TCP_PORT}/postgres" - script: name: run test code: | ./gradlew test
Heroku謹製のcedarイメージがDockerHubに置かれて、よりHeroku環境に近い環境でテストができるのは安心ですね。(Cedar14がベータの頃にHerokuにデプロイした時だけ動かない機能があって、原因がCedar14側だった経験があるので...)