2018-05-05 17:00:56 +03:00

69 lines
1.5 KiB
Go

package executors
import (
"context"
"fmt"
"os/exec"
"time"
"github.com/golangci/golangci-shared/pkg/timeutils"
)
type Docker struct {
mountFromPath, mountToPath string
image string
wd string
*envStore
}
func NewDocker(mountFromPath, mountToPath string) *Docker {
return &Docker{
mountFromPath: mountFromPath,
mountToPath: mountToPath,
image: "golangci_executor",
envStore: newEnvStoreNoOS(),
}
}
var _ Executor = Docker{}
func (d Docker) Run(ctx context.Context, name string, args ...string) (string, error) {
// XXX: don't use docker sdk because it's too heavyweight: dep ensure takes minutes on it
dockerArgs := []string{
"run",
"-v", fmt.Sprintf("%s:%s", d.mountFromPath, d.mountToPath),
}
for _, e := range d.env {
dockerArgs = append(dockerArgs, "-e", e)
}
dockerArgs = append(dockerArgs, "--rm", d.image, name)
dockerArgs = append(dockerArgs, args...)
// TODO: take work dir d.wd into account
defer timeutils.Track(time.Now(), "docker full execution: docker %v", dockerArgs)
cmd := exec.CommandContext(ctx, "docker", dockerArgs...)
out, err := cmd.CombinedOutput()
return string(out), err
}
func (d Docker) WithEnv(k, v string) Executor {
dCopy := d
dCopy.SetEnv(k, v)
return dCopy
}
func (d Docker) Clean() {}
func (d Docker) WithWorkDir(wd string) Executor {
dCopy := d
dCopy.wd = wd
return dCopy
}
func (d Docker) WorkDir() string {
panic("isn't supported") // TODO
}