-
Notifications
You must be signed in to change notification settings - Fork 39
/
bazel.go
75 lines (57 loc) · 1.98 KB
/
bazel.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Copyright 2020 VMware, Inc.
// SPDX-License-Identifier: Apache-2.0
package image
import (
"bytes"
"fmt"
"io"
"os/exec"
"regexp"
ctlbdk "carvel.dev/kbld/pkg/kbld/builder/docker"
"carvel.dev/kbld/pkg/kbld/config"
ctllog "carvel.dev/kbld/pkg/kbld/logger"
)
var (
// Loaded image ID: sha256:328b5f47550c85cea5284911ad4d284ce20e8240d61d2610eb6cb4aa8b43c19e
// Tagging 328b5f47550c85cea5284911ad4d284ce20e8240d61d2610eb6cb4aa8b43c19e as bazel:simple-app
bazelImageID = regexp.MustCompile("Loaded image ID: (sha256:)([0-9a-z]+)")
)
type Bazel struct {
docker ctlbdk.Docker
logger ctllog.Logger
}
func NewBazel(docker ctlbdk.Docker, logger ctllog.Logger) Bazel {
return Bazel{docker: docker, logger: logger}
}
func (b *Bazel) Run(image, directory string, opts config.SourceBazelRunOpts) (ctlbdk.TmpRef, error) {
prefixedLogger := b.logger.NewPrefixedWriter(image + " | ")
prefixedLogger.Write([]byte(fmt.Sprintf("starting build (using bazel): %s\n", directory)))
defer prefixedLogger.Write([]byte("finished build (using bazel)\n"))
var imageID string
{
var stdoutBuf, stderrBuf bytes.Buffer
cmdArgs := []string{"run"}
if opts.Target == nil {
return ctlbdk.TmpRef{}, fmt.Errorf("Expected target to be specified, but was not")
}
cmdArgs = append(cmdArgs, *opts.Target)
if opts.RawOptions != nil {
cmdArgs = append(cmdArgs, *opts.RawOptions...)
}
cmd := exec.Command("bazel", cmdArgs...)
cmd.Dir = directory
cmd.Stdout = io.MultiWriter(&stdoutBuf, prefixedLogger)
cmd.Stderr = io.MultiWriter(&stderrBuf, prefixedLogger)
err := cmd.Run()
if err != nil {
prefixedLogger.Write([]byte(fmt.Sprintf("error: %s\n", err)))
return ctlbdk.TmpRef{}, err
}
matches := bazelImageID.FindStringSubmatch(stdoutBuf.String())
if len(matches) != 3 {
return ctlbdk.TmpRef{}, fmt.Errorf("Expected to find image ID in bazel output but did not")
}
imageID = "sha256:" + matches[2]
}
return b.docker.RetagStable(ctlbdk.NewTmpRef(imageID), image, imageID, prefixedLogger)
}