Githubでdroneを使ってgoのテストを実行してみる

f:id:utr066:20180129152044p:plain

droneをgithubで動かしてみたかったので、ちょっと試してみる。 github上でgoのテストをdroneで動かすことをゴールとしたい。

ディレクトリ・ファイル作成

drone_test
├── docker-compose.yml
├── hello.go
└── hello_test.go

docker-compose.yml

version: '2'

services:
  drone-server:
    image: drone/drone:0.7.3
    ports:
      - 3000:8000
    volumes:
      - .:/var/lib/drone/
    restart: always
    environment:
      - DRONE_OPEN=true
      - DRONE_HOST=${DRONE_HOST}
      - DRONE_GITHUB=true
      - DRONE_GITHUB_URL=${DRONE_GITHUB_URL}
      - DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT}
      - DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
      - DRONE_SECRET=${DRONE_SECRET}
      - DRONE_GITHUB_PRIVATE_MODE=true

  drone-agent:
    image: drone/drone:0.7.3
    command: agent
    restart: always
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_SERVER=ws://drone-server:8000/ws/broker
      - DRONE_SECRET=${DRONE_SECRET}

${}は後に.envで指定する。後に記述。

hello.go

package main

import "fmt"

func getHello() string {
    return "Hello World"
}

func main() {
    fmt.Println(getHello())
}

hello_test.go

package main

import (
    "testing"
)

func TestHello(t *testing.T) {
    if "Hello World" != getHello() {
        t.Fatal("failed test")
    }
}

Docker起動

docker-compose.ymlがあるディレクトリで以下を実行。

docker-compose up

確認

以下にアクセスしてdroneの画面が出るか確認。

http://localhost:3000

グローバルなURLを取得する

グローバルなURL出ないとgithubとうまく連携できないようなので、それを取得する。

brew cask install ngrok
ngrok http 3000

ポート番号はローカルで使用しているアプリケーションのポート番号を指定。

ngrok by @inconshreveable                                                             (Ctrl+C to quit)

Session Status                online
Version                       2.2.8
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://○○○○○○○.ngrok.io -> localhost:3000
Forwarding                    https://○○○○○○○.ngrok.io -> localhost:3000

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00

http://○○○○○○○.ngrok.iolocalhost:3000と繋がっているので、ローカルを立ち上げたら、http://○○○○○○○.ngrok.ioでアクセスできるはず。

docker-compose up

してからアクセスしてみてdroneの画面が表示されればok。

.envを作成する

.envを作成し以下の記述をする

DRONE_GITHUB_URL=githubのurl
DRONE_GITHUB_CLIENT=後に記述
DRONE_GITHUB_SECRET=後に記述
DRONE_SECRET=文字列
DRONE_HOST=ngrokで生成されたURL

DRONE_GITHUB_CLIENTとDRONE_GITHUB_SECRETの値を取得する

https://github.com/settings/developersからDRONE_GITHUB_CLIENTとDRONE_GITHUB_SECRETの値を取得する。

f:id:utr066:20180129105135p:plain

f:id:utr066:20180129105630p:plain

上記のようにして登録。 Client IDとClient Secretというものが表示されるので、それをそれぞれDRONE_GITHUB_CLIENTとDRONE_GITHUB_SECRETに割り当てる。

DRONE_SECRETはなんでもいいのでハッシュを設定。

ruby -r securerandom -e "puts SecureRandom.urlsafe_base64"

とりあえずこれで作る。

アプリケーションを認証する

ngrokで割り当てられたurl + /login

上記にアクセスして認証する。

f:id:utr066:20180129124656p:plain

設定したらログインして、droneと連携したいリポジトリにチェックする。

.drone.ymlを記述する

.drone.ymlに書いたものが、droneで実行される。 droneでテストを実行してみたいので、テスト実行のコマンドを記述する。作る箇所はアプリケーションのディレクトリ直下。

pipeline:
  testing:
    image: golang
    commands:
      - go build
      - go test

githubで確かめる

.drone.ymlを書いたらpushしてgithub上で期待通りに動くか確かめる。

f:id:utr066:20180129132115p:plain

こんな表示が出てくるはず。

ローカルでdroneを使う

ローカルでdroneを実行することもできる。

brew tap drone/drone
brew install drone

drone --version
//これでバージョンが表示されればok

下記で実行。

drone exec 
[testing:L0:0s] + go build
[testing:L1:0s] + go test
[testing:L2:0s] PASS
[testing:L3:0s] ok      _/drone/src 0.005s

大丈夫そうかな。