fixed minor queue glitches

This commit is contained in:
Brad Rydzewski 2015-04-24 14:25:03 -07:00
parent 39e7ce9840
commit da350989d3
6 changed files with 69 additions and 40 deletions

View file

@ -204,7 +204,7 @@ func (db *DB) SetBuildTask(repo string, build int, task *common.Task) error {
return err return err
} }
build_.Updated = time.Now().UTC().Unix() build_.Updated = time.Now().UTC().Unix()
build_.Tasks[task.Number] = task // TODO check index to prevent nil pointer / panic build_.Tasks[task.Number-1] = task // TODO check index to prevent nil pointer / panic
return update(t, bucketBuild, key, build_) return update(t, bucketBuild, key, build_)
}) })
} }

View file

@ -6,10 +6,13 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/drone/drone/datastore/bolt" "github.com/drone/drone/datastore/bolt"
"github.com/drone/drone/eventbus"
"github.com/drone/drone/remote/github" "github.com/drone/drone/remote/github"
"github.com/drone/drone/server" "github.com/drone/drone/server"
"github.com/drone/drone/server/session" "github.com/drone/drone/server/session"
"github.com/drone/drone/settings" "github.com/drone/drone/settings"
queue "github.com/drone/drone/queue/builtin"
) )
var path = flag.String("config", "drone.toml", "") var path = flag.String("config", "drone.toml", "")
@ -31,8 +34,10 @@ func main() {
api := r.Group("/api") api := r.Group("/api")
api.Use(server.SetHeaders()) api.Use(server.SetHeaders())
api.Use(server.SetBus(eventbus.New()))
api.Use(server.SetDatastore(ds)) api.Use(server.SetDatastore(ds))
api.Use(server.SetRemote(remote)) api.Use(server.SetRemote(remote))
api.Use(server.SetQueue(queue.New()))
api.Use(server.SetSettings(settings)) api.Use(server.SetSettings(settings))
api.Use(server.SetUser(session)) api.Use(server.SetUser(session))
@ -99,6 +104,16 @@ func main() {
hooks.POST("", server.PostHook) hooks.POST("", server.PostHook)
} }
queue := api.Group("/queue")
{
queue.Use(server.SetRepo())
queue.GET("", server.GetQueue)
queue.POST("/pull", server.PollBuild)
queue.POST("/push/:owner/:name", server.PushBuild)
queue.POST("/push/:owner/:name/:build", server.PushTask)
queue.POST("/push/:owner/:name/:build/:task/logs", server.PushLogs)
}
auth := r.Group("/authorize") auth := r.Group("/authorize")
{ {
auth.Use(server.SetHeaders()) auth.Use(server.SetHeaders())

View file

@ -26,30 +26,3 @@ type Queue interface {
// queue, in proper sequence. // queue, in proper sequence.
Items() []*Work Items() []*Work
} }
// type Manager interface {
// // Register registers a worker that has signed
// // up to accept work.
// Register(*Worker)
// // Unregister unregisters a worker that should no
// // longer be accepting work.
// Unregister(*Worker)
// // Assign assigns work to a worker.
// Assign(*Work, *Worker)
// // Unassign unassigns work from a worker.
// Unassign(*Work, *Worker)
// // Work returns a list of all work that is
// // currently in progress.
// Work() []*Work
// // Worker retrieves a worker by name.
// Worker(string) *Worker
// // Workers returns a slice containing all workers
// // registered with the manager.
// Workers() []*Worker
// }

View file

@ -5,6 +5,7 @@ import (
"strconv" "strconv"
"github.com/drone/drone/common" "github.com/drone/drone/common"
"github.com/drone/drone/queue"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding" "github.com/gin-gonic/gin/binding"
) )
@ -102,6 +103,7 @@ func PostBuildStatus(c *gin.Context) {
// //
func RunBuild(c *gin.Context) { func RunBuild(c *gin.Context) {
store := ToDatastore(c) store := ToDatastore(c)
queue_ := ToQueue(c)
repo := ToRepo(c) repo := ToRepo(c)
num, err := strconv.Atoi(c.Params.ByName("number")) num, err := strconv.Atoi(c.Params.ByName("number"))
if err != nil { if err != nil {
@ -114,6 +116,18 @@ func RunBuild(c *gin.Context) {
return return
} }
keys, err := store.RepoKeypair(repo.FullName)
if err != nil {
c.Fail(404, err)
return
}
user, err := store.User(repo.User.Login)
if err != nil {
c.Fail(404, err)
return
}
// must not restart a running build // must not restart a running build
if build.State == common.StatePending || build.State == common.StateRunning { if build.State == common.StatePending || build.State == common.StateRunning {
c.Fail(409, err) c.Fail(409, err)
@ -143,7 +157,14 @@ func RunBuild(c *gin.Context) {
// raw = []byte(inject.InjectSafe(string(raw), params)) // raw = []byte(inject.InjectSafe(string(raw), params))
// } // }
// TODO push build to queue queue_.Publish(&queue.Work{
User: user,
Repo: repo,
Build: build,
Keys: keys,
Netrc: &common.Netrc{}, //TODO create netrc
Yaml: nil, // TODO fetch yaml
})
c.JSON(202, build) c.JSON(202, build)
} }

View file

@ -7,7 +7,7 @@ import (
"github.com/drone/drone/common" "github.com/drone/drone/common"
"github.com/drone/drone/parser/inject" "github.com/drone/drone/parser/inject"
"github.com/drone/drone/parser/matrix" "github.com/drone/drone/parser/matrix"
// "github.com/bradrydzewski/drone/worker" "github.com/drone/drone/queue"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@ -19,6 +19,7 @@ import (
func PostHook(c *gin.Context) { func PostHook(c *gin.Context) {
remote := ToRemote(c) remote := ToRemote(c)
store := ToDatastore(c) store := ToDatastore(c)
queue_ := ToQueue(c)
hook, err := remote.Hook(c.Request) hook, err := remote.Hook(c.Request)
if err != nil { if err != nil {
@ -107,19 +108,13 @@ func PostHook(c *gin.Context) {
Environment: axis, Environment: axis,
}) })
} }
keys, err := store.RepoKeypair(repo.FullName)
err = store.SetBuild(repo.FullName, build)
if err != nil { if err != nil {
c.Fail(500, err) log.Errorf("failure to fetch keypair for %s. %s", repo.FullName, err)
c.Fail(404, err)
return return
} }
// w := worker.Work{
// User: user,
// Repo: repo,
// Build: build,
// }
// verify the branches can be built vs skipped // verify the branches can be built vs skipped
// s, _ := script.ParseBuild(string(yml)) // s, _ := script.ParseBuild(string(yml))
// if len(hook.PullRequest) == 0 && !s.MatchBranch(hook.Branch) { // if len(hook.PullRequest) == 0 && !s.MatchBranch(hook.Branch) {
@ -127,5 +122,20 @@ func PostHook(c *gin.Context) {
// return // return
// } // }
err = store.SetBuild(repo.FullName, build)
if err != nil {
c.Fail(500, err)
return
}
queue_.Publish(&queue.Work{
User: user,
Repo: repo,
Build: build,
Keys: keys,
Netrc: &common.Netrc{}, // TODO
Yaml: raw,
})
c.JSON(200, build) c.JSON(200, build)
} }

View file

@ -19,7 +19,7 @@ import (
// GET /queue/pull // GET /queue/pull
func PollBuild(c *gin.Context) { func PollBuild(c *gin.Context) {
queue := ToQueue(c) queue := ToQueue(c)
work := queue.PullAck() work := queue.Pull()
c.JSON(200, work) c.JSON(200, work)
} }
@ -37,6 +37,10 @@ func PushBuild(c *gin.Context) {
c.Fail(404, err) c.Fail(404, err)
return return
} }
build.Duration = in.Duration
build.Started = in.Started
build.Finished = in.Finished
build.State = in.State
err = store.SetBuildState(repo.FullName, build) err = store.SetBuildState(repo.FullName, build)
if err != nil { if err != nil {
c.Fail(500, err) c.Fail(500, err)
@ -106,3 +110,9 @@ func PushLogs(c *gin.Context) {
} }
c.Writer.WriteHeader(200) c.Writer.WriteHeader(200)
} }
func GetQueue(c *gin.Context) {
queue := ToQueue(c)
items := queue.Items()
c.JSON(200, items)
}