Wercker - automation driven development
プライベートリポジトリが無料で使える上、独自の実行環境を作って使うこともできる CI サービス。
LXC と Docker の2種類のインフラストラクチャが使用可能で、ビルドの後にデプロイを実行したりもできる。
なお、今後は Docker の方が奨励されるらしく、後述の LXC を使う方法は役に立ちません。
独自の Box を作る
LXC の場合、ビルドを実行する環境は Wercker の Registry から Box というものを探して使用します。Registry に自分で作成した Box を登録することもできます。
試しに PHP 7 が使える Box を作ってみます。次のように wercker に Applications を登録します。
-
wercker-box.yml
というファイルが含まれたリポジトリを GitHub に作る - リポジトリを Wercker の Applications に登録する
- 作成途中で Docker か? みたいなことを聞かれますが、No です
- リポジトリに wercker.yml がないよー みたいに言われるかもしれないけど無視する
- Box を Registry に登録するためには Application が Public である必要がある
- Application の設定画面を開いて Targets に
wercker directory
を登録する- Targets というのはデプロイの設定のこと
- どの Git のブランチがデプロイされるかを設定できる
- ターゲット名はただの飾り
wercker-box.yml は次のような内容です。
name: example
version: 0.0.4
type: main
platform: ubuntu@12.04
description: example
keywords:
- php
- php7
packages:
- php@7
script: |
sudo apt-get update
sudo apt-get install -y wget curl tar make gcc autoconf re2c bison libxml2-dev python-pip
sudo apt-get clean
sudo pip install awscli
cd /tmp/
wget --content-disposition https://github.com/php/php-src/archive/master.tar.gz
tar xzf php-src-master.tar.gz
cd php-src-master/
./buildconf
./configure
make
sudo make install
sudo cp php.ini-development /usr/local/lib/php.ini
cd
sudo rm -fr /tmp/*
php -v
Application の登録が完了したらビルドを実行します。ビルドを実行すると空のビルドが走ります。wercker.yml
がリポジトリに含まれていないためです。本来は wercker.yml
にビルドの手続きを書いているのですが、このリポジトリは Box の作成のためのものなので wercker.yml
がありません。
ビルドが成功すると(空なので必ず成功するはずですが)、デプロイが実行されます。
wercker directory
のデプロイは wercker-box.yml
に書かれた手続きを実行したあと、デプロイで使用した環境そのものを Registry に登録します。
-
platform
でベースとなるプラットフォームを指定しますがubuntu@12.04
しか選べないらしいです- LXC のホストのことだと思います
-
inherits
かなにかで Registry に登録されている Box をベースにできたと思います - 同じ
version
を重複してデプロイできません- 上書きされたりもしないのでデプロイの都度
version
はインクリメントが必要です
- 上書きされたりもしないのでデプロイの都度
独自の Box を使ってみる
↑で作成した PHP 7 の Box を使ってみます。
-
wercker.yml
というファイルが含まれたリポジトリを GitHub につくる - このリポジトリを Wercker の Applications に登録する
- 作成途中で Docker か? みたいなことを聞かれますが、No です
wercker.yml は次のような内容です。
box: ngyuki/example
build:
steps:
- script:
code: |-
uname -a
php -v
Wercker で手動でビルドするか、GitHub のリポジトリに Push すればビルドが実行されます。
ビルドとデプロイの連携
ビルドやデプロイの実行時には次のように環境変数が設定されています。また、カレントディレクトリは /pipeline/build
です。
export WERCKER_ROOT="/pipeline/build"
export WERCKER_SOURCE_DIR="/pipeline/build"
export WERCKER_OUTPUT_DIR="/pipeline/output"
ビルドで $WERCKER_OUTPUT_DIR
になにかが出力されていれば、デプロイではそのディレクトリの内容が $WERCKER_SOURCE_DIR
にコピーされます。もし、ビルドで $WERCKER_OUTPUT_DIR
が空っぽなら、ビルドの $WERCKER_SOURCE_DIR
がデプロイの $WERCKER_SOURCE_DIR
にコピーされます。
試しになにか適当なファイルをビルドで作って、デプロイで S3 にアップロードしてみます。
- Application の設定画面の Targets で
custom deploy
を追加します- ターゲット名はただの飾りです
-
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_S3_BUCKET
のような環境変数をそれっぽく設定します-
Protected
を ON にすれば画面やビルドのログに表示されなくなります
-
- SSH 鍵なんかも登録できるようです
- rsync でデプロイとかも簡単そうです
デプロイの設定ができたら、リポジトリの wercker.yml を次のように修正してプッシュします。
box: ngyuki/example
build:
steps:
- script:
name: php information
code: |-
uname -a
php -v
php -i > $WERCKER_OUTPUT_DIR/wercker-output.txt
deploy:
steps:
- script:
name: upload s3
code: |-
aws s3 cp wercker-output.txt s3://$AWS_S3_BUCKET/
自動的にビルドが実行され、さらにデプロイで S3 へのアップロードも行われます。
Docker を使ってみる
インフラストラクチャに Docker を使う場合は Wercker の Registry のようなものではなく普通に Docker Hub が使えるので、独自のビルド環境が欲しければ Docker Hub にイメージを登録すれば OK です。
ビルドの wercker.yml も、下記のように box
のところを Docker のイメージの名前にするだけです。
box: docker.io/centos:7
build:
steps:
- script:
name: uname
code: |-
uname -a
wercker CLI
wercker CLI というものが提供されていて、wercker のサイトと同じ環境でビルドのテストとかができます(インフラが Docker の場合だけです)。
インストールします。
curl https://s3.amazonaws.com/downloads.wercker.com/cli/stable/linux_amd64/wercker \
-o $HOME/bin/wercker
chmod +x $HOME/bin/wercker
wercker --version
例えば wercker.yml
をこんな感じにして wercker dev
すると、カレントディレクトリを監視して変更があると自動的にコマンドが実行される(cifs だとダメ)。
box: docker.io/centos:7
dev:
steps:
- internal/watch:
code: bash app.sh
reload: true
wercker.yml
をこんな感じにすると、wercker dev
でコンテナの中に入ることができる。
box: docker.io/centos:7
dev:
steps:
- internal/shell:
cmd: /bin/bash
code: |
cd /var/log
wercker.yml
をこんな感じにして wercker dev --attach-on-error
とすれば、コマンドがコケた時だけコンテナの中に入ります。
box: docker.io/centos:7
dev:
steps:
- script:
code: |-
bash app.sh
他にも wercker build
であたかも wercker のサイトでビルドしたかのようにローカルでビルドできたり、wercker pull
で wercker サイトからコンテナを持ってきたり、ビルド結果のコンテナを持ってきたりすることができるっぽい。
Steps
ここでは全く使いませんでしたが、wercker.yml
の steps
は複数指定することができ、また、script
以外にも作成済のものがいろいろ使えます。
例えば、wercker/step-npm-install は npm install
を実行する Step で、下記のように使えます。
build:
steps:
- npm-install
- script:
code: npm test
他にも、S3 にアプロードする Step などいろいろ便利なものがあります。
deploy:
steps:
- s3sync:
key-id: $KEY
key-secret: $SECRET
bucket-url: $BUCKET
source-dir: $SOURCE
opts: --acl-private
Step も Box と同じように、自分で独自のものをつくることができます。