オープンソース版Droneのビルドでデータベースを使用する方法

オープンソース版Droneのビルドでデータベースを使用してみました。そのための設定手順を以下に記載します。

サンプルプロジェクト

検証用に、MongoDBを使用する以下のプロジェクトを用意しました。

yosssi/drone-test

mongo.go

package mongo

import (
    "labix.org/v2/mgo"
    "labix.org/v2/mgo/bson"
)

type User struct {
    Name string `bson:"name"`
    Age  int    `bson:"age"`
}

func Find(name string) (*User, error) {
    session, err := mgo.Dial("localhost")
    if err != nil {
        return nil, err
    }
    defer session.Close()
    session.SetMode(mgo.Monotonic, true)
    c := session.DB("droneTest").C("users")
    var user User
    err = c.Find(bson.M{"name": name}).One(&user)
    if err != nil {
        return nil, err
    }
    return &user, nil
}

mongo_test.go

package mongo

import (
    "fmt"
    "labix.org/v2/mgo"
    "testing"
)

var (
    taro   = &User{Name: "Taro", Age: 20}
    hanako = &User{Name: "Hanako", Age: 22}
)

// テストデータを投入
func init() {
    session, err := mgo.Dial("localhost")
    if err != nil {
        panic(err)
    }
    defer session.Close()
    session.SetMode(mgo.Monotonic, true)
    c := session.DB("droneTest").C("users")
    c.DropCollection()
    err = c.Insert(taro)
    if err != nil {
        panic(err)
    }
    err = c.Insert(hanako)
    if err != nil {
        panic(err)
    }
}

// Find関数をテスト
func TestFind(t *testing.T) {
    // User(Nmae="Taro")を抽出
    user, err := Find(taro.Name)
    if err != nil {
        t.Error(err)
    }
    if user.Name != taro.Name || user.Age != taro.Age {
        t.Error(fmt.Sprintf("検索結果が不正です。[期待値: %+v][実際: %+v]", taro, user))
    }

    // 存在しないUserを抽出
    user, err = Find("X")
    if err == nil || err.Error() != "not found" {
        t.Error("検索結果が不正です。検索結果が存在します。")
    }
}

Droneへのリポジトリの登録

画面右上のNew Repositoryボタンをクリックし、今回ビルドを行うGitHubリポジトリをDroneへ登録します。

f:id:kysd:20140209014947p:plain

.drone.ymlの作成

以下の.drone.ymlを作成し、GitHubリポジトリへプッシュします。

image: go1.2
env:
  - GOPATH=/var/cache/drone
services:
  - mongodb
script:
  - go get labix.org/v2/mgo
  - go get labix.org/v2/mgo/bson
  - go build
  - go test -cover -v

.drone.ymlにservicesを記載することで、ビルド時に起動するデータベースコンテナを指定することができます。設定できるデータベースは以下の通りです。

services:
  - cassandra
  - couchdb
  - elasticsearch
  - neo4j
  - mongodb
  - mysql
  - postgres
  - rabbitmq
  - redis
  - riak
  - zookeeper

ビルド結果の確認

Droneのビルド結果画面を開き、ビルドが正常終了していることを確認します。

f:id:kysd:20140209020042p:plain