Drone 1.0 Release Candidateが出ました

この記事は [リクルートライフスタイル Advent Calendar 2018](https://qiita.com/advent-calendar/2018/recruitlifestyle) の3日目の記事です。

# はじめに

新規サービスの開発を行なっている @akechi です。
現在行なっているサービスの開発では、CI/CDツールにDroneを採用しています。
先月 1.0 Release Candidateがアナウンスされたので、どういったバージョンアップなのか追ってみました。

# アップグレード時の注意事項

0.8から1.0への自動アップグレードはできません。
データベースに互換性のない変更があるため、アップグレードにはマイグレーションユーティリティが必要になります。
このユーティリティは11月16日までに用意するよという記述がドキュメントにありますが、まだないようです。

# 注目機能

## YAMLフォーマットの大幅な機能強化

パイプラインのシンタックスは、1.0で大きく変わっています。
新しいシンタックスは、Kubernetesにインスパイアーされたものになっています。
Droneコミュニティの大部分がKubernetesをすでに採用しており、よく知られていることが理由みたいです。（わたしもその１人です）

古いフォーマット

```YAML:.drone.yml
pipeline:
  build:
    image: golang
    commands:
    - go build
    - go test

services:
  redis:
    image: redis:latest
```

新しいフォーマット

```YAML:.drone.yml
kind: pipeline
name: default

steps:
- name: build
  image: golang
  commands:
  - go build
  - go test

services:
- name: redis
  image: redis:latest
```

## Multi-Machineパイプライン

ビルド時間を減らすために、複数のマシーンにビルドタスクを分散したい時に便利な機能です。
Multi-Machineパイプラインは、複数のYAMLドキュメントで設定します。
下記は２つの並列パイプラインを実行する例です。
ビルドステータスは、両方のパイプラインの結果で決まります。

```YAML:.drone.yml
kind: pipeline
name: frontend

steps:
- name: build
  image: node
  commands:
  - npm install
  - npm test

---
kind: pipeline
name: backend

steps:
- name: build
  image: golang
  commands:
  - go build
  - go test

services:
- name: redis
  image: redis
```

## Multi-Platformパイプライン

複数のOSやアーキテクチャでビルドやテストが必要な時に便利な機能です。
１つのパイプラインはLinux/ARMで実行されて、もう１つのパイプラインはLinux/AMD64で実行される例です。

```YAML:.drone.yml
kind: pipeline
name: amd

platform:
  os: linux
  arch: amd64

steps:
- name: build
  image: golang
  commands:
  - go build
  - go test

---
kind: pipeline
name: arm64

platform:
  os: linux
  arch: arm64

steps:
- name: build
  image: golang
  commands:
  - go build
  - go test
```

## 署名付きYAMLファイル

信頼性を検証したり勝手に書き換えられることを防ぐために、YAMLファイルに署名することができます。
これはパブリックリポジトリで承認されていない変更を防ぐために特に便利な機能です。
もしユーザが変更して署名の検証に失敗すると、パイプラインは承認されるまでペンディングになります。
署名はYAMLファイルに`signature`リソースとして記述します。

```YAML:.drone.yml
---
kind: pipeline
name: default

steps:
- name: build
  image: golang
  commands:
  - go build
  - go test

---
kind: signature
hmac: F10E2821BBBEA527EA02200352313BC059445190
```

## Jsonnetによる設定

Jsonnetファイルで動的にYAMLファイルを生成する機能です。
例えば、Rubyの複数バージョンでテストを実行したい時に使えます。

```YAML:.drone.yml
---
kind: pipeline
name: ruby-2-4

steps:
- name: test
  image: ruby:2.4
  commands:
  - bundle install --jobs=3 --retry=3
  - rake

---
kind: pipeline
name: ruby-2-3

steps:
- name: test
  image: ruby:2.3
  commands:
  - bundle install --jobs=3 --retry=3
  - rake
```

.jsonnetで書くと以下のようになります。

```.jsonnet
local Pipeline(name, image) = {
  kind: "pipeline",
  name: name,
  steps: [
    {
      name: "test",
      image: image,
      commands: [
        "bundle install --jobs=3 --retry=3",
        "rake"
      ]
    }
  ]
};

[
  Pipeline("ruby23", "ruby:2.3"),
  Pipeline("ruby24", "ruby:2.4"),
]
```

## ネイティブサポート

エージェントを複数のOSとアーキテクチャにインストールできます。

- Linux AMD64
- Linux ARM
- Linux ARM64
- Windows 1803

## ユーザインターフェースの改装

![drone_1_screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/104431/a4744798-960d-53f2-7c1a-3e2824915f49.png)

## その他

- cronジョブによるスケジューリング
- `drone fmt`コマンド
- [Matrix](https://0-8-0.docs.drone.io/matrix-builds/) の非推奨

# まとめ

Drone 1.0 Release Candidateの機能を見てきました。
バージョンが1.0になったことで、今まで欲しいなと思っていた機能が着実に追加されてきています。
現在は0.8を使っているので、GAになったら本格的にアップグレードしたいなと思っています。