Drone CI 基本設定 (.drone.yml)

参考) 公式ドキュメント

実行内容の設定 (Pipeline)

ステップの設定

参考) Pipelines > Docker > Configuration > Steps

steps に実行する順番で手順を記述する。step ごとに指定した Docker イメージからコンテナの上でコマンドが実行される。Docker イメージは基本的には Docker Hub から適当なものを選択する。

---
kind: pipeline
type: docker
name: default

steps:
  - name: (任意の名前)
    image: (Docker イメージ名)
    command:
      - (実行するコマンド)

適当なイメージが Docker Hub に存在しない場合、別の Docker リポジトリと連携したり、その場で作成するなどの対処が必要。

トリガーの設定

参考) Pipelines > Docker > Configuration > Triggers

トリガーとするブランチやイベントを branch, event でも指定できるが、これらは AND となるので細かい指定をする場合は refs を使う。

例) プルリク、タグづけ、および master ブランチへの Push/Merge をトリガーに実行する場合。

trigger:
  ref:
    - refs/heads/master     # master ブランチへの push/merge
    - refs/pull/**          # Pull Request
    - refs/tags/**          # タグ付け

自作 Docker イメージの使用

ホストの Docker 上にイメージを作成し、それを使用する。

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

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

  2. .drone.yml にイメージをビルドする step を記述する。

    ```yaml 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 を記述する。

    yaml - 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:19-dind 以降では TLS を無効にするため DOCKER_TLS_CERTDIR: "" を指定する必要がある。(参考)

steps:
  - name: (任意の名前)
    image: (Docker イメージ)
    environment:                    # DinD コンテナの Docker を使用する設定
      DOCKER_HOST: tcp://docker:2375
    command:
      - (実行するコマンド)

services:                           # DinD コンテナを起動する設定
  - name: docker
    image: docker:dind
    privileged: true
    environment:
      DOCKER_TLS_CERTDIR: ""

環境変数

定義済み変数の使用

参考) Environment > Reference

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

暗号化した変数の使用

Encrypted を使用する方法。

Drone CLI を使って以下のコマンドを実行し、リポジトリ毎に暗号化した文字列を生成する。

$ 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
steps:
  - name: notify
    image: plugins/slack
    settings:
      webhook: https://hooks.slack.com/services/XXXXXXXXX
    when:
      status: [success, failure]