concourse.ioは、日本語情報とても少ないです。
とてもクールなCIツールです。
パイプライン、ジョブ、リソース、タスクといった考え方があり、CI/CDのパイプラインを構築できますが、実装しようと思うと意外と手が止まります。
パイプラインの起点は、S3やgitなどで、Jenkinsのようにとりあえず実行といったことができないからです。
とりあえず実行をするには、タスクを作るのがお勧めです。文書だけでは、うまく伝わらないと思いますが、日常の開発でも地味に便利です。
Javaの開発をしていたとします。対応する必要のあるJDKのバージョンはたくさんあるとします。
従来のビルド環境であれば、複数のバージョンをインストールして環境変数で切り替えるといったことが考えられますが、以外と面倒なことになります。
タスクの作成
concourseは、タスクはdockerコンテナで実行されます。
下記のようなタスクを準備してJDK1.6の環境を準備できます。
DockerHubのjavaオフシャルコンテナを使っています。tagの指定を変えれば、好みのバージョンを使うことができます。
$ cat sample.yml
---
platform: linux
image_resource:
type: docker-image
source: {repository: java, tag: 6}
run:
path: sh
args:
- -exc
- |
java -version
$ fly -t test execute -c sample.yml
executing build 41 at http://172.17.0.1:8080/builds/41
initializing
running sh -exc java -version
+ java -version
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-8u111-b14-2~bpo8+1-b14)
OpenJDK 64-Bit Server VM (build 25.111-b14, mixed mode)
succeeded
$
パラメータを指定する
任意のパラメータを環境変数で渡すことができます。コンパイルオプションの指定に便利です。
$ cat sample.yml
---
platform: linux
image_resource:
type: docker-image
source: {repository: java, tag: 6}
params:
JAVA_OPTS: -version
run:
path: sh
args:
- -exc
- |
java $JAVA_OPTS
$ JAVA_OPTS=-fullversion fly -t test execute -c sample.yml
executing build 43 at http://172.17.0.1:8080/builds/43
initializing
running sh -exc java $JAVA_OPTS
+ java -fullversion
java full version "1.6.0_38-b38"
succeeded
$
ファイルの受け渡し
下記のようなプログラムをコンパイルする場合、ソースコードを渡して、コンパイル結果を受け取る必要があります。
$ cat Hello.java
public class Hello {
public static void main(String[] args)
{
System.out.println("Hello, world.");
}
}
$
タスクにファイルを渡すためのinputsとファイルを受け取るためのoutputsを定義します。
$ cat sample.yml
---
platform: linux
image_resource:
type: docker-image
source: {repository: java, tag: 6}
params:
JAVA_OPTS: -version
inputs:
- name: src
outputs:
- name: obj
run:
path: sh
args:
- -exc
- |
java $JAVA_OPTS
javac src/Hello.java
java -cp src Hello
cp -p src/Hello.class obj
下記のように実行するとカレントディレクトリのファイルがsrcディレクトリにコピーされてタスク内で使用できるようになります。また、タスク内でobjディレクトリにコピーしたファイルは、/tmp/objで受け取ることができます。
$ fly -t test execute -c sample.yml -i src=. -o obj=/tmp/obj
executing build 44 at http://172.17.0.1:8080/builds/44
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1337 0 1337 0 0 1337 0 --:--:-- --:--:-- --:--:-- 435k
initializing
running sh -exc java $JAVA_OPTS
javac src/Hello.java
java -cp src Hello
cp -p src/Hello.class obj
+ java -version
java version "1.6.0_38"
OpenJDK Runtime Environment (IcedTea6 1.13.10) (6b38-1.13.10-1~deb7u1)
OpenJDK 64-Bit Server VM (build 23.25-b01, mixed mode)
+ javac src/Hello.java
+ java -cp src Hello
Hello, world.
+ cp -p src/Hello.class obj
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 455 0 0 0 455 0 455 --:--:-- --:--:-- --:--:-- 45500
succeeded
$ ls /tmp/obj
Hello.class
$
パイプラインは、タスクに定義されたinputsとoutputsをつなぎ合わせることで成果物の受け渡しを行います。非常によく考えられていて便利です。