2019.4.6 YAMLの設定が一部間違っていたので修正しました

新年一発目です. Drone CI が,めでたくバージョン1.0(まだ rc だけど)をリリースしてドキュメントも刷新されたんですけど,0.8.x 時代にはあった docker-compose でのやり方が書いてなかった(見つけられなかった)ので,そのメモ書きです. ちなみに経緯は,結構前に作っていた drone-haskell と言う Drone CI の Haskell クライアントを Drone 1.0 に対応したくて,手元で Drone を起動しようとしたためです. めでたく,Haskell クライアントも 1.0 に対応したので,それの紹介もおまけでします.

Drone CI

Drone.io, Inc. というアメリカ企業が開発している継続的デリバリーを支援するためのプラットフォームである. 同種のものに Jenkins や TravisCI,CircleCI などが挙げられます(多分). 単純な利用者側(リポジトリにCIなどを設定する側)としては,TravisCI・CircleCI に似ているが,これらとの大きな違いとして,Drone は GitHub 上に OSS として公開されている点だ:

あと個人的に特徴的なのが Plugin という形で様々な機能を提供している点だ(このあたりは Jenkins に似ているのかな). 公式のページより,組織アカウントを見た方が早い気がする(これに限らずドキュメントが色々追いついてない印象):

docker-compose する

さて本題. ローカルで Drone サーバを docker-compose up して GitHub で利用する. GitHub で利用するには Drone を GitHub の OAuth App として登録する必要がある. OAuth App にするにはパブリックな URL が必要なので,ngrok を利用する:

$ ngrok http 8000

これで仮に abcdef.ngrok.io と言うドメインを得たとする. 次のような OAuth App を登録する:

注意点として,8.0.x のときは callback URL が /authorize だったのに対し,1.0 では /login となっている. あとは次のような docker-compose.yml ファイルを書けば良い:

version: '2'

services:
  drone-server:
    image: drone/drone:1.0.0-rc.3
    ports:
      - 8000:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - .:/data
    restart: always
    environment:
      - DRONE_GITHUB_SERVER=https://github.com
      - DRONE_GITHUB_CLIENT_ID=XXX
      - DRONE_GITHUB_CLIENT_SECRET=YYY
      - DRONE_RPC_SECRET=ZZZ
      - DRONE_SERVER_HOST=abcdef.ngrok.io
      - DRONE_SERVER_PROTO=https
      - DRONE_TLS_AUTOCERT=true

  drone-agent:
    image: drone/agent:1.0.0-rc.3
    command: agent
    restart: always
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_RPC_SERVER=http://drone-server
      - DRONE_RPC_SECRET=ZZZ
      - DRONE_RUNNER_CAPACITY=2

XXX は GitHub OAuth App の Client ID を,YYY には Client Secret を記述する. DRONE_RPC_SECRETZZZ は server と agent で同じであればなんでも良いのだが,ここopenssl rand -hex 16 で生成すると書いてあるので,それに従う. これであとは docker-compose up をすれば無事起動完了だ.

$ curl http://localhost:8000/version
{"source":"https://github.com/drone/drone.git","version":"latest","commit":"ffe3ad2aa2a30d0ba4d848c1cd0f61238b73a21c"}

ちなみに

Drone ってクラウドのフリープランがあったのに記事を書いてる時に気づいた(遅い):

$ curl https://cloud.drone.io/version
{"source":"https://github.com/drone/drone.git","version":"latest","commit":"f16b67b54fb462d3a4b2cfa93f527d4f8d1e19af"}

わざわざ検証用に立てる必要なかったな笑 ちなみにフリープランでは5リポジトリまでと書いてあったが,試しに6個 Activate したらできた. 謎.

おまけ: drone-haskell

ここからおまけ. drone の Haskell クライアントを作った. ちゃんとバージョン 1.0 に対応させてます:

Drone 1.0 の RESTful API に関するドキュメントは見つからなかったので,唯一公式から出ている Drone クライアントである drone-go のコード読んで実装した. なので,drone-go が間違ってたらこっちも間違ってる.

利用したパッケージ

HTTP クライアントには req を,レスポンス型には extensible を利用した. このあたりの組み合わせについては昔記事に書いた:

ちなみに,管理がめんどくさい(加えて extensible は今の LTS にはまだないし)ので,Stackage や Hackage には登録していない. なので Stack でビルドするには extra-deps に書き加える必要がある:

extra-deps:
- extensible-0.5
- github: matsubara0507/drone-haskell
  commit: XXX

ちょっと工夫

おしまい