drone.io でagentを監視するためのヘルスチェック用エンドポイントを設定する
この記事は drone.io Advent Calendar 2017 - Adventar の17日目の記事です。
drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。
ヘルスチェック用のエンドポイントを設定する
drone agent複数生やしたdrone agentの監視を行いたい場合がでてくるかもしれません。ただdrone agentはAPIなどが出ているわけではないので、そのままだとヘルスチェックを行うのが面倒です。
隠しオプションDRONE_HEALTHCHECK
を使うとヘルスチェック用のエンドポイントを生やすことができます。
docker-compose を使っている場合は以下のように設定してください。
3000番で上がってくるのでports
を設定するのを忘れないようにしましょう。
services: drone-agent: image: drone/agent:0.8.2 command: agent restart: always ports: - 3000:3000 volumes: - /var/run/docker.sock:/var/run/docker.sock environment: - DRONE_SERVER=drone.example.com:9000 - DRONE_SECRET=000000000000000000000000 - DRONE_HEALTHCHECK=true
設定後は3つのエンドポイントが設定されます。
/healthz
正常な場合はステータスコード200、問題がある場合は500が返ります。
$ curl -I http://localhost:3000/healthz HTTP/1.1 200 OK Date: Sat, 16 Dec 2017 07:42:04 GMT Content-Type: text/plain; charset=utf-8
/varz
実行中のジョブが見えます。
curl -s http://localhost:3000/varz | jq
{ "polling_count": 0, "running_count": 1, "running": { "9999": { "id": "9999", "repository": "hoge/drone-test", "build_number": "01", "build_started": "2017-11-22T12:01:46.382605125Z", "build_timeout": 3600000000000 } } }
/version
agentのバージョンが取れるようです。
curl -s http://localhost:3000/version | jq
{ "version": "0.8.2+build.1356", "source": "https://github.com/drone/drone" }
drone.io で実行時のリソースを制限する
この記事は drone.io Advent Calendar 2017 - Adventar の14日目の記事です。
drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。
droneではテスト実行時は無制限にホストのリソースを使ってしまいます。これはdockerのデフォルト動作です。プライベートな環境であればあまり問題にならないかもしれませんが、複数ユーザが相乗りするような環境ではリソースの制限をしたくなるかもしれません。
ドキュメントには記載がありませんが、docker のオプションに対応する cpu_quota
, cpuset
, cpu_shares
, mem_limit
, memswap_limit
, shm_size
を指定することができます。
pipeline: limit_build: image: golang cpu_quota: 1000 cpuset: 1,2 cpu_shares: 99 mem_limit: 4MB memswap_limit: 1kb shm_size: 1kb commands: - go test
上記は .drone.yml で個別に指定する形式ですが、 drone-serverの起動時環境変数に指定するとデフォルトのリソース制限を設定することができます。
services: drone-server: environment: - DRONE_LIMIT_CPU_QUOTA=1000 - DRONE_LIMIT_CPU_SET=1,2 - DRONE_LIMIT_CPU_SHARES=99 - DRONE_LIMIT_MEM=4MB - DRONE_LIMIT_MEM_SWAP=1kb - DRONE_LIMIT_SHM_SIZE=1kb
この制限は pipeline だけでなく service にも指定可能です。
drone.io でビルドを並列実行する
この記事は drone.io Advent Calendar 2017 - Adventar の15日目の記事です。
drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。
通常 pipeline
に書いたビルドは上から順番にシリアルに実行されていきますが、 group
の指定を追加することで好きなステップを並列に実行することができます。
pipeline: backend: group: build image: golang commands: - go build - go test frontend: group: build image: node commands: - npm install - npm run test - npm run build publish: image: plugins/docker repo: octocat/hello-world
group: build
を指定した箇所は並列で実行され、publish
ステップは group: build
が終わってから実行されます。
groupの指定をする場合は間に他のステップを入れてはいけません。
またこの並列実行は同一agent(ホスト)上での実行となるため、他のホストにまたがって実行されるわけではありません。リソースの競合には気をつけたほうがいいでしょう。
さて並列に実行すると言えば matrix ビルド機能がありますが、これと組み合わせて並列実行させることはできません。ざんねん。
CCMenuでdrone.ioのビルド結果を通知させる
この記事は drone.io Advent Calendar 2017 - Adventar の14日目の記事です。
drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。
テストは実行時間が短ければ短いほどよいものですが、時には長い時間がかかるものがあります。
CCMenu はCI環境のビルド状態をメニューバーに通知することができるソフトウェアです。drone.io はCCMenuに対応しています。
設定
表示したいリポジトリごとに以下のURLを設定してください。
<scheme>://<hostname>/api/badges/<owner>/<repo>/cc.xml
ビルド時
ビルドが始まるとアイコンが変化します
ビルドが終わるとデスクトップ通知が来ます!
drone.io プライベートな環境でdockerイメージの Automated build を実現する
この記事は drone.io Advent Calendar 2017 - Adventar の13日目の記事です。
drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。
Docker HubにはリポジトリにあげたDockerfileを自動でビルドしてくれる Automated builds という機能があります。 しかし外に出したくないイメージを管理するために Docker Private Registry を利用しているしている場合はこの機能を利用することができません(Docker EEを利用する方法もあります)。
drone-docker plugin を利用してイメージのビルドを自動化しましょう。
.drone.yml は以下のようになります。ビルドするファイルと、push先のdocker-registeryを指定します。
プライベートなDocker Registryは証明書がアレなことも多いでしょうからinsecure
オプションも指定できるようになっています。
build_image: image: plugins/docker dockerfile: ./Dockerfile insecure: true repo: docker-reg.example.com:5000/ci/test-kitchen registry: docker-reg.example.com:5000
どころでこのプラグインは中でdockerを使っていますが、trustedフラグなしで動きます。 これは docker:dind イメージを利用しており内部で docker in docker をしているためです。 コレを利用すればもう少し面白いことができそうです。
drone.io でHipchat通知時の文面をカスタマイズする
この記事は drone.io Advent Calendar 2017 - Adventar の12日目の記事です。
drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。
Hipchat Plugin ではビルドが終わったときにHipchatへ通知することができます。
基本的な使い方は以下のようになります。
hipchat: image: jmccann/drone-hipchat url: https://hipchat.example.com room: 'test-room' secrets: [ hipchat_auth_token ]
template を使うことで通知時の文面をカスタマイズすることができます。 しかし公式のドキュメントが間違っているので細かいカスタマイズを解説しておきます。
まず基本形はいかのようになります。公式のドキュメントでは{{
と#success
の間にスペースが入っていますが、これがあると動きません。
hipchat: template: | {{#success build.status}} build {{ build.number }} succeeded. Good job. {{else}} build {{ build.number }} failed. Fix me please. {{/success}}
テンプレートエンジンにはaymerick/raymondが利用されています。デフォルトの文面は以下のテンプレートが利用されていますので、これを元にカスタマイズするのがおすすめです。
template: | <strong>{{ uppercasefirst build.status }}</strong> <a href=\"{{ build.link }}\">{{ repo.owner }}/{{ repo.name }}#{{ truncate build.commit 8 }}</a> ({{ build.branch }}) by {{ build.author }} in {{ duration build.created build.finished }} </br> - {{ build.message }}
ビルドイン関数
以下の関数が利用できます。
関数名 | 機能 |
---|---|
uppercasefirst(string) | 1文字目を大文字にする |
uppercase(string) | 大文字にする |
lowercase(string) | 小文字にする |
duration(started, finished) | ビルドにかかった時間 |
datetime(timestamp, layout, zone) | 日時をlayout文字列に従って文字列に変換する |
truncate(string, length) | 文字列を指定した文字数を切り詰める |
success(condition) | ブロックで囲んだ場所をビルド成功時に評価する |
failure(condition) | ブロックで囲んだ場所をビルド失敗時に評価する |
urlencode | ブロックで囲んだ場所をurlencodeする |
ビルトイン変数
以下の変数が表示に利用できます。
変数 | 説明 |
---|---|
build.number | ビルド番号 |
build.event | ビルド発生イベント |
build.commit | コミットID |
build.branch | ブランチ名 |
build.remote | リモートURL |
build.message | コミットメッセージ |
build.author | コミットした人 |
build.avatar | コミットした人のavatar画像のURL |
build.email | コミットした人のメールアドレス |
build.link | ビルド画面へのリンク |
repo.owner | リポジトリオーナー |
repo.name | リポジトリ名 |
repo.link | リポジトリのURL |
repo.branch | 対象のブランチ |
drone.io v0.5 でテストが始まらないときは
この記事は drone.io Advent Calendar 2017 - Adventar の10日目の記事です。
drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。
drone.io v0.5 でpushしてもテストが始まらないときがあります。 その場合はwebhookが実行されているか調べてみましょう。
Github Entepriseと連携している場合は Settings -> Hooks & services -> drone/hook を開いて Recent Deliveries を見てみましょう。
.drone.yml
がyamlとして書式が崩れていてパースできない場合にwebhookのdeliveryが500エラーになります。この場合は .drone.yml
を見直してください。
ちなみに drone v0.7以上ではwebhookのdeliveryは成功して、テストが失敗するのでわかりやすくなっています。古いバージョンを使っている場合はバージョンアップをご検討ください。