Wercker v2でHerokuっぽい環境を作ってテストを動かす

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側だった経験があるので...)


コメント(0)