Drone CI 基本設定 (.drone.yml)
Drone CI を使って CI/CD をおこなうには、リポジトリのトップレベルに .drone.yml という名前のファイルを作成する。
参考) 公式ドキュメント
実行内容の設定 (Pipeline)
ステップの設定
参考) Pipelines > Docker > Configuration > Steps
steps に実行手順を記述する。step ごとに指定した Docker イメージでコンテナが生成され、その上でコマンドが実行される。Docker イメージは基本的には Docker Hub から適当なものを選択する。適当なイメージが Docker Hub に存在しない場合は、別の Docker リポジトリと連携したり、その場で作成するなどする。
---
kind: pipeline
type: docker
name: default
steps:
- name: (任意の名前)
image: (Docker イメージ名)
command:
- (実行するコマンド)
ステップは記述した順に実行され、デフォルトでは失敗した場合は後続のステップは実行されない。失敗した場合も実行するには when で条件を記述する。
steps:
- name: ...
image: ...
when:
status: [ success, failure ]
トリガーの設定
何をトリガーに実行するかを指定する。
参考) Pipelines > Docker > Configuration > Triggers
例) master ブランチへの push/merge をトリガーに実行する場合
trigger:
branch:
- master
event:
- push
この場合すべての条件に一致する場合しか指定できないため、複数の組み合わせパターンを指定したい場合は、ref を使う。
例) master ブランチへの Push/Merge、Pull Request、タグづけをトリガーに実行する場合
trigger:
ref:
- refs/heads/master # master ブランチへの push/merge
- refs/pull/** # Pull Request
- refs/tags/** # タグ付け
それぞれ実行するステップを変更したい場合は、各ステップで同じように when で指定する。
例) タグづけ時のみステップを実行する場合
steps:
- name: タグづけ時のみ実行するステップ
image: ...
when:
event:
- tag
自作 Docker イメージの使用
ホストの Docker 上にイメージを作成し、それを使用する。
★ホスト上に生成するため、他リポジトリで生成するイメージとかぶらないイメージ名を指定すること。
-
イメージをビルドする Dockerfile を作成する。
-
.drone.yml にイメージをビルドする step を記述する。
steps:
- name: build-worker
image: docker
volumes: # ホストの Docker を使用するための設定
- name: docker.sock
path: /var/run/docker.sock
commands:
- docker build -f (Dockerfileのファイル名) -t (イメージ名) .
volumes: # ホストの Docker を使用するための設定
- name: docker.sock
host:
path: /var/run/docker.sock -
このイメージを使って実行する step で、作成したイメージと
pull: never
を記述する。- name: (任意の名前)
image: (作成したイメージ名)
pull: never
commands:
- (実行するコマンド)
キャッシュ
参考) Plugins | Drone > Drillsters > Volume Cache
以下の設定をすることで、指定したパスがホストの /tmp/(リポジトリ名)/(ブランチ名).tar に保存され、次回ビルド時に復元される。
steps:
- name: restore-cache
image: plugins/volume-cache
settings:
mount:
- (キャッシュするパス)
restore: true
volumes:
- name: cache
path: /cache
(実行する steps を記述)
- name: rebuild-cache
image: plugins/volume-cache
settings:
mount:
- (キャッシュするパス)
rebuild: true
volumes:
- name: cache
path: /cache
volumes: # キャッシュの保存先 (ホストの /tmp を指定)
- name: cache
host:
path: /tmp
Docker の実行 (Docker in Docker)
処理内で docker を実行したい場合、DinD コンテナを使用する。(ホストの Docker には影響しない)
steps:
- name: (任意の名前)
image: (Docker イメージ)
volumes:
- name: dockersock
path: /var/run
command:
- sleep 10 # Docker の準備完了を待つ (必要に応じて)
- (実行するコマンド)
services: # DinD コンテナを起動する設定
- name: docker
image: docker:dind
privileged: true
volumes:
- name: dockersock
path: /var/run
volumes: # DinD コンテナにつなぐ socket 用の volume
- name: dockersock
temp: {}
環境変数
定義済み変数の使用
ここに定義されている変数が使用できる。
暗号化した変数の使用
Encrypted を使用する方法。
Drone CLI を使って以下のコマンドを実行し、リポジトリ毎に暗号化した文字列を生成する。 事前に 対象リポジトリで Drone が有効になっている 必要あり。
$ drone encrypt (リポジトリ名) (平文)
(暗号化文字列)
Slack 通知先の Webhook URL を暗号化した例
steps:
- name: notify
image: plugins/slack
settings:
webhook:
from_secret: (変数名)
---
kind: secret
name: (変数名)
data: (暗号化文字列)
Slack への通知
参考 Plugins | Drone > Drone-plugins > Slack
Slack で Webhook URL を作成しておく。(作成済みの場合は設定から Webhook URL を確認する。)
- Slack > Slack をカスタマイズ > App管理 > カスタムインテグレーション > Incoming Webhook > 設定を追加
- 通知先チャンネルを指定: #droneci
作成した URL を Secrets に登録し、プラグインに指定する。
steps:
- name: notify
image: plugins/slack
settings:
webhook:
from_secret: slack_webhook
when:
status: [ success, failure ]
メッセージを変更したい場合は template で指定する。
settings:
template: |-
*{{build.status}}* <{{build.link}}|{{repo.owner}}/{{repo.name}}#{{truncate build.commit 8}}> ({{build.branch}}) by {{build.author}}