Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 18 additions & 53 deletions pkg/build/gvisor.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ package build
import (
"fmt"
"path/filepath"
"regexp"
"strings"
"time"

Expand All @@ -17,8 +16,6 @@ import (

type gvisor struct{}

var bazelTargetPath = regexp.MustCompile(`(?sm:.*^)\s*Outputs: \[(.*)\](?sm:$.*)`)

func (gvisor gvisor) build(params Params) (ImageDetails, error) {
if params.Compiler == "" {
params.Compiler = "bazel"
Expand All @@ -31,66 +28,34 @@ func (gvisor gvisor) build(params Params) (ImageDetails, error) {
if err != nil {
return ImageDetails{}, fmt.Errorf("cannot parse gVisor configuration: %w", err)
}
args := []string{}
bazelOpts := "--verbose_failures"

target := "//runsc:runsc"
if config.Race {
args = append(args, "--config=race")
target = "//runsc:runsc-race"
}
if config.Coverage {
coverageFiles := "//pkg/..."
exclusions := []string{
"//pkg/sentry/platform", "//pkg/ring0", // Breaks kvm.
"//pkg/coverage:coverage", // Too slow.
}
if config.Race {
// These targets use go:norace, which is not
// respected by coverage instrumentation. Race builds
// will be instrumented with atomic coverage (using
// sync/atomic.AddInt32), which will not work.
exclusions = append(exclusions, []string{
"//pkg/sleep:sleep",
"//pkg/sync:sync",
"//pkg/syncevent:syncevent",
}...)
target = "//runsc:runsc_race_coverage"
} else {
target = "//runsc:runsc_coverage"
}
for _, f := range exclusions {
coverageFiles += ",-" + f
}
args = append(args, []string{
"--collect_code_coverage",
"--instrumentation_filter=" + coverageFiles}...)
}
buildArgs := []string{"build", "--verbose_failures"}
buildArgs = append(buildArgs, args...)
buildArgs = append(buildArgs, target)
log.Logf(0, "bazel: %v", buildArgs)
// The 1 hour timeout is quite high. But we've seen false positives with 20 mins
// on the first build after bazel/deps update. Also other gvisor instances running
// on the same machine contribute to longer build times.
if _, err := osutil.RunCmd(60*time.Minute, params.KernelDir, params.Compiler, buildArgs...); err != nil {
return ImageDetails{}, err
} else if config.Race {
bazelOpts += " --config=race "
target = "//runsc:runsc-race"
}

// Find out a path to the runsc binary.
aqueryArgs := append([]string{"aquery"}, args...)
aqueryArgs = append(aqueryArgs, fmt.Sprintf("mnemonic(\"GoLink\", %s)", target))
log.Logf(0, "bazel: %v", aqueryArgs)
out, err := osutil.RunCmd(10*time.Minute, params.KernelDir, params.Compiler, aqueryArgs...)
if err != nil {
outBinary := filepath.Join(params.OutputDir, "image")
cmd := osutil.Command("make", "copy",
"DOCKER_BUILD=0",
fmt.Sprintf("BAZEL_OPTIONS=%s", bazelOpts),
fmt.Sprintf("TARGETS=%s", target),
fmt.Sprintf("DESTINATION=%s", outBinary),
)
cmd.Dir = params.KernelDir

log.Logf(0, "bazel copy: %v", cmd.Env)
if _, err := osutil.Run(60*time.Minute, cmd); err != nil {
return ImageDetails{}, err
}

match := bazelTargetPath.FindSubmatch(out)
if match == nil {
return ImageDetails{}, fmt.Errorf("failed to find the runsc binary")
}
outBinary := filepath.Join(params.KernelDir, filepath.FromSlash(string(match[1])))

if err := osutil.CopyFile(outBinary, filepath.Join(params.OutputDir, "image")); err != nil {
return ImageDetails{}, err
}
sysTarget := targets.Get(params.TargetOS, params.TargetArch)
return ImageDetails{}, osutil.CopyFile(outBinary, filepath.Join(params.OutputDir, "obj", sysTarget.KernelObject))
}
Expand Down