AD-TECH
Lab BLOG
RCO アドテクLab ブログ

Docker を使ったオープンソース CI の Drone を試しました

2017/07/18kenkoooo

このエントリーをはてなブックマークに追加

エンジニアの kenkoooo です。オープンソース CI の Drone を GitHub Enterprise と連携させて使ってみました。

環境

以下の環境で構築しました。

  • Amazon Linux 2017.03
  • Docker version 17.03.1-ce
  • docker-compose version 1.14.0

インストール

公式ドキュメント の通り1drone:0.7docker-compose を使って起動します。以下のような docker-compose.yml を作成し, docker-compose コマンドによって起動します。

version: '2'

services:
  drone-server:
    image: drone/drone:0.7
    ports:
      - 80:8000
    volumes:
      - /var/lib/drone:/var/lib/drone/
    restart: always
    environment:
      - DRONE_OPEN=true
      - DRONE_HOST=http://xxx.xxx.xxx.xxx:80
      - DRONE_GITHUB=true
      - DRONE_GITHUB_URL=https://github.enterprise.hoge
      - DRONE_GITHUB_CLIENT=github_client_xxxxxx
      - DRONE_GITHUB_SECRET=github_secret_xxxxxx
      - DRONE_GITHUB_SCOPE=repo,repo:status,user:email,read:org
      - DRONE_GITHUB_PRIVATE_MODE=true
      - DRONE_GITHUB_MERGE_REF=true
      - DRONE_GITHUB_SKIP_VERIFY=true
      - DRONE_GITHUB_CONTEXT=continuous-integration/drone
      - DRONE_SECRET=secret_xxxxxx

  drone-agent:
    image: drone/drone:0.7
    command: agent
    restart: always
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_SERVER=ws://drone-server:8000/ws/broker
      - DRONE_SECRET=secret_xxxxxx

いくつかの設定項目について見ていきましょう。

DRONE_HOST

Drone が起動するサーバーの URL を設定します。GitHub 上で status が更新されない場合は、この項目の設定がうまくいっていないことが原因らしいです。自分の環境ではポート番号も入れないと error setting commit status というエラーが出て status が更新されませんでした。2

DRONE_GITHUB_URL

GitHub Enterprise の URL です。GitHub Enterprise をオンプレ環境で動かしているので設定が必要です。

DRONE_GITHUB_CLIENT

OAuth Application として GitHub に登録した時の Client ID を貼ります。

DRONE_GITHUB_SECRET

OAuth Application として GitHub に登録した時の Client Secret を貼ります。

DRONE_GITHUB_PRIVATE_MODE

GitHub Enterprise 上でリポジトリが private mode (ログインしないと public リポジトリも参照できない状態) で設定されている場合、この項目を true にしておく必要があります。

DRONE_SECRET

drone-serverdrone-agent が通信する際の認証に用いられる文字列です。サーバー側とエージェント側で同じ文字列を設定すれば良いですが、空文字列は認められないため注意が必要です。

実行

Drone が起動してしまえば、Web UI 上からビルドしたいリポジトリを設定し、 .drone.yml をリポジトリのルートに入れてプッシュすることで、自動的にビルドが走ります。 .drone.yml では幅広い設定が可能です。ファイル内のコメントでその一部をご紹介します。

# 各ジョブは pipeline 以下に入れます。
pipeline:
  # ジョブの名前は自由です。                 
  gradle-build:

    # ジョブ内で使用する Docker イメージを指定します。
    # ここでは Java のコンパイルを行うための openjdk を指定しています。
    image: openjdk

    # 実行するコマンドをリストで記述します。
    commands:
      - ./gradlew build
  
  # S3 にファイルをアップロードするジョブを作ります。
  deploy-s3:

    # AWS CLI をインストールするため python のインストールされたイメージを指定します。
    image: library/python:3.5

    # secrets の項で指定したキーに対応する値をジョブ内で使用することができます。
    # Web UI 上であらかじめ、 aws_access_key_id を Secret Name として、値を定義しておく必要があります。
    # aws_access_key_id として指定した値は環境変数 $AWS_ACCESS_KEY_ID としてジョブ内で使うことができます。
    # このように、指定したキーの名前を大文字にした環境変数として、あらかじめ設定した値を取り出すことができます。
    secrets: [aws_access_key_id, aws_secret_access_key]
    command:
      - pip install awscli

      # aws コマンドは $AWS_ACCESS_KEY_ID と $AWS_SECRET_ACCESS_KEY が設定されていると、それを認証情報として利用します。
      - aws s3 cp ./hoge.jar s3://hoge.hoge/deploy/hoge.jar

  # Slack に結果を通知するジョブを作ります。
  slack-notify:

    # Drone の Slack プラグインのイメージを使います。
    image: plugins/slack

    # 通知先の Web Hook を指定します。
    webhook: https://hooks.slack.com/services/XXXXX/XXXXXXXXXXXXXXXX

    # ユーザー名は自由に指定できます。
    username: drone

    # もちろんアイコンも自由です。寿司を好んで食べます。
    icon_emoji: ":sushi:"

    # デフォルトのメッセージでも十分ですが、メッセージを自由に設定できます。
    template: >
      <!channel>
      *{{build.status}}*
      <{{build.link}}|{{repo.owner}}/{{repo.name}}> ({{build.branch}}) by {{build.author}}
    
    # どのような場合にジョブを実行するかを指定します。
    # 前のジョブで失敗していた場合、基本的に後続のジョブは実行されませんが、このように指定することで失敗している場合でも実行されます。
    # ビルドが失敗していても Slack に通知してほしいのでこのように書きます。
    when:
      status: [ success, failure ]

Travis CI や CircleCI など使いやすい CI は色々とある一方で、オンプレ環境では Jenkins 一択という状態でしたが、Drone は簡単に設定できる上に十分な機能が揃っていて、まさに求めていたものでした。Jenkins のようになんでもできるわけではありませんが、機能を絞っているからこそ導入が簡単で、社内でも広めていけそうです。

Drone はまだ発展途上で、これからどんどん良くなっていくでしょう。知見を共有して、みんなで盛り上げていきましょう!

広告

RCO アドテク部では、継続的インテグレーションや、ソフトウェアテストなどに興味のあるエンジニアも募集しています。

採用ページ


  1. docs.drone.io は 0.6 以降向けに書かれていて、 readme.drone.io は 0.5 以前向けのようです。0.5 以前と 0.6 以降には互換性があまりないので気をつけましょう…… また、チャット形式で整理されていませんが、Gitter 上でも積極的に情報交換が行われています。ドキュメントに載っていない情報も見つかることがありますし、質問すると丁寧に応えてくれるので、ぜひ覗いてみてください。 [return]
  2. ソースコード を読む限りではポート番号を指定しているかどうかは関係ない気がするので、もしかしたら違う原因かもしれません。 [return]

TAGS :

#Docker