Help us understand the problem. What is going on with this article?

Java+GradleのアプリケーションをWerckerでビルドとテストする

More than 1 year has passed since last update.

私の作業記録の側面が強いですが、Werckerについての手順を、実作業の記録ベースで作成しました。筆者はCI自体始めてですので、間違っている点があるかもしれません。その際はご指摘ください。

概要

Gradleを使ったJavaアプリケーションのGitHubリポジトリにおいて、Werckerで自動ビルド、自動テストするまでの手順です。
ここではパブリックのリポジトリをテストしましたが、そのうちプライベートのリポジトリも試し、結果を追記するかもしれません。

Wercker

URL

https://app.wercker.com/

概要

Wercker、読み方はワーカー。最近Oracleが買収した。プライベートリポジトリを無料で使える。Dockerを使ってビルド環境を構築できる。

目次

  1. Werckerサインイン
  2. GitHubリポジトリをWerckerに登録
  3. wercker.yml作成、GitHubリポジトリにプッシュ、自動ビルド、自動テストが動く
  4. ビルドが通るように、wercker.ymlを設定する
  5. GradleでのJUnitテストが失敗すればWercker上でもビルド失敗となることの確認
  6. GitHubリポジトリでWerckerのチェックを強制し、テストNGの場合マージを拒否する

Werckerサインイン

  1. Werckerにアクセス
  2. GitHubのアカウントでログインできる

GitHubリポジトリをWerckerに登録

  1. Werckerの Create your first application ボタンをクリック
  2. Select User & SCM 画面
    1. Select a user from the doropdown begin.*
      • Werckerのアカウントが表示される、使用するアカウントを選ぶ
    2. Select SCM
      • GitHub、Bitbucket、GitLabが対応している
      • 本記事ではGitHubを使うので、GitHubを選択
  3. Select Repository 画面
    1. Werckerに追加するGitHubのリポジトリを選択する
      • admin権限を持っているリポジトリしか表示されない(はず、Werckerのドキュメントを読んだが、間違っていたら指摘ください)
  4. Setup SSH Key 画面
    • wercker will check out the code without using an SSH key
      • SSH鍵無しで、Werckerが対象リポジトリをチェックアウトする
      • 推奨なのでこれを選択する
    • Add the deploy key to the selected repository for me
      • SSH鍵を登録してリポジトリにアクセスする
      • 非推奨、おそらくリポジトリの操作権限を安易に渡さないため
  5. Review 画面
    1. 選択した内容通りに、設定されていることを確認
    2. Make my app public
      • チェックを入れると、後から登場するbadgeをクリックした時に、デプロイ情報を公開できるようになる
      • 必要なければチェックを入れない
  6. Wercker上のアプリケーション追加が完了

wercker.ymlを作成し、GitHubリポジトリにプッシュ

  1. リポジトリ登録の完了画面から、そのままの画面でyml追加画面が開いている
  2. Select a language と書かれたセレクトボックスからJavaのGradleを選択
  3. wercker.ymlの内容が表示されるのでクリップボードにコピー
  4. リポジトリのルート直下にwercker.ymlファイルとして、コピーした内容のファイルを作成
    • Javaのバージョンは適宜変更が必要かもしれない
    • box: openjdk:8-jdkからbox: openjdk:10.0.1-jdkに変更した
    • boxはDockerfileでのpullと同義
    • openjdk 公式DockerHubを参考に、10.0.1-jdk部分は記載した
  5. wercker.ymlをリポジトリにプッシュ
  6. プッシュをキャッチして、自動でWercker上でRunされる
  7. 成功か、エラーかが出る
    • 筆者の作業ではwerckerのビルドフェーズでエラーになって失敗した
    • 実行時にGradle 4.2が指定されていたログが出ていたが、Gradle 4.2はJava10に対応してないのでエラーになる
    • Gradle 4.8で開発しているので、利用されたGradleバージョンが低い
  8. エラーの解消について、事項で説明する

Werckerデフォルトのwercker.ymlの内容

# This references an OpenJDK container from the
# Docker Hub https://hub.docker.com/_/openjdk/
# Read more about containers on our dev center
# http://devcenter.wercker.com/docs/containers/index.html
box: openjdk:8-jdk

# This is the build pipeline. Pipelines are the core of wercker
# Read more about pipelines on our dev center
# http://devcenter.wercker.com/docs/pipelines/index.html
build:
    # Steps make up the actions in your pipeline
    # Read more about steps on our dev center:
    # http://devcenter.wercker.com/docs/steps/index.html
  steps:
    # https://github.com/wercker/step-gradle
    - java/gradle:
      task: build
      cache_project_cache: true

ビルドが通るように、wercker.ymlを設定する

対策

  1. wercker.ymlのbuild項目、java/gradleにversion:<バージョン値>を設定すると、任意のバージョンにできるはず
    • 失敗した
    • wercker.ymlのjava/gradleで指定できる、そのため 4.8.0 を設定した
    • ここで参照されるバージョンはGitHubリポジトリで管理されているが、この時点では4.2までしかなかった
    • 結果、Gradle 4.8が取得できず、インストールできない
  2. wercker.ymlのjava/gradleに頼らず、gradle wrapperを使う形にすれば任意のバージョンで実行できるはず
    • Wercker公式のガイドに従い、wercker.ymlを変更した
      • 最終的な内容に反映されているので、詳しくは後述を参照
      • 元々書かれていたbuild ステップ項目を削除
      • dev項目でgradlew bootRunを実行する
      • build項目でgradlew buildを実行する
    • 失敗した
    • Werckerがビルドフェーズに入ったところで、Error: Could not find or load main class org.gradle.wrapper.GradleWrapperMainが発生する
  3. gradle-wrapper.jarをリポジトリに追加して、gradlewが実行できるようにする
    • .gitignoreで.jarを全てコミット対象外にしていた
    • リポジトリのルートディレクトリ直下にある、gradle/wrapperディレクトリにgradle-wrapper.jarがないのでクラスが見つからなかった
    • .gitignoreに!gradle-wrapper.jarを追加してgradle-wrapper.jarはコミット対象に追加した
    • gradleをインストールせず、gradlewで実行する人向けに必要なjarでもあるので、リポジトリ管理対象にするのは問題ない
  4. Wercker上のビルドに成功した

最終的なwercker.yml

# This references an OpenJDK container from the
# Docker Hub https://hub.docker.com/_/openjdk/
# Read more about containers on our dev center
# http://devcenter.wercker.com/docs/containers/index.html
box: openjdk:10.0.1-jdk

# defining the dev pipeline
dev:
  steps:
    # A step that executes `gradle bootRun` command
    - script:
      name: run gradle
      code: |
        ./gradlew bootRun

# Build definition
build:
  # The steps that will be executed on build
  steps:
    # A step that executes `gradle build` command
    - script:
        name: run gradle
        code: |
          ./gradlew --full-stacktrace -q --project-cache-dir=$WERCKER_CACHE_DIR build

GradleでのJUnitテストが失敗すればWercker上でもビルド失敗となることの確認

  1. あえてテストクラスでNGが出るようにテストコードを変更する
  2. NGテストを含んだコードをGitHubリポジトリにコミットしてプッシュ
  3. Wercker上でビルドが失敗することを確認
    • 筆者自体も実際に試して、ビルドフェーズが失敗することを確認した

GitHubリポジトリでWerckerのチェックを強制し、テストNGの場合マージを拒否する

  1. GutHubリポジトリのSettingsを開く
  2. Branchesを開く
  3. masterブランチを選択して開く
  4. Require status checks to pass before mergingにチェックを入れる
  5. wercker/build項目にチェックを入れる
  6. 以降のmasterへのプルリクエストはWerckerのビルドを成功しないとマージできない

最後に

ここまででWercker上でGitHubへのプッシュをキャッチして自動でビルド(ビルドと同時に行われるテスト)が成功するか失敗するかを、確認することができるようになった。
ワークフローの設定などでできることはまだまだ多いので、それらについては、また試したら別記事として残す予定。

おまけ

Wercker開発者向けドキュメント
Werckerの仕組み,独自のboxとstepのつくりかた

mediado
私たちメディアドゥは、電子書籍を読者に届けるために「テクノロジー」で「出版社」と「電子書店」を繋ぎ、その先にいる作家と読者を繋げる「電子書籍取次」事業を展開しております。業界最多のコンテンツラインナップとともに最新のテクノロジーを駆使した各種ソリューションを出版社や電子書店に提供し、グローバル且つマルチコンテンツ配信プラットフォームを目指しています。
https://mediado.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away