Drone 1.6.2を使う

# このメモについて

* CI/CDツールとしてOSS版 [Drone](https://drone.io/) を使う時のメモ。
* 連携させるSCM(Software Configuration Management)ツールとして [Gitea](https://gitea.io/en-us/) を使用。
* docker-composeにより、gitea, drone, registryを連携させ、簡単なパイプラインが走ることまで確認したい
 * 同じインスタンスにGiteaとDroneを同居させた場合、Droneのサポートはできないと明記されているが、今回は使い方の学習のため特に気にせず同じインスタンスに入れる構成にする
* HTTPの例のほうが多いので、HTTPSで使う時の例として記載したい。
* いろいろ記事が出ているので新しい情報は特にないかもしれないが、実例の1つとして書いておこうと思う。

# 環境

[前の記事](https://qiita.com/niiku-y/items/27c0f5fd2807d8cfc137) の構成にdrone , [registry](https://hub.docker.com/_/registry) を追加する。

* ホストOS : ubuntu 18.04
 * この上でdocker engineを起動
 * 動作確認も [ubuntu](https://ubuntu.com/) 上で [firefox](https://www.mozilla.org/ja/firefox/) 70.0.1 (64bit) により実施
* docker
 * docker 19.03.5
 * docker-compose 1.24.1 
* SCM
 * gitea 1.10
  * バックエンドのDBは mysql 5.7
* registry
 * registry 2.7
* CI/CD
 * [Drone](https://drone.io/) 1.6.2

# 準備

droneサーバへのHTTPS接続で使用する証明書、鍵ファイルは生成しておく。
後述するが、今回はgitea, droneサーバともに自己署名証明書のため、droneを使うときのverifyはoffにすることになる。

```
$ pwd
/home/hoge/work-drone
$ ls certs/
drone_server.gitea_nw.crt  drone_server.gitea_nw.key  gitea.gitea_nw.csr
drone_server.gitea_nw.csr  gitea.gitea_nw.crt         gitea.gitea_nw.key
$ 
```

# docker-compose.yaml

以下のようなYAMLファイルで各コンテナを起動する。
droneのサーバとrunnerは、giteaでOAuthの設定をしないと完全には設定できないので、現時点ではこれでよい。

* DRONE_USER_CREATEで管理者権限のユーザを作成しておかないと後で困るので、ここで指定して作成する。
* 環境変数で指定しているFQDN, portは、コンテナ同志の通信のためコンテナのネットワーク内で使っているものを使用する。ホスト側のポート番号などと間違えない。
* drone serverのhttps, httpのポートおよびgiteaのhttpsのポートは、ホスト側とコンテナ側で変えてもよいが、アクセス元の場所によりポート指定を意識する必要があるのは面倒なため、今回はそろえる。
* 自己署名証明書のためDRONE_GITEA_SKIP_VERIFY、DRONE_RPC_SKIP_VERIFYを忘れない。
* CI/Cd pipelineで使うdockerネットワークを、DRONE_RUNNER_NETWORKSに指定するのを忘れないこと。忘れるとgit cloneなどで失敗する
* DRONE_RUNNER_VOLUMESにgiteaのCRTファイルをマウントしておく。CI/CDタスクを実行するコンテナ内のgit cloneで必要。
* runnerのUIのログインユーザ、パスワードも設定しておく

```
$ cat docker-compose.yml 
# docker-compose.yml
# for drone
version: "3.5"

networks:
  gitea_nw:
    external: false
    name: gitea_nw

volumes:
  gitea_web_volume:
    driver: local
  gitea_db_volume:
    driver: local

services:
  gitea:
    image: gitea/gitea:1.10.0
    container_name: gitea
    hostname: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - DB_TYPE=mysql
      - DB_HOST=gitea_db:3306
      - DB_NAME=gitea
      - DB_USER=gitea
      - DB_PASSWD=gitea
    restart: always
    networks:
      - gitea_nw
    volumes:
      - gitea_web_volume:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
      - /home/hoge/work-drone/certs/gitea.gitea_nw.crt:/usr/share/ca-certificates/gitea.gitea_nw.crt
      - /home/hoge/work-drone/certs/gitea.gitea_nw.key:/etc/ssl/private/gitea.gitea_nw.key
      - /home/hoge/work-drone/certs/drone_server.gitea_nw.crt:/usr/share/ca-certificates/drone_server.gitea_nw.crt
    ports:
      - "13000:13000"
      - "10122:22"
    depends_on:
      - gitea_db

  gitea_db:
    image: mysql:5.7
    container_name: gitea_db
    hostname: gitea_db
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=gitea
      - MYSQL_USER=gitea
      - MYSQL_PASSWORD=gitea
      - MYSQL_DATABASE=gitea
    networks:
      - gitea_nw
    volumes:
      - gitea_db_volume:/var/lib/mysql

  registry:
    image: registry:2.7
    container_name: registry
    hostname: registry
    restart: always
    networks:
      - gitea_nw
    volumes:
      - /home/hoge/work-drone/certs:/certs
      - /home/hoge/work-drone/auth:/auth
      - /home/hoge/work-drone/registry-config.yml:/etc/docker/registry/config.yml
    ports:
      - "8443:443"

  drone_server:
    image: drone/drone:1.6.2
    container_name: drone_server
    hostname: drone_server
    restart: always
    environment:
      - DRONE_AGENTS_ENABLED=true
      - DRONE_GITEA_SERVER=https://gitea.gitea_nw:13000 
      - DRONE_GITEA_CLIENT_ID=
      - DRONE_GITEA_CLIENT_SECRET=
      - DRONE_RPC_SECRET=
      - DRONE_SERVER_HOST=drone_server.gitea_nw:443
      - DRONE_SERVER_PROTO=https
      - DRONE_USER_CREATE=username:droneadmin,admin:true
      - DRONE_TLS_CERT=/usr/share/ca-certificates/drone_server.gitea_nw.crt
      - DRONE_TLS_KEY=/etc/ssl/private/drone_server.gitea_nw.key
      - DRONE_GITEA_SKIP_VERIFY=true
    networks:
      - gitea_nw
    volumes:
      - /var/lib/drone:/data
      - /home/hoge/work-drone/certs/gitea.gitea_nw.crt:/usr/share/ca-certificates/gitea.gitea_nw.crt
      - /home/hoge/work-drone/certs/drone_server.gitea_nw.crt:/usr/share/ca-certificates/drone_server.gitea_nw.crt
      - /home/hoge/work-drone/certs/drone_server.gitea_nw.key:/etc/ssl/private/drone_server.gitea_nw.key
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - gitea

  drone_runner:
    image: drone/drone-runner-docker:1.0.1
    container_name: drone_runner
    hostname: drone_runner
    restart: always
    environment:
      - DRONE_RPC_PROTO=https
      - DRONE_RPC_HOST=drone_server.gitea_nw:443
      - DRONE_RPC_SECRET=
      - DRONE_RUNNER_CAPACITY=2
      - DRONE_RUNNER_NAME=drone_runner.gitea_nw
      - DRONE_RUNNER_NETWORKS=gitea_nw
      - DRONE_RUNNER_VOLUMES=/home/hoge/work-drone/certs/gitea.gitea_nw.crt:/usr/share/ca-certificates/gitea.gitea_nw.crt
      - DRONE_TLS_CERT=/usr/share/ca-certificates/drone_server.gitea_nw.crt
      - DRONE_TLS_KEY=/etc/ssl/private/drone_server.gitea_nw.key
      - DRONE_RPC_SKIP_VERIFY=true
      - DRONE_UI_USERNAME=root
      - DRONE_UI_PASSWORD=root
    networks:
      - gitea_nw
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /home/hoge/work-drone/certs/drone_server.gitea_nw.crt:/usr/share/ca-certificates/drone_server.gitea_nw.crt
      - /home/hoge/work-drone/certs/drone_server.gitea_nw.key:/etc/ssl/private/drone_server.gitea_nw.key
    ports:
      - "3000:3000"
    depends_on:
      - drone_server

# end
$ 
```

# 初回起動

起動後、ログを確認する。runner以外でエラーがなくなるようにする。
runnerはこのあとSECRETの設定をできるようになってから再度確認する。

giteaのHTTPS設定については [前回の記事](https://qiita.com/niiku-y/items/27c0f5fd2807d8cfc137) を参照だが、webhook時に自己署名証明書を使うのでapp.iniで以下をさらに追加する必要がある。

```
[webhook]
SKIP_TLS_VERIFY = true
```

以下のように、docker-composeにより各コンテナを起動、ログ確認する。

```
$ sudo docker-compose up -d
$ sudo docker-compose ps
$ sudo docker-compose logs registry
$ sudo docker-compose logs gitea_db
$ sudo docker-compose logs gitea
$ sudo docker-compose logs drone_server
```

# GiteaでのOAuth設定

* ブラウザから自分のアカウントでGiteaにログイン
 * https://192.168.137.2:13000/
 * /etc/hostsにgitea.gitea_nwの名前を登録しておいて https://gitea.gitea_nw:13000/ でアクセスでもよい
* 右上のアカウントメニューから「Settings」選択
* 上から二段目に設定項目として、Profile, Account, Security, Applications, SSH/GPG keys, Organizations, Repositoriesと並んでいるので、これらのうち「Applications」選択
* 「Applications」の設定で、「Manage OAuth2 Applications」にてdroneとの連携を設定する。
 * Application Nameを drone_server にする
 * Redirect URIを https://drone_server.gitea_nw:443/login にする。コンテナ同志の通信なのでコンテナ側のポート番号, FQDNを指定。
 * 「Create Application」押下。Client IDとclient Secretが生成されるのでメモしてからSaveボタン押下
* giteaでdroneadminユーザ作成
 * drone管理者用のユーザ
* あと、DRONE_RPC_SECRETとして文字列（openssl rand -hex 16の結果など）を決めておく。以下はメモったものの例。

```
Client ID = e773ad59-8f5d-4650-a48e-e4bc674dbed5
Client Secret = WweOBkx4QDTDmU6rKPSOWaIf5qw2AVGsJqcuXK6ZRhg=

DRONE_RPC_SECRET = d2e5715c07f2a9e025613180c0e3d2dc

```

# droneへのOAuth設定、再起動

drone_runner, drone_serverを止めてからdocker-compose.ymlでOAuth設定を追記。
IDやSECRETは環境ごとで違うのであくまで例である

IDやSECRETはダブルクォートで囲むと正しく認識されないようなので、囲まないようにしている。

```
$ sudo docker-compose down
$ cp docker-compose.yml old/docker-compose.yml.OLD
$ vi docker-compose.yml
$ diff docker-compose.yml old/docker-compose.yml.2
82,84c82,84
<       - DRONE_GITEA_CLIENT_ID=e773ad59-8f5d-4650-a48e-e4bc674dbed5
<       - DRONE_GITEA_CLIENT_SECRET=WweOBkx4QDTDmU6rKPSOWaIf5qw2AVGsJqcuXK6ZRhg=
<       - DRONE_RPC_SECRET=d2e5715c07f2a9e025613180c0e3d2dc
---
>       - DRONE_GITEA_CLIENT_ID=
>       - DRONE_GITEA_CLIENT_SECRET=
>       - DRONE_RPC_SECRET=
111c111
<       - DRONE_RPC_SECRET=d2e5715c07f2a9e025613180c0e3d2dc
---
>       - DRONE_RPC_SECRET=
$ sudo docker-compose up -d
```

自己署名証明書の場合、docker-compose.ymlでDRONE_RPC_SKIP_VERIFY=trueを指定しなかった場合（デフォルトはfalse）、
以下のように証明書のverfityでエラーになり、runnerが起動できない。

```
$ sudo docker-compose logs drone_runner
Attaching to drone_runner
drone_runner    | time="2019-11-23T06:25:01Z" level=info msg="starting the server" addr=":3000"
drone_runner    | time="2019-11-23T06:25:01Z" level=error msg="cannot ping the remote server" error="Post https://drone_server.gitea_nw:443/rpc/v2/ping: x509: certificate signed by unknown authority"
・・・
```

drone_serverはDRONE_GITEA_SKIP_VERIFYがなくても起動自体はできるものの、drone_serverからgiteaに通信したタイミングで同様のエラーが出るので、OAuth後にホストから意図した画面が見れない。

ということで、自己署名証明書の場合はdrone_serverではDRONE_GITEA_SKIP_VERIFY=true , drone_runnerではDRONE_RPC_SKIP_VERIFY=trueが要る。
また、giteaのapp.iniで、webhookセクションを追加し「SKIP_TLS_VERIFY = true」を記載する必要がある。

もちろん、本来はverifyは飛ばさず、かつ、きちんとした認証局が署名した証明書を使うべきである。

さて、ここまでで、全コンテナの起動まではできているはずである。


# drone-cliのインストール

パイプラインを走らせる前に、droneの管理コマンドとして [drone/drone-cli](https://github.com/drone/drone-cli/) から、droneコマンドをダウンロードしてインストールする。
これは後ほど、信頼できるリポジトリの登録などドローンの管理作業が必要なときに使う。

```
$ curl -L https://github.com/drone/drone-cli/releases/latest/download/drone_linux_amd64.tar.gz | tar zx
$ ls -l drone
$ sudo install -t /usr/local/bin drone
$ which drone
/usr/local/bin/drone
$
$ drone --version
drone version 1.2.0
$ 
```


# dockerホスト側の準備

ホストからgitea, droneにアクセスするための準備をする。

## 名前解決

ホスト側からブラウザでgitea, droneサーバにアクセスするので名前解決できるようしておく

```
$ cat /etc/hosts
127.0.0.1	localhost
127.0.1.1	ubu1804
192.168.137.2	ubu1804.local gitea.gitea_nw drone_server.gitea_nw

```

## 証明書の登録

ホスト側でTLS通信のためgiteaとdroneの証明書を登録しておく。以下はdroneのときの例。

```
$ ls
drone_server.gitea_nw.crt  drone_server.gitea_nw.key  gitea.gitea_nw.csr
drone_server.gitea_nw.csr  gitea.gitea_nw.crt         gitea.gitea_nw.key
$ sudo cp drone_server.gitea_nw.crt /usr/share/ca-certificates/
$ sudo vi /etc/ca-certificates.conf
　→　末尾に1行、「drone_server.gitea_nw.crt」を追記
$ sudo update-ca-certificates 
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
#
```

# giteaでリポジトリ作成

Giteaでリポジトリを作成する。gitea.gitea_nw:13000にhttpsアクセスしGUIで
リポジトリ自体を作成（ここではtest1という名前で作った）。

アプリケーションは何でもよいが、ここではシンプルにコマンドを実行するような
アプリケーションを想定してhello.cをコミット。

```
$ cat hello.c 
#include <stdio.h>

int main() {
    printf("hello, world\n");
    return 0;
}
$
```

git cloneを実行するサーバでもgit実行前にgiteaのCRTファイルの登録が済か
くらいは確認しておく。
またgit config -lでuser.email, user.nameが設定済であることくらいは確認しておく。
この記事ではgitの使い方詳細には特に立ち入らない。


# droneサーバへのアクセス

dockerホストからブラウザでdrone_server.gitea_nw:443にhttpsでアクセス。

giteaからdroneの認可について確認があるので承認しよう。
（注：画像ではポート番号が443ではない。こんな画面が出る、という程度で見てほしい）

![oauth1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318326/66f2ba24-be17-8a40-cbe5-b047598fc276.png)

アクセスに成功すればdroneの画面をみれる。
CI/CDできるよう、リポジトリをACTIVATEしておこう。

![drone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318326/8962e64b-7de6-1a45-a433-b0b7dd5b71d3.png)

うまくいってない場合、drone_serverからgiteaを参照できるように名前や証明書の設定が済か確認しておく。
その際の確認ポイントとしては以下のあたり。

* docker-compose.ymlのservice名、network名
* hostsまたはDNSのFQDN
* ポート番号。
 * giteaとdroneでは、ホスト側・コンテナ側でポートをそろえておいたほうが楽。
 * giteaのリポジトリの設定でwebhookのURLにポート番号が入っている場合は正しい番号か確認する。後述。
* CRTファイルの有無、ファイルパス、証明書の登録
* 自己署名証明書の場合、docker-compose.ymlのdroneサーバ側 DRONE_GITEA_SKIP_VERIFY , runner側 DRONE_RPC_SKIP_VERIFY

ポート番号については、OAuthで使うリダイレクト先のURLでポート番号を変えた場合は、以下のwebhook設定のポート番号も忘れず変更しておく。

![webhook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318326/048fb086-730a-89fe-b3fe-348866268cb5.png)

通信に失敗しているようであれば、「docker-compose logs 該当ノード」のログから、該当ノードから出たエラーか対向から出たエラーかを考えて、yamlとログみて原因がすぐにわからなそうな場合は「docker-compose exec 該当ノード シェル」でコンテナに入ってみて調査しよう。

最終的にdocker-compose.ymlは以下のようになった。

```
# docker-compose.yml
# for drone
version: "3.5"

networks:
  gitea_nw:
    external: false
    name: gitea_nw

volumes:
  gitea_web_volume:
    driver: local
  gitea_db_volume:
    driver: local

services:
  gitea:
    image: gitea/gitea:1.10.0
    container_name: gitea
    hostname: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - DB_TYPE=mysql
      - DB_HOST=gitea_db:3306
      - DB_NAME=gitea
      - DB_USER=gitea
      - DB_PASSWD=gitea
    restart: always
    networks:
      - gitea_nw
    volumes:
      - gitea_web_volume:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
      - /home/hoge/work-drone/certs/gitea.gitea_nw.crt:/usr/share/ca-certificates/gitea.gitea_nw.crt
      - /home/hoge/work-drone/certs/gitea.gitea_nw.key:/etc/ssl/private/gitea.gitea_nw.key
      - /home/hoge/work-drone/certs/drone_server.gitea_nw.crt:/usr/share/ca-certificates/drone_server.gitea_nw.crt
    ports:
      - "13000:13000"
      - "10122:22"
    depends_on:
      - gitea_db

  gitea_db:
    image: mysql:5.7
    container_name: gitea_db
    hostname: gitea_db
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=gitea
      - MYSQL_USER=gitea
      - MYSQL_PASSWORD=gitea
      - MYSQL_DATABASE=gitea
    networks:
      - gitea_nw
    volumes:
      - gitea_db_volume:/var/lib/mysql

  registry:
    image: registry:2.7
    container_name: registry
    hostname: registry
    restart: always
    networks:
      - gitea_nw
    volumes:
      - /home/hoge/work-drone/certs:/certs
      - /home/hoge/work-drone/auth:/auth
      - /home/hoge/work-drone/registry-config.yml:/etc/docker/registry/config.yml
    ports:
      - "8443:443"

  drone_server:
    image: drone/drone:1.6.2
    container_name: drone_server
    hostname: drone_server
    restart: always
    environment:
      - DRONE_AGENTS_ENABLED=true
      - DRONE_GITEA_SERVER=https://gitea.gitea_nw:13000 
      - DRONE_GITEA_CLIENT_ID=e773ad59-8f5d-4650-a48e-e4bc674dbed5
      - DRONE_GITEA_CLIENT_SECRET=WweOBkx4QDTDmU6rKPSOWaIf5qw2AVGsJqcuXK6ZRhg=
      - DRONE_RPC_SECRET=d2e5715c07f2a9e025613180c0e3d2dc
      - DRONE_SERVER_HOST=drone_server.gitea_nw:443
      - DRONE_SERVER_PROTO=https
      - DRONE_USER_CREATE=username:droneadmin,admin:true
      - DRONE_TLS_CERT=/usr/share/ca-certificates/drone_server.gitea_nw.crt
      - DRONE_TLS_KEY=/etc/ssl/private/drone_server.gitea_nw.key
      - DRONE_GITEA_SKIP_VERIFY=true
    networks:
      - gitea_nw
    volumes:
      - /var/lib/drone:/data
      - /home/hoge/work-drone/certs/gitea.gitea_nw.crt:/usr/share/ca-certificates/gitea.gitea_nw.crt
      - /home/hoge/work-drone/certs/drone_server.gitea_nw.crt:/usr/share/ca-certificates/drone_server.gitea_nw.crt
      - /home/hoge/work-drone/certs/drone_server.gitea_nw.key:/etc/ssl/private/drone_server.gitea_nw.key
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - gitea

  drone_runner:
    image: drone/drone-runner-docker:1.0.1
    container_name: drone_runner
    hostname: drone_runner
    restart: always
    environment:
      - DRONE_RPC_PROTO=https
      - DRONE_RPC_HOST=drone_server.gitea_nw:443
      - DRONE_RPC_SECRET=d2e5715c07f2a9e025613180c0e3d2dc
      - DRONE_RUNNER_CAPACITY=2
      - DRONE_RUNNER_NAME=drone_runner.gitea_nw
      - DRONE_RUNNER_NETWORKS=gitea_nw
      - DRONE_RUNNER_VOLUMES=/home/hoge/work-drone/certs/gitea.gitea_nw.crt:/usr/share/ca-certificates/gitea.gitea_nw.crt
      - DRONE_TLS_CERT=/usr/share/ca-certificates/drone_server.gitea_nw.crt
      - DRONE_TLS_KEY=/etc/ssl/private/drone_server.gitea_nw.key
      - DRONE_RPC_SKIP_VERIFY=true
      - DRONE_UI_USERNAME=root
      - DRONE_UI_PASSWORD=root
    networks:
      - gitea_nw
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /home/hoge/work-drone/certs/drone_server.gitea_nw.crt:/usr/share/ca-certificates/drone_server.gitea_nw.crt
      - /home/hoge/work-drone/certs/drone_server.gitea_nw.key:/etc/ssl/private/drone_server.gitea_nw.key
    ports:
      - "3000:3000"
    depends_on:
      - drone_server

# end

```


# 信頼済リポジトリとしての登録

droneのyamlでprivileged: trueを使えるようにするため、droneに信頼できるリポジトリとして上記で作成したリポジトリを登録する。

droneコマンドで登録するが、その前にdrone管理ユーザでdrone画面にログインし、画面の右上メニューからuser settingsにいき、管理ユーザのtokenを確認して使う必要がある。
（信頼できるリポジトリの登録は、一般権限のユーザだと設定反映できない。また一般ユーザへの管理権限付与も管理ユーザでないとできない。）

トークンを確認のため、giteaにdroneadminユーザでログインし https://drone_server.gitea_nw:443/ にアクセスする。
以下の画面は一般ユーザでログインしたときのものだが、画面右上隅のほうでクリックすると「User Settings」というメニューが出てくる。
（画像ではポート番号が違うが、こんな画面が出てくる、程度でとらえてほしい）

![userset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318326/9fb299a9-657c-9050-930e-b7d06c10ebce.png)

このUser Settings画面に、droneの各ユーザのトークンが表示される。

![usertoken.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318326/35943d67-d0f8-b4c0-ea81-e988f8b89698.png)

これをDRONE_SERVER環境変数にdroneのURL、DRONE_TOKEN環境変数に上記のトークンを指定して、droneコマンドを実行することで、各種サーバ管理を実施できるので、これを使ってtest1リポジトリを信頼済リポジトリとして登録する。

```
$ cat update_repo.sh
#!/bin/bash
export DRONE_SERVER=https://drone_server.gitea_nw:443
## token (droneadmin)
export DRONE_TOKEN=xxxxx
export REPO=

echo "update ---"
drone repo update --trusted=true $REPO

echo ""
echo "list ---"
drone repo ls

echo ""
echo "info ---"
drone repo info $REPO
$ ./update_repo.sh 
update ---
Successfully updated repository niiku-y/test1

list ---
droneadmin/test0

info ---
Owner: niiku-y
Repo: test1
Config: .drone.yml
Visibility: public
Private: false
Trusted: true
Protected: false
Remote: https://gitea.gitea_nw:13000/niiku-y/test1.git

$
```

なお、droneコマンドの使い方は [CLI Reference](https://docs.drone.io/cli/) 参照。


# パイプラインの作成

リポジトリにて、アプリケーションを作成し（ここではhello.cとする）、それをコンテナ上で実行するパイプラインのyamlを作成する。
アプリケーションはサンプルなのでなんでもよいが、上記で作成したtest1リポジトリのコマンドをコンパイル、実行するパイプラインを作成してみた。

privileged: trueを指定しないとaptが実行できないので指定する。
このprivilegedは信頼済リポジトリでないと機能しないので、上記「信頼済リポジトリとしての登録」を実行しておくこと。

```
★このyamlはすぐあとで変更する
$ cat .drone.yml
kind: pipeline
type: docker
name: default

steps:
- name: build
  image: ubuntu:18.04
  privileged: true
  commands:
    - apt update
    - apt install -y gcc
    - gcc -o hello ./hello.c
    - chmod +x ./hello
    - ./hello
 
$ cat hello.c
#include <stdio.h>

int main() {
    printf("hello, world.\n");
    return 0;
}
$
```

ここまでの設定で、リポジトリtest1内のソースを変更したり、何かファイルを追加したりすれば、CI/CDが走るようにはなっている。

# CI/CDタスクを実行するコンテナ内でのgit clone設定

これであとはソースやyamlを更新すればCI/CDしていけるはずだが、このままだとダメで、もうちょい続きがある。

ここまでの設定だと、CI/CDの最初にcloneするところのTLSでエラーになるので、pipelineのCI/CDタスクを実行するコンテナに対し、これへの対処がいる。
最終的に.drone.ymlは以下のようにする必要がある。

* /drone/srcに移動してgit cloneする仕様なのだが、まずsslVerifyを無効にして自己署名証明書のときのTLSエラーを回避するカスタマイズしたcloneを実行する。
 * そのため、デフォルトのcloneはdisableにする
* 私の端末特有だが、時間がずれ過ぎているためapt updateでエラーが出ていたので、はじめに時刻合わせしてからパッケージ更新するようにした
* build時の作業ディレクトリは、はじめ/drone/srcなので、cloneしてきたtest1のディレクトリに移動してからコンパイルする必要があった
* docker-compose.ymlでDRONE_RUNNER_VOLUMESを設定している。これによりCRTファイルをCI/CDタスクを実行するコンテナ内にマウント、配置できる。

```
$ cat .drone.yml 
kind: pipeline
type: docker
name: default

clone:
  disable: true
  
steps:
- name: clone
  image: drone/git
  commands:
    - git config --global http.sslVerify false
    - git clone https://gitea.gitea_nw:13000/niiku-y/test1.git
    - pwd

- name: build
  image: ubuntu:18.04
  privileged: true
  commands:
    - date --set "2019/12/04 01:00:00"
    - pwd
    - ls -aF
    - ls -l /usr/share/ca-certificates
    - apt update
    - apt install -y gcc
    - cd test1
    - gcc -o hello ./hello.c
    - chmod +x ./hello
    - ./hello
    - echo "done."

$
```

かなり長くなったが、これでCI/CDを続けられる状態に持っていくことができた。

![drone-ok.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318326/7ddd987b-d7d8-9cf1-fd87-efac40b1e910.png)

![drone-ok2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318326/1e4db33e-f31a-e107-870f-bf55fa52ea29.png)


# おまけ：runnerのUI画面

http://drone_server.gitea_nw:3000
にアクセスすると、CI/CDタスクの結果が簡易にわかるようになっている。

![runner-ui.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318326/a283a845-59cf-2e4f-2d01-badfcd0c13f9.png)


# 参考

* [Drone](https://drone.io/)
* [Document](https://docs.drone.io/)
* [Drone (github)](https://github.com/drone/drone)
* [Drone (discourse)](https://discourse.drone.io/)
* [Drone plugin](http://plugins.drone.io/)
* https://stackoverflow.com/questions/45628601/client-authentication-using-self-signed-ssl-certificate-for-nginx