Gradleでbowerを利用したフロントエンドのビルドまでを行う方法  (6/6)

# はじめに

Java/SparkプロジェクトのGradleを利用したビルド/デプロイについて、私が試したことをまとめたものです。
(ここで言う`Spark`は、分散処理ライブラリの`Apache Spark`ではなく、JavaのSinatraライクなMicroframeworkの`Spark`のことです)

## 目次

1. [Hello Worldアプリ](http://qiita.com/kaakaa_hoe/items/0e3c622ae8bde3d116ad)
2. [jadeテンプレートエンジン](http://qiita.com/kaakaa_hoe/items/6d4311e250df89f836b9)
3. [Grunt/bowerによるWebパッケージのビルド](http://qiita.com/kaakaa_hoe/items/61b326dcc5d7f161ff28)
4. [付録A. TravisCIによるビルド](http://qiita.com/kaakaa_hoe/items/373a5a8718c92676771f)
5. [付録B. Gradleでdocker build](http://qiita.com/kaakaa_hoe/items/18e5f3047931ee886acb)
6. **付録C. TravisCIからDockerHubへ docker push**

各章でのソースコードは [Commits · kaakaa/gradle-frontend-boilerplate](https://github.com/kaakaa/gradle-frontend-boilerplate/commits/master) から確認できます。

## 環境

* Java 1.8.0_74
* Gradle 2.12
* spark-core 2.3
* spark-template-jade 2.3
* node.js 4.4.0


# 付録C. TravisCIからDockerHubへ docker push

## 概要

GithubへのPushを契機にTravisCIでDockerビルドを行い、DockerイメージをDockerHubへPushする

* * *

TravisCI上ではDocker Remote APIが起動していなさそうなので、先ほど作った`buildDockerImage`タスクは使用せず、普通の`docker build`コマンドでDockerイメージを作成する。


## ビルドスクリプト

```yaml:.travis.yml
sudo: required  // (1) - Dockerを使うことを宣言
services:
- docker
language: java
jdk:
- oraclejdk8
env:  // (2) - Dockerビルド、DockerHubへのPushに使う情報を宣言する
  global:
  - REPO=kaakaa/gradle-frontend-boilerplate
  - COMMIT=${TRAVIS_COMMIT::8}
  - TAG=${COMMIT}
  - secure: <encrypted env>
  - secure: <encrypted env>
  - secure: <encrypted env>

script: "./gradlew build"
deploy:
  provider: releases
  api_key:
    secure: <encrypted repo>
  file:
  - "./build/distributions/gradle-frontend-boilerplate-1.0-SNAPSHOT.tar"
  - "./build/distributions/gradle-frontend-boilerplate-1.0-SNAPSHOT.zip"
  on:
    repo: kaakaa/gradle-frontend-boilerplate
    tags: true

after_deploy:  // (3) - Dockerビルド、DockerHubへのPushをする
- docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS
- docker build -f Dockerfile -t $REPO:$COMMIT .
- docker tag $REPO:$COMMIT $REPO:$TAG
- docker push $REPO:$COMMIT
```

### (1) Dockerを使うことを宣言

Travisビルドで`docker`コマンドを使用するには、この３行が必要。  
[Using Docker in Builds - Travis CI](https://docs.travis-ci.com/user/docker/)

### (2) Dockerビルド、DockerHubへのPushに使う情報を宣言する

Dockerイメージ名やDockerHubへPushする際の名前の情報などを宣言している。  
`${TRAVIS_COMMIT}`はTravisでのビルドが走る際のgitのコミットIDを示しており、`${TRAVIS_COMMIT::8}`で、その先頭８文字を取得できる。  
[Environment Variables - Travis CI](https://docs.travis-ci.com/user/environment-variables/#Default-Environment-Variables)

`secure`文字列はDockerHubへのログイン情報をencryptした文字列。  
下記のコマンドで生成できる。

```
travis encrypt DOCKEREMAIL=hoge@exampl.com --add env.global   
travis encrypt DOCKER_USER=kaakaa --add env.global   
travis encrypt DOCKER_PASS=password --add env.global   
```

[Using Docker in Builds - Travis CI](https://docs.travis-ci.com/user/docker/#Pushing-a-Docker-Image-to-a-Registry)  
[Encryption keys - Travis CI](https://docs.travis-ci.com/user/encryption-keys/)  

### (3) Dockerビルド、DockerHubへのPushをする

dockerコマンドを普通に打ってるだけ。  

TravisではDocker Remote APIが起動してないのでgradleの`buildDockerImage`タスクが使えないのが悲しい。

## ビルドスクリプト

```groovy:build.gradle
build.dependsOn installDist
```

Travis上で実行している`build`タスクが、Dockerビルドで必要なファイルを生成するための`installDist`タスクに依存するよう、どこかに上記１行を追加する。