69 lines
1.5 KiB
Go
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
|
|
}
|