DockerでDrone1.0をさわってみた

この記事はGRIPHONE Advent Calendar 2019 17日目の記事です

こんにちは。サーバーサイドエンジニアの西村です。
普段業務改善でjenkinsやGASなどを利用しているのですが、新しいCI/CDツールを試したいと思いDroneというツールを触った際のメモになります。
こちらの記事が何かの参考になれば幸いです。

早速ngrok、GitHub、Dockerを使ってDroneを試してみます。
構成は下記のようになります。

  • ngrok
  • GitHub
  • Drone server / Drone runner (Docker)

ngrok

https://ngrok.com/
こちらからダウンロードして起動します。
ngrok http 80
とコマンドを実行すると外部に公開されるURLが発行されます。
この払い出されたURLをGithubのOuthAppsに登録し、DroneのSERVER_HOSTに設定します。

Github

https://github.com/settings/developers
でOuthAppsを登録します。
Homepage URLにngrokから発行されたURL、
Authorization callback URLに ngrokから発行されたURL/login
と設定します。
OuthAppsの設定するとDroneの設定に必要なClient ID、Client Secretが画面に表示されます。
こちらの値をDroneのDRONE_GITHUB_CLIENT_IDとDRONE_GITHUB_CLIENT_SECRETに設定します。

Drone server

DRONE_SERVER_HOSTはngrokから発行されたURLを設定します。
DRONE_GITHUB_CLIENT_IDとDRONE_GITHUB_CLIENT_SECRETは上の手順でGitHubから発行された値を使います。
DRONE_RPC_SECRETは適当に生成した値をserverとrunnerで同じ値を設定します。

Drone runner

DRONE_RPC_HOSTは ngrokから発行されたURLもしくはdockerであればdrone_serverのような名前の指定でもOKです。
DRONE_RPC_PROTOはserverとrunnerとの通信はhttpで行うのでhttpにしています。
DRONE_RUNNER_NAMEは適当な名前を付ければOKです。

Dockerのyamlファイル

docker-composeのyamlファイルは下記のようになりました。
volumeの設定など必要があれば適宜追加してください。

version: "3.5"
services:
  drone_server:
    image: drone/drone:1
    container_name: drone_server
    hostname: drone_server
    restart: always
    environment:
      - DRONE_GITHUB_SERVER=https://github.com
      - DRONE_GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID}
      - DRONE_GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET}
      - DRONE_RPC_SECRET=${SECRET}
      - DRONE_SERVER_PROTO=https
      - DRONE_SERVER_HOST=${SERVER_HOST}
      - DRONE_DEBUG=TRUE
      - DRONE_TRACE=TRUE
      - DRONE_RPC_DUMP_HTTP=TRUE
    ports:
      - "80:80"
      - "443:443"

  drone_runner:
    image: drone/drone-runner-docker:1
    container_name: drone_runner
    hostname: drone_runner
    restart: always
    environment:
      - DRONE_RPC_PROTO=http
      - DRONE_RPC_HOST=${SERVER_HOST}
      - DRONE_RPC_SECRET=${SECRET}
      - DRONE_RUNNER_CAPACITY=2
      - DRONE_RUNNER_NAME=${RUNNER_NAME}
      - DRONE_UI_USERNAME=root
      - DRONE_UI_PASSWORD=root
      - DRONE_DEBUG=TRUE
      - DRONE_TRACE=TRUE
      - DRONE_RPC_DUMP_HTTP=TRUE
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - "3000:3000"
    depends_on:
      - drone_server

軽くパラメータの補足を。
DRONE_DEBUG、DRONE_TRACE、DRONE_RPC_DUMP_HTTPはデバッグ用です。

https://docs.drone.io/installation/providers/github/
上記手順の「 Step 4 – Start the Server 」に
--env=DRONE_AGENTS_ENABLED=true \
こんな事書いてありますが、
https://github.com/go-training/drone-tutorial/issues/3
そんなの無いよ的な会話があるようなので、このパラメータは気にしないで良さそうです。
オプション無しの上のdocker-composeで動かしましたが正常に動作しました。

構築時ハマった事

DRONE_RPC_PROTO= http
と = の後ろにスペースが混じっており、全く動かなくて困りました・・・。
気を付けましょう。
また動作確認をするなら各種設定が必要が無いrunnerをhttpで行うのが良さそうです。

runnerをwindowsで実行する

次にrunnerをDockerではなく、windowsのlocal環境のexecで実行します。
構成は下記の通りです。

  • ngrok
  • GitHub
  • Drone server (Docker)
  • Drone runner (windows exec)

構築手順は
https://exec-runner.docs.drone.io/installation/windows/
こちらを参考にすれば、そのままできます。

windowsのrunnnerを実行する際、configファイルが必要になります。
設定内容は下記のようになりました。

DRONE_RPC_PROTO=http
DRONE_RPC_HOST=${SERVER_HOST}
DRONE_RPC_SECRET=${SECRET}
DRONE_LOG_FILE=C:\Drone\drone-runner-exec\log.txt
DRONE_DEBUG=TRUE
DRONE_TRACE=TRUE
DRONE_RPC_DUMP_HTTP=TRUE

C:\Drone\drone-runner-exec\configに上のファイルを生成してrunnerを実行すれば動きます。
windowsのlocal環境のexecを実行する際、2点注意点があります。
1点目はDockerのrunnerが動いているとエラーが出るので、Dockerのrunnerを止めないといけない事。
こちらに関しては解決方法があるかもしれないので、解決方法があればTwitterやFacebookなど教えて頂けると助かります。
2点目はrunnerが処理を実行する際、下記のエラーが出ました。

C:\WINDOWS\TEMP\drone-mtfKmqJwMyDghJaN\opt\clone.ps1 : ���̃V�X�e���ł̓X�N���v�g�̎��s�������ɂȂ��Ă��邽�߁A�t�@�C��
 C:\WINDOWS\TEMP\drone-mtfKmqJwMyDghJaN\opt\clone.ps1 ���ǂݍ��ނ��Ƃ��ł��܂����B�ڍׂɂ‚��ẮA�uabout_Execution_Pol
icies�v(https://go.microsoft.com/fwlink/?LinkID=135170) ���Q�Ƃ��Ă��������B
�����ꏊ �s:1 ����:1
+ C:\WINDOWS\TEMP\drone-mtfKmqJwMyDghJaN\opt\clone.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : �Z�L�����e�B �G���[: (: ) []�APSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

PowerShellの実行ポリシーで権限が無いと怒られました。
Set-ExecutionPolicyというコマンドで権限を変更します。
Set-ExecutionPolicyのパラメータは
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-6
の-ExecutionPolicyを参考にして頂ければと思います。
設定変更後にジョブを実行すると

+ git init

Initialized empty Git repository in C:/Windows/Temp/drone-T6JnzHYs8XlQU2LD/drone/src/.git/
+ git remote add origin https://github.com/Daisuke-Nishimura-Hiroelza/drone_test.git

+ git fetch  origin +refs/heads/master:

From https://github.com/Daisuke-Nishimura-Hiroelza/drone_test
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> origin/master
+ git checkout d2b68e80d6703d77f785d3477cf124ec2b3cc59e -b master

Already on 'master'

windowsのlocal環境のexecで無事実行できました。

総括

runnerをwindowsやmacのlocal環境で動かすことが出来ればUnityやAssetBundleのビルドする事にも使えるので、Droneはとても使えそうですね!
実行する処理がgitなどで管理できるようになるので修正や引継ぎが容易に出来る事が想像できます。
次回はserver部分をkubernetesにする記事を書きたいと思います。

サンプルのpipelineのファイルはこちらにあります。
https://github.com/Daisuke-Nishimura-Hiroelza/drone_test

明日の記事をお楽しみに!

参考リンク

ngrok
https://parashuto.com/rriver/tools/secure-tunneling-service-ngrok

drone
https://qiita.com/niiku-y/items/9cbe4f6c0554f2b4ddb1
https://engineering.linecorp.com/ja/blog/go-oss-ci-cd-platform-drone-1-0-0-rc-1/
https://engineering.linecorp.com/ja/blog/go-oss-ci-tool-drone-replaces-jenkins/
https://github.com/go-training/drone-tutorial/issues/3
https://qiita.com/mmhiyoko/items/7669e44652052468fb3b
https://qiita.com/BKmamba/items/00cbefd2efe8263fa511
https://www.rco.recruit.co.jp/career/engineer/blog/drone_io/#fn:1
https://knowledge.sakura.ad.jp/2729/
https://qiita.com/yohachi/items/331e7ca3d29415a1a435

PowellShell
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-6