80 lines
1.5 KiB
Go
80 lines
1.5 KiB
Go
package agent
|
|
|
|
import (
|
|
"io"
|
|
"time"
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
"github.com/drone/drone/agent"
|
|
"github.com/drone/drone/build/docker"
|
|
"github.com/drone/drone/client"
|
|
|
|
"github.com/samalba/dockerclient"
|
|
)
|
|
|
|
type config struct {
|
|
platform string
|
|
namespace string
|
|
privileged []string
|
|
pull bool
|
|
logs int64
|
|
timeout time.Duration
|
|
}
|
|
|
|
type pipeline struct {
|
|
drone client.Client
|
|
docker dockerclient.Client
|
|
config config
|
|
}
|
|
|
|
func (r *pipeline) run() error {
|
|
w, err := r.drone.Pull("linux", "amd64")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
logrus.Infof("Starting build %s/%s#%d.%d",
|
|
w.Repo.Owner, w.Repo.Name, w.Build.Number, w.Job.Number)
|
|
|
|
cancel := make(chan bool, 1)
|
|
engine := docker.NewClient(r.docker)
|
|
|
|
// streaming the logs
|
|
rc, wc := io.Pipe()
|
|
defer func() {
|
|
wc.Close()
|
|
rc.Close()
|
|
}()
|
|
|
|
a := agent.Agent{
|
|
Update: agent.NewClientUpdater(r.drone),
|
|
Logger: agent.NewClientLogger(r.drone, w.Job.ID, rc, wc, r.config.logs),
|
|
Engine: engine,
|
|
Timeout: r.config.timeout,
|
|
Platform: r.config.platform,
|
|
Namespace: r.config.namespace,
|
|
Escalate: r.config.privileged,
|
|
Pull: r.config.pull,
|
|
}
|
|
|
|
// signal for canceling the build.
|
|
wait := r.drone.Wait(w.Job.ID)
|
|
defer wait.Cancel()
|
|
go func() {
|
|
if _, err := wait.Done(); err == nil {
|
|
cancel <- true
|
|
logrus.Infof("Cancel build %s/%s#%d.%d",
|
|
w.Repo.Owner, w.Repo.Name, w.Build.Number, w.Job.Number)
|
|
}
|
|
}()
|
|
|
|
a.Run(w, cancel)
|
|
|
|
wc.Close()
|
|
rc.Close()
|
|
|
|
logrus.Infof("Finished build %s/%s#%d.%d",
|
|
w.Repo.Owner, w.Repo.Name, w.Build.Number, w.Job.Number)
|
|
|
|
return nil
|
|
}
|