drone.io 1.0を使ってみる
githubのprivateレポジトリのCI/CDにdroneio0.8を利用していたのですが、1.0が出たということで移行できるか簡単に検証しました。
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を制限できます。
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
でログを追えます。
成功するとリポジトリ一覧が表示され、アクティベーションすると次のようなフィード一覧が表示されます。
pipelineの記述
構文はMigration from 0.8にも書いてあるとおり、一部変わっているので移行時には要注意です。
Railsプロジェクトの一例を載せておきますdrone-rails-example。
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も一新されているようで、きれいで見やすくなっています。
cronjobs
1.0から新しく入った機能としてcronjobsが挙げられます。現時点ではドキュメント上に記載はないですが、設定を行うことは可能です。
次のようにjob名とどの程度の頻度でビルドを行うかを指定できます。
cronとついていますが、指定時刻での実行は現時点では仕様としてできないと言及されていました (リンク)。
注意: 1時間に1度pipelineが実行されることを確認しましたが、上記の .drone.yml
だと1時間に1度Slack通知が来てしまうのでconditionなどによる工夫が必要です。
現時点でstepのconditionにcronjobsを指定してexcludeする機能はないようなので、改善を待つしかなさそうです (Issue)。