mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2024-11-20 00:41:02 +00:00
122 lines
2.8 KiB
Go
122 lines
2.8 KiB
Go
package agent
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/drone/drone/client"
|
|
"github.com/samalba/dockerclient"
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
"github.com/codegangsta/cli"
|
|
)
|
|
|
|
// AgentCmd is the exported command for starting the drone agent.
|
|
var AgentCmd = cli.Command{
|
|
Name: "agent",
|
|
Usage: "starts the drone agent",
|
|
Action: start,
|
|
Flags: []cli.Flag{
|
|
cli.StringFlag{
|
|
EnvVar: "DOCKER_HOST",
|
|
Name: "docker-host",
|
|
Usage: "docker deamon address",
|
|
Value: "unix:///var/run/docker.sock",
|
|
},
|
|
cli.BoolFlag{
|
|
EnvVar: "DOCKER_TLS_VERIFY",
|
|
Name: "docker-tls-verify",
|
|
Usage: "docker daemon supports tlsverify",
|
|
},
|
|
cli.StringFlag{
|
|
EnvVar: "DOCKER_CERT_PATH",
|
|
Name: "docker-cert-path",
|
|
Usage: "docker certificate directory",
|
|
Value: "",
|
|
},
|
|
cli.IntFlag{
|
|
EnvVar: "DOCKER_MAX_PROCS",
|
|
Name: "docker-max-procs",
|
|
Usage: "limit number of running docker processes",
|
|
Value: 2,
|
|
},
|
|
cli.StringFlag{
|
|
EnvVar: "DRONE_SERVER",
|
|
Name: "drone-server",
|
|
Usage: "drone server address",
|
|
Value: "http://localhost:8000",
|
|
},
|
|
cli.StringFlag{
|
|
EnvVar: "DRONE_TOKEN",
|
|
Name: "drone-token",
|
|
Usage: "drone authorization token",
|
|
},
|
|
cli.DurationFlag{
|
|
EnvVar: "DRONE_BACKOFF",
|
|
Name: "backoff",
|
|
Usage: "drone server backoff interval",
|
|
Value: time.Second * 15,
|
|
},
|
|
cli.BoolFlag{
|
|
EnvVar: "DRONE_DEBUG",
|
|
Name: "debug",
|
|
Usage: "start the agent in debug mode",
|
|
},
|
|
cli.BoolFlag{
|
|
EnvVar: "DRONE_EXPERIMENTAL",
|
|
Name: "experimental",
|
|
Usage: "start the agent with experimental features",
|
|
},
|
|
cli.StringSliceFlag{
|
|
EnvVar: "DRONE_NETRC_PLUGIN",
|
|
Name: "netrc-plugin",
|
|
Usage: "plugins that receive the netrc file",
|
|
Value: &cli.StringSlice{"git", "hg"},
|
|
},
|
|
cli.StringSliceFlag{
|
|
EnvVar: "DRONE_PRIVILEGED_PLUGIN",
|
|
Name: "privileged-plugin",
|
|
Usage: "plugins that require privileged mode",
|
|
Value: &cli.StringSlice{"docker", "gcr", "ecr"},
|
|
},
|
|
},
|
|
}
|
|
|
|
func start(c *cli.Context) {
|
|
|
|
// debug level if requested by user
|
|
if c.Bool("debug") {
|
|
logrus.SetLevel(logrus.DebugLevel)
|
|
} else {
|
|
logrus.SetLevel(logrus.WarnLevel)
|
|
}
|
|
|
|
client := client.NewClientToken(
|
|
c.String("drone-server"),
|
|
c.String("drone-token"),
|
|
)
|
|
|
|
tls, _ := dockerclient.TLSConfigFromCertPath(c.String("docker-cert-path"))
|
|
if c.Bool("docker-host") {
|
|
tls.InsecureSkipVerify = true
|
|
}
|
|
docker, err := dockerclient.NewDockerClient(c.String("docker-host"), tls)
|
|
if err != nil {
|
|
logrus.Fatal(err)
|
|
}
|
|
|
|
var wg sync.WaitGroup
|
|
for i := 0; i < c.Int("docker-max-procs"); i++ {
|
|
wg.Add(1)
|
|
go func() {
|
|
for {
|
|
if err := recoverExec(client, docker); err != nil {
|
|
dur := c.Duration("backoff")
|
|
logrus.Debugf("Attempting to reconnect in %v", dur)
|
|
time.Sleep(dur)
|
|
}
|
|
}
|
|
}()
|
|
}
|
|
wg.Wait()
|
|
}
|