drone.io でagentを監視するためのヘルスチェック用エンドポイントを設定する

この記事は drone.io Advent Calendar 2017 - Adventar の17日目の記事です。

drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。

github.com

ヘルスチェック用のエンドポイントを設定する

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)環境です。

github.com

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)環境です。

github.com

通常 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)環境です。

github.com

テストは実行時間が短ければ短いほどよいものですが、時には長い時間がかかるものがあります。

CCMenu はCI環境のビルド状態をメニューバーに通知することができるソフトウェアです。drone.io はCCMenuに対応しています。

設定

表示したいリポジトリごとに以下のURLを設定してください。

<scheme>://<hostname>/api/badges/<owner>/<repo>/cc.xml

f:id:ashphy22:20171212235555p:plain

ビルド時

ビルドが始まるとアイコンが変化します

f:id:ashphy22:20171213000158p:plain

ビルドが終わるとデスクトップ通知が来ます!

f:id:ashphy22:20171213000455p:plain

drone.io プライベートな環境でdockerイメージの Automated build を実現する

この記事は drone.io Advent Calendar 2017 - Adventar の13日目の記事です。

drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。

github.com

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)環境です。

github.com

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)環境です。

github.com

drone.io v0.5 でpushしてもテストが始まらないときがあります。 その場合はwebhookが実行されているか調べてみましょう。

Github Entepriseと連携している場合は Settings -> Hooks & services -> drone/hook を開いて Recent Deliveries を見てみましょう。

f:id:ashphy22:20171210234743p:plain

.drone.ymlyamlとして書式が崩れていてパースできない場合にwebhookのdeliveryが500エラーになります。この場合は .drone.yml を見直してください。

ちなみに drone v0.7以上ではwebhookのdeliveryは成功して、テストが失敗するのでわかりやすくなっています。古いバージョンを使っている場合はバージョンアップをご検討ください。