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 にも指定可能です。