Skip to main content

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 上にイメージを作成し、それを使用する。

★ホスト上に生成するため、他リポジトリで生成するイメージとかぶらないイメージ名を指定すること。

  1. イメージをビルドする Dockerfile を作成する。

  2. .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
  3. このイメージを使って実行する 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 には影響しない)

参考: Docker (dind) | Drone

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: {}

環境変数

定義済み変数の使用

参考) Environment > Reference

ここに定義されている変数が使用できる。

暗号化した変数の使用

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 を確認する。)

  1. Slack > Slack をカスタマイズ > App管理 > カスタムインテグレーション > Incoming Webhook > 設定を追加
  2. 通知先チャンネルを指定: #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}}

その他