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_IDAWS_SECRET_ACCESS_KEYAWS_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 と同じように、自分で独自のものをつくることができます。