drone.io 1.0を使ってみる

# drone.io 1.0を使ってみる

githubのprivateレポジトリのCI/CDにdroneio0.8を利用していたのですが、1.0が出たということで移行できるか簡単に検証しました。
[Upgrading (Important)](https://docs.drone.io/releases/1.0.0-rc.1/#upgrading-important)を元に変更点を見つつ実際に動かします。
また、cronjobsというナイトリービルドを行うための機能が1.0では設定できるようなので、そちらも検証します。

## droneサーバ立ち上げまで
GitHub連携、Single Machineで立ち上げます (https://docs.drone.io/installation/github/single-machine/)。
OAuth Application作成手順はほぼ変わっていないので省略します。

注意点としては、サーバに与えるパラメータが大きく変わっているので、一から見直して設定する必要あります (https://docs.drone.io/reference/)。
以下がhttpかつ特定ユーザの利用に縛ったdocker-compose.ymlです。
`DRONE_USER_FILTER` で連携できるユーザまたはOrganizationを制限できます。

```yml
version: '3'
services:
  drone:
    image: drone/drone:1
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/drone:/data
    ports:
      - "80:80"
      - "443:443"
    environment:
      - DRONE_GITHUB_SERVER=https://github.com
      - DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID}
      - DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET}
      - DRONE_RUNNER_CAPACITY=2
      - DRONE_SERVER_HOST=${DRONE_SERVER_HOST}
      - DRONE_SERVER_PROTO=http
      - DRONE_USER_FILTER=${DRONE_USER_FILTER}
```

`docker-compose up -d` コマンドでサーバを起動すれば、GitHub連携ののちdroneのWebインタフェースが確認できます。
何か問題が起きた場合には、環境変数に `DRONE_LOGS_DEBUG=true` を与えて `docker-compose logs -f drone` でログを追えます。

成功するとリポジトリ一覧が表示され、アクティベーションすると次のようなフィード一覧が表示されます。

<img width="969" alt="repository.png" src="https://qiita-image-store.s3.amazonaws.com/0/146404/33790722-821b-a1be-9c92-0b0e88a00512.png">

## pipelineの記述

構文は[Migration from 0.8](https://docs.drone.io/user-guide/pipeline/migrating/)にも書いてあるとおり、一部変わっているので移行時には要注意です。
Railsプロジェクトの一例を載せておきます[drone-rails-example](https://github.com/mmhiyoko/drone-rails-example)。

```yml
kind: pipeline
name: default

steps:
- name: spec
  image: ruby:2.6.1
  environment:
    DATABASE_HOST: 'db'
    DATABASE_PORT: 3306
  commands:
    - bundle install
    - bundle exec rubocop -R -fs app spec
    - bundle exec rspec

- name: notify-slack
  image: plugins/slack
  settings:
    webhook:
      from_secret: webhook

services:
- name: db
  image: mysql:5.7
  environment:
    MYSQL_DATABASE: 'drone_example_test'
    MYSQL_USER: 'drone_example_test'
    MYSQL_PASSWORD: 'drone_example'
    MYSQL_RANDOM_ROOT_PASSWORD: true
    TZ: 'Asia/Tokyo'
```

Web UIも一新されているようで、きれいで見やすくなっています。

<img width="986" alt="commit.png" src="https://qiita-image-store.s3.amazonaws.com/0/146404/01ad881e-eee6-837f-afaf-886a68d3cfcf.png">

## cronjobs
1.0から新しく入った機能としてcronjobsが挙げられます。現時点ではドキュメント上に記載はないですが、設定を行うことは可能です。
次のようにjob名とどの程度の頻度でビルドを行うかを指定できます。
cronとついていますが、指定時刻での実行は現時点では仕様としてできないと言及されていました ([リンク](https://discourse.drone.io/t/how-to-use-cron-scheduling-in-drone-1-0-0-rc-1/2999))。

<img width="947" alt="cronjobs.png" src="https://qiita-image-store.s3.amazonaws.com/0/146404/a7527349-d32c-5828-aae1-ba4bbe972d39.png">

**注意**: 1時間に1度pipelineが実行されることを確認しましたが、上記の `.drone.yml` だと1時間に1度Slack通知が来てしまうのでconditionなどによる工夫が必要です。
現時点でstepのconditionにcronjobsを指定してexcludeする機能はないようなので、改善を待つしかなさそうです ([Issue](https://github.com/drone/drone/issues/2628))。

## 参考
- [Go製OSS CI/CDプラットフォーム drone 1.0.0-rc.1 の新機能・変更点](https://engineering.linecorp.com/ja/blog/go-oss-ci-cd-platform-drone-1-0-0-rc-1/)