オープンソース版Droneのビルドでデータベースを使用する方法
オープンソース版Droneのビルドでデータベースを使用してみました。そのための設定手順を以下に記載します。
サンプルプロジェクト
検証用に、MongoDBを使用する以下のプロジェクトを用意しました。
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へ登録します。
.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のビルド結果画面を開き、ビルドが正常終了していることを確認します。