Merge pull request #2038 from crazy-max/localstate-group

build: support local state group
This commit is contained in:
CrazyMax 2023-09-30 06:01:14 +02:00 committed by GitHub
commit 6c77b76b7b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 482 additions and 179 deletions

View File

@ -18,7 +18,6 @@ import (
controllerapi "github.com/docker/buildx/controller/pb" controllerapi "github.com/docker/buildx/controller/pb"
"github.com/docker/buildx/util/buildflags" "github.com/docker/buildx/util/buildflags"
"github.com/docker/buildx/util/platformutil" "github.com/docker/buildx/util/platformutil"
"github.com/docker/cli/cli/config" "github.com/docker/cli/cli/config"
hcl "github.com/hashicorp/hcl/v2" hcl "github.com/hashicorp/hcl/v2"
"github.com/moby/buildkit/client/llb" "github.com/moby/buildkit/client/llb"

View File

@ -26,7 +26,6 @@ import (
"github.com/distribution/reference" "github.com/distribution/reference"
"github.com/docker/buildx/builder" "github.com/docker/buildx/builder"
"github.com/docker/buildx/driver" "github.com/docker/buildx/driver"
"github.com/docker/buildx/localstate"
"github.com/docker/buildx/util/desktop" "github.com/docker/buildx/util/desktop"
"github.com/docker/buildx/util/dockerutil" "github.com/docker/buildx/util/dockerutil"
"github.com/docker/buildx/util/imagetools" "github.com/docker/buildx/util/imagetools"
@ -72,6 +71,7 @@ const (
type Options struct { type Options struct {
Inputs Inputs Inputs Inputs
Ref string
Allow []entitlements.Entitlement Allow []entitlements.Entitlement
Attests map[string]*string Attests map[string]*string
BuildArgs map[string]string BuildArgs map[string]string
@ -92,11 +92,10 @@ type Options struct {
Ulimits *opts.UlimitOpt Ulimits *opts.UlimitOpt
Session []session.Attachable Session []session.Attachable
Linked bool // Linked marks this target as exclusively linked (not requested by the user).
// Linked marks this target as exclusively linked (not requested by the user).
Linked bool
PrintFunc *PrintFunc PrintFunc *PrintFunc
SourcePolicy *spb.Policy SourcePolicy *spb.Policy
GroupRef string
} }
type PrintFunc struct { type PrintFunc struct {
@ -424,6 +423,7 @@ func toSolveOpt(ctx context.Context, node builder.Node, multiDriver bool, opt Op
} }
so := client.SolveOpt{ so := client.SolveOpt{
Ref: opt.Ref,
Frontend: "dockerfile.v0", Frontend: "dockerfile.v0",
FrontendAttrs: map[string]string{}, FrontendAttrs: map[string]string{},
LocalDirs: map[string]string{}, LocalDirs: map[string]string{},
@ -433,6 +433,10 @@ func toSolveOpt(ctx context.Context, node builder.Node, multiDriver bool, opt Op
SourcePolicy: opt.SourcePolicy, SourcePolicy: opt.SourcePolicy,
} }
if so.Ref == "" {
so.Ref = identity.NewID()
}
if opt.CgroupParent != "" { if opt.CgroupParent != "" {
so.FrontendAttrs["cgroup-parent"] = opt.CgroupParent so.FrontendAttrs["cgroup-parent"] = opt.CgroupParent
} }
@ -668,12 +672,6 @@ func toSolveOpt(ctx context.Context, node builder.Node, multiDriver bool, opt Op
so.FrontendAttrs["ulimit"] = ulimits so.FrontendAttrs["ulimit"] = ulimits
} }
// remember local state like directory path that is not sent to buildkit
so.Ref = identity.NewID()
if err := saveLocalState(so, opt, node, configDir); err != nil {
return nil, nil, err
}
return &so, releaseF, nil return &so, releaseF, nil
} }
@ -751,6 +749,9 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s
if err != nil { if err != nil {
return nil, err return nil, err
} }
if err := saveLocalState(so, k, opt, node, configDir); err != nil {
return nil, err
}
for k, v := range gitattrs { for k, v := range gitattrs {
so.FrontendAttrs[k] = v so.FrontendAttrs[k] = v
} }
@ -1645,43 +1646,6 @@ func noPrintFunc(opt map[string]Options) bool {
return true return true
} }
func saveLocalState(so client.SolveOpt, opt Options, node builder.Node, configDir string) error {
var err error
if so.Ref == "" {
return nil
}
lp := opt.Inputs.ContextPath
dp := opt.Inputs.DockerfilePath
if lp != "" || dp != "" {
if lp != "" {
lp, err = filepath.Abs(lp)
if err != nil {
return err
}
}
if dp != "" {
dp, err = filepath.Abs(dp)
if err != nil {
return err
}
}
ls, err := localstate.New(configDir)
if err != nil {
return err
}
if err := ls.SaveRef(node.Builder, node.Name, so.Ref, localstate.State{
LocalPath: lp,
DockerfilePath: dp,
}); err != nil {
return err
}
}
return nil
}
// ReadSourcePolicy reads a source policy from a file. // ReadSourcePolicy reads a source policy from a file.
// The file path is taken from EXPERIMENTAL_BUILDKIT_SOURCE_POLICY env var. // The file path is taken from EXPERIMENTAL_BUILDKIT_SOURCE_POLICY env var.
// if the env var is not set, this `returns nil, nil` // if the env var is not set, this `returns nil, nil`

43
build/localstate.go Normal file
View File

@ -0,0 +1,43 @@
package build
import (
"path/filepath"
"github.com/docker/buildx/builder"
"github.com/docker/buildx/localstate"
"github.com/moby/buildkit/client"
)
func saveLocalState(so *client.SolveOpt, target string, opts Options, node builder.Node, configDir string) error {
var err error
if so.Ref == "" {
return nil
}
lp := opts.Inputs.ContextPath
dp := opts.Inputs.DockerfilePath
if lp != "" || dp != "" {
if lp != "" {
lp, err = filepath.Abs(lp)
if err != nil {
return err
}
}
if dp != "" {
dp, err = filepath.Abs(dp)
if err != nil {
return err
}
}
l, err := localstate.New(configDir)
if err != nil {
return err
}
return l.SaveRef(node.Builder, node.Name, so.Ref, localstate.State{
Target: target,
LocalPath: lp,
DockerfilePath: dp,
GroupRef: opts.GroupRef,
})
}
return nil
}

View File

@ -11,6 +11,7 @@ import (
"github.com/docker/buildx/bake" "github.com/docker/buildx/bake"
"github.com/docker/buildx/build" "github.com/docker/buildx/build"
"github.com/docker/buildx/builder" "github.com/docker/buildx/builder"
"github.com/docker/buildx/localstate"
"github.com/docker/buildx/util/buildflags" "github.com/docker/buildx/util/buildflags"
"github.com/docker/buildx/util/cobrautil/completion" "github.com/docker/buildx/util/cobrautil/completion"
"github.com/docker/buildx/util/confutil" "github.com/docker/buildx/util/confutil"
@ -19,6 +20,7 @@ import (
"github.com/docker/buildx/util/progress" "github.com/docker/buildx/util/progress"
"github.com/docker/buildx/util/tracing" "github.com/docker/buildx/util/tracing"
"github.com/docker/cli/cli/command" "github.com/docker/cli/cli/command"
"github.com/moby/buildkit/identity"
"github.com/moby/buildkit/util/appcontext" "github.com/moby/buildkit/util/appcontext"
"github.com/moby/buildkit/util/progress/progressui" "github.com/moby/buildkit/util/progress/progressui"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -183,14 +185,16 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com
return err return err
} }
if in.printOnly { def := struct {
dt, err := json.MarshalIndent(struct {
Group map[string]*bake.Group `json:"group,omitempty"` Group map[string]*bake.Group `json:"group,omitempty"`
Target map[string]*bake.Target `json:"target"` Target map[string]*bake.Target `json:"target"`
}{ }{
grps, Group: grps,
tgts, Target: tgts,
}, "", " ") }
if in.printOnly {
dt, err := json.MarshalIndent(def, "", " ")
if err != nil { if err != nil {
return err return err
} }
@ -203,6 +207,28 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com
return nil return nil
} }
// local state group
groupRef := identity.NewID()
var refs []string
for k, b := range bo {
b.Ref = identity.NewID()
b.GroupRef = groupRef
refs = append(refs, b.Ref)
bo[k] = b
}
dt, err := json.Marshal(def)
if err != nil {
return err
}
if err := saveLocalStateGroup(dockerCli, groupRef, localstate.StateGroup{
Definition: dt,
Targets: targets,
Inputs: overrides,
Refs: refs,
}); err != nil {
return err
}
resp, err := build.Build(ctx, nodes, bo, dockerutil.NewClient(dockerCli), confutil.ConfigDir(dockerCli), printer) resp, err := build.Build(ctx, nodes, bo, dockerutil.NewClient(dockerCli), confutil.ConfigDir(dockerCli), printer)
if err != nil { if err != nil {
return wrapBuildError(err, true) return wrapBuildError(err, true)
@ -259,3 +285,11 @@ func bakeCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
return cmd return cmd
} }
func saveLocalStateGroup(dockerCli command.Cli, ref string, lsg localstate.StateGroup) error {
l, err := localstate.New(confutil.ConfigDir(dockerCli))
if err != nil {
return err
}
return l.SaveGroup(ref, lsg)
}

View File

@ -53,6 +53,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
InStream: inStream, InStream: inStream,
NamedContexts: contexts, NamedContexts: contexts,
}, },
Ref: in.Ref,
BuildArgs: in.BuildArgs, BuildArgs: in.BuildArgs,
CgroupParent: in.CgroupParent, CgroupParent: in.CgroupParent,
ExtraHosts: in.ExtraHosts, ExtraHosts: in.ExtraHosts,
@ -65,6 +66,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
Tags: in.Tags, Tags: in.Tags,
Target: in.Target, Target: in.Target,
Ulimits: controllerUlimitOpt2DockerUlimit(in.Ulimits), Ulimits: controllerUlimitOpt2DockerUlimit(in.Ulimits),
GroupRef: in.GroupRef,
} }
platforms, err := platformutil.Parse(in.Platforms) platforms, err := platformutil.Parse(in.Platforms)

View File

@ -299,6 +299,8 @@ type BuildOptions struct {
ExportPush bool `protobuf:"varint,26,opt,name=ExportPush,proto3" json:"ExportPush,omitempty"` ExportPush bool `protobuf:"varint,26,opt,name=ExportPush,proto3" json:"ExportPush,omitempty"`
ExportLoad bool `protobuf:"varint,27,opt,name=ExportLoad,proto3" json:"ExportLoad,omitempty"` ExportLoad bool `protobuf:"varint,27,opt,name=ExportLoad,proto3" json:"ExportLoad,omitempty"`
SourcePolicy *pb.Policy `protobuf:"bytes,28,opt,name=SourcePolicy,proto3" json:"SourcePolicy,omitempty"` SourcePolicy *pb.Policy `protobuf:"bytes,28,opt,name=SourcePolicy,proto3" json:"SourcePolicy,omitempty"`
Ref string `protobuf:"bytes,29,opt,name=Ref,proto3" json:"Ref,omitempty"`
GroupRef string `protobuf:"bytes,30,opt,name=GroupRef,proto3" json:"GroupRef,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -524,6 +526,20 @@ func (m *BuildOptions) GetSourcePolicy() *pb.Policy {
return nil return nil
} }
func (m *BuildOptions) GetRef() string {
if m != nil {
return m.Ref
}
return ""
}
func (m *BuildOptions) GetGroupRef() string {
if m != nil {
return m.GroupRef
}
return ""
}
type ExportEntry struct { type ExportEntry struct {
Type string `protobuf:"bytes,1,opt,name=Type,proto3" json:"Type,omitempty"` Type string `protobuf:"bytes,1,opt,name=Type,proto3" json:"Type,omitempty"`
Attrs map[string]string `protobuf:"bytes,2,rep,name=Attrs,proto3" json:"Attrs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Attrs map[string]string `protobuf:"bytes,2,rep,name=Attrs,proto3" json:"Attrs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
@ -2054,126 +2070,127 @@ func init() {
func init() { proto.RegisterFile("controller.proto", fileDescriptor_ed7f10298fa1d90f) } func init() { proto.RegisterFile("controller.proto", fileDescriptor_ed7f10298fa1d90f) }
var fileDescriptor_ed7f10298fa1d90f = []byte{ var fileDescriptor_ed7f10298fa1d90f = []byte{
// 1890 bytes of a gzipped FileDescriptorProto // 1909 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0x5f, 0x6f, 0xdb, 0xc8, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0x5f, 0x6f, 0xdb, 0xc8,
0x11, 0x2f, 0x25, 0x59, 0x7f, 0x46, 0x96, 0xe3, 0x6c, 0x9d, 0x74, 0xc3, 0xa4, 0x17, 0x87, 0x49, 0x11, 0x2f, 0x25, 0x59, 0x7f, 0x46, 0x96, 0xcf, 0xd9, 0x3a, 0xe9, 0x86, 0xc9, 0x25, 0x0e, 0x93,
0xae, 0x42, 0x53, 0x48, 0x77, 0xbe, 0xa6, 0xbe, 0x5c, 0xee, 0x80, 0xda, 0xb2, 0x05, 0xfb, 0x90, 0x5c, 0x85, 0xa6, 0x90, 0xee, 0x7c, 0x4d, 0x7d, 0xb9, 0xdc, 0x01, 0xb5, 0x65, 0xab, 0xf6, 0x21,
0xd8, 0xc6, 0xca, 0xc9, 0xa1, 0x2d, 0xd0, 0x80, 0x92, 0xd6, 0x32, 0x21, 0x8a, 0xab, 0x72, 0x57, 0xb1, 0x8d, 0x95, 0x93, 0x43, 0x5b, 0xa0, 0x07, 0x4a, 0x5a, 0xcb, 0x84, 0x28, 0xae, 0xca, 0x5d,
0xb6, 0xd5, 0xa7, 0x3e, 0xb4, 0x6f, 0x45, 0xbf, 0x47, 0xd1, 0x8f, 0xd0, 0x97, 0xf6, 0x1b, 0xf5, 0xd9, 0x56, 0x9f, 0xfa, 0xd0, 0xbe, 0x15, 0xfd, 0x1e, 0x45, 0x3f, 0x42, 0x9f, 0xfa, 0x85, 0x8a,
0x23, 0x14, 0xfb, 0x87, 0x14, 0x69, 0x89, 0xb2, 0xdd, 0x3e, 0x69, 0x67, 0xf8, 0xfb, 0xcd, 0xec, 0x7e, 0x84, 0x62, 0xff, 0x90, 0x22, 0x2d, 0x51, 0xb6, 0xdb, 0x27, 0xed, 0x0c, 0x7f, 0xbf, 0x99,
0x2c, 0x67, 0x67, 0x86, 0x82, 0xf5, 0x1e, 0x0b, 0x44, 0xc8, 0x7c, 0x9f, 0x86, 0x8d, 0x71, 0xc8, 0x9d, 0xe5, 0xec, 0xcc, 0x50, 0xb0, 0xde, 0x63, 0x81, 0x08, 0x99, 0xef, 0xd3, 0xb0, 0x31, 0x0e,
0x04, 0x43, 0x1b, 0xdd, 0x89, 0xe7, 0xf7, 0xaf, 0x1a, 0x89, 0x07, 0x17, 0x5f, 0xda, 0x6f, 0x07, 0x99, 0x60, 0x68, 0xa3, 0x3b, 0xf1, 0xfc, 0xfe, 0x55, 0x23, 0xf1, 0xe0, 0xe2, 0x0b, 0xfb, 0xed,
0x9e, 0x38, 0x9f, 0x74, 0x1b, 0x3d, 0x36, 0x6a, 0x8e, 0x58, 0x77, 0xda, 0x54, 0xa8, 0xa1, 0x27, 0xc0, 0x13, 0xe7, 0x93, 0x6e, 0xa3, 0xc7, 0x46, 0xcd, 0x11, 0xeb, 0x4e, 0x9b, 0x0a, 0x35, 0xf4,
0x9a, 0xee, 0xd8, 0x6b, 0x72, 0x1a, 0x5e, 0x78, 0x3d, 0xca, 0x9b, 0x86, 0x14, 0xfd, 0x6a, 0x93, 0x44, 0xd3, 0x1d, 0x7b, 0x4d, 0x4e, 0xc3, 0x0b, 0xaf, 0x47, 0x79, 0xd3, 0x90, 0xa2, 0x5f, 0x6d,
0xf6, 0xeb, 0x4c, 0x32, 0x67, 0x93, 0xb0, 0x47, 0xc7, 0xcc, 0xf7, 0x7a, 0xd3, 0xe6, 0xb8, 0xdb, 0xd2, 0x7e, 0x9d, 0x49, 0xe6, 0x6c, 0x12, 0xf6, 0xe8, 0x98, 0xf9, 0x5e, 0x6f, 0xda, 0x1c, 0x77,
0xd4, 0x2b, 0x4d, 0x73, 0xea, 0xb0, 0xf1, 0xce, 0xe3, 0xe2, 0x24, 0x64, 0x3d, 0xca, 0x39, 0xe5, 0x9b, 0x7a, 0xa5, 0x69, 0x4e, 0x1d, 0x36, 0xde, 0x79, 0x5c, 0x9c, 0x84, 0xac, 0x47, 0x39, 0xa7,
0x84, 0xfe, 0x61, 0x42, 0xb9, 0x40, 0xeb, 0x90, 0x27, 0xf4, 0x0c, 0x5b, 0x9b, 0x56, 0xbd, 0x42, 0x9c, 0xd0, 0x3f, 0x4c, 0x28, 0x17, 0x68, 0x1d, 0xf2, 0x84, 0x9e, 0x61, 0x6b, 0xd3, 0xaa, 0x57,
0xe4, 0xd2, 0x39, 0x81, 0x07, 0xd7, 0x90, 0x7c, 0xcc, 0x02, 0x4e, 0xd1, 0x36, 0xac, 0x1c, 0x06, 0x88, 0x5c, 0x3a, 0x27, 0x70, 0xff, 0x1a, 0x92, 0x8f, 0x59, 0xc0, 0x29, 0xda, 0x86, 0x95, 0xc3,
0x67, 0x8c, 0x63, 0x6b, 0x33, 0x5f, 0xaf, 0x6e, 0x3d, 0x6b, 0x2c, 0x0a, 0xae, 0x61, 0x78, 0x12, 0xe0, 0x8c, 0x71, 0x6c, 0x6d, 0xe6, 0xeb, 0xd5, 0xad, 0x67, 0x8d, 0x45, 0xc1, 0x35, 0x0c, 0x4f,
0x49, 0x34, 0xde, 0xe1, 0x50, 0x4d, 0x68, 0xd1, 0x13, 0xa8, 0x44, 0xe2, 0x9e, 0x71, 0x3c, 0x53, 0x22, 0x89, 0xc6, 0x3b, 0x1c, 0xaa, 0x09, 0x2d, 0x7a, 0x0c, 0x95, 0x48, 0xdc, 0x33, 0x8e, 0x67,
0xa0, 0x36, 0xac, 0x1e, 0x06, 0x17, 0x6c, 0x48, 0x5b, 0x2c, 0x38, 0xf3, 0x06, 0x38, 0xb7, 0x69, 0x0a, 0xd4, 0x86, 0xd5, 0xc3, 0xe0, 0x82, 0x0d, 0x69, 0x8b, 0x05, 0x67, 0xde, 0x00, 0xe7, 0x36,
0xd5, 0xab, 0x5b, 0xce, 0x62, 0x67, 0x49, 0x24, 0x49, 0xf1, 0x9c, 0xef, 0x01, 0xef, 0x79, 0xbc, 0xad, 0x7a, 0x75, 0xcb, 0x59, 0xec, 0x2c, 0x89, 0x24, 0x29, 0x9e, 0xf3, 0x1d, 0xe0, 0x3d, 0x8f,
0xc7, 0x82, 0x80, 0xf6, 0xa2, 0x60, 0x32, 0x83, 0x4e, 0xef, 0x29, 0x77, 0x6d, 0x4f, 0xce, 0x63, 0xf7, 0x58, 0x10, 0xd0, 0x5e, 0x14, 0x4c, 0x66, 0xd0, 0xe9, 0x3d, 0xe5, 0xae, 0xed, 0xc9, 0x79,
0x78, 0xb4, 0xc0, 0x96, 0x3e, 0x16, 0xe7, 0xf7, 0xb0, 0xba, 0x2b, 0xf7, 0x96, 0x6d, 0xfc, 0x5b, 0x04, 0x0f, 0x17, 0xd8, 0xd2, 0xc7, 0xe2, 0xfc, 0x1e, 0x56, 0x77, 0xe5, 0xde, 0xb2, 0x8d, 0x7f,
0x28, 0x1d, 0x8f, 0x85, 0xc7, 0x02, 0xbe, 0x3c, 0x1a, 0x65, 0xc6, 0x20, 0x49, 0x44, 0x71, 0xfe, 0x03, 0xa5, 0xe3, 0xb1, 0xf0, 0x58, 0xc0, 0x97, 0x47, 0xa3, 0xcc, 0x18, 0x24, 0x89, 0x28, 0xce,
0x55, 0x35, 0x0e, 0x8c, 0x02, 0x6d, 0x42, 0xb5, 0xc5, 0x02, 0x41, 0xaf, 0xc4, 0x89, 0x2b, 0xce, 0xbf, 0xab, 0xc6, 0x81, 0x51, 0xa0, 0x4d, 0xa8, 0xb6, 0x58, 0x20, 0xe8, 0x95, 0x38, 0x71, 0xc5,
0x8d, 0xa3, 0xa4, 0x0a, 0x7d, 0x0e, 0x6b, 0x7b, 0xac, 0x37, 0xa4, 0xe1, 0x99, 0xe7, 0xd3, 0x23, 0xb9, 0x71, 0x94, 0x54, 0xa1, 0xcf, 0x60, 0x6d, 0x8f, 0xf5, 0x86, 0x34, 0x3c, 0xf3, 0x7c, 0x7a,
0x77, 0x44, 0x4d, 0x48, 0xd7, 0xb4, 0xe8, 0x3b, 0x19, 0xb5, 0x17, 0x88, 0xf6, 0x24, 0xe8, 0xe1, 0xe4, 0x8e, 0xa8, 0x09, 0xe9, 0x9a, 0x16, 0x7d, 0x2b, 0xa3, 0xf6, 0x02, 0xd1, 0x9e, 0x04, 0x3d,
0xbc, 0xda, 0xda, 0xd3, 0xac, 0xb7, 0x6a, 0x60, 0x64, 0xc6, 0x40, 0xbf, 0x83, 0x9a, 0x34, 0xd3, 0x9c, 0x57, 0x5b, 0x7b, 0x9a, 0xf5, 0x56, 0x0d, 0x8c, 0xcc, 0x18, 0xe8, 0x77, 0x50, 0x93, 0x66,
0x37, 0xae, 0x39, 0x2e, 0xa8, 0xc4, 0x78, 0x7d, 0x73, 0x74, 0x8d, 0x14, 0x6f, 0x3f, 0x10, 0xe1, 0xfa, 0xc6, 0x35, 0xc7, 0x05, 0x95, 0x18, 0xaf, 0x6f, 0x8e, 0xae, 0x91, 0xe2, 0xed, 0x07, 0x22,
0x94, 0xa4, 0x6d, 0xa1, 0x0d, 0x58, 0xd9, 0xf1, 0x7d, 0x76, 0x89, 0x57, 0x36, 0xf3, 0xf5, 0x0a, 0x9c, 0x92, 0xb4, 0x2d, 0xb4, 0x01, 0x2b, 0x3b, 0xbe, 0xcf, 0x2e, 0xf1, 0xca, 0x66, 0xbe, 0x5e,
0xd1, 0x02, 0xfa, 0x15, 0x94, 0x76, 0x84, 0xa0, 0x5c, 0x70, 0x5c, 0x54, 0xce, 0x9e, 0x2c, 0x76, 0x21, 0x5a, 0x40, 0xbf, 0x84, 0xd2, 0x8e, 0x10, 0x94, 0x0b, 0x8e, 0x8b, 0xca, 0xd9, 0xe3, 0xc5,
0xa6, 0x41, 0x24, 0x02, 0xa3, 0x63, 0xa8, 0x28, 0xff, 0x3b, 0xe1, 0x80, 0xe3, 0x92, 0x62, 0x7e, 0xce, 0x34, 0x88, 0x44, 0x60, 0x74, 0x0c, 0x15, 0xe5, 0x7f, 0x27, 0x1c, 0x70, 0x5c, 0x52, 0xcc,
0x79, 0x8b, 0x6d, 0xc6, 0x1c, 0xbd, 0xc5, 0x99, 0x0d, 0xb4, 0x0f, 0x95, 0x96, 0xdb, 0x3b, 0xa7, 0x2f, 0x6e, 0xb1, 0xcd, 0x98, 0xa3, 0xb7, 0x38, 0xb3, 0x81, 0xf6, 0xa1, 0xd2, 0x72, 0x7b, 0xe7,
0xed, 0x90, 0x8d, 0x70, 0x59, 0x19, 0xfc, 0xd9, 0x62, 0x83, 0x0a, 0x66, 0x0c, 0x1a, 0x33, 0x31, 0xb4, 0x1d, 0xb2, 0x11, 0x2e, 0x2b, 0x83, 0x3f, 0x5d, 0x6c, 0x50, 0xc1, 0x8c, 0x41, 0x63, 0x26,
0x13, 0xed, 0x40, 0x49, 0x09, 0xa7, 0x0c, 0x57, 0xee, 0x66, 0x24, 0xe2, 0x21, 0x07, 0x56, 0x5b, 0x66, 0xa2, 0x1d, 0x28, 0x29, 0xe1, 0x94, 0xe1, 0xca, 0xdd, 0x8c, 0x44, 0x3c, 0xe4, 0xc0, 0x6a,
0x83, 0x90, 0x4d, 0xc6, 0x27, 0x6e, 0x48, 0x03, 0x81, 0x41, 0xbd, 0xea, 0x94, 0x0e, 0xbd, 0x85, 0x6b, 0x10, 0xb2, 0xc9, 0xf8, 0xc4, 0x0d, 0x69, 0x20, 0x30, 0xa8, 0x57, 0x9d, 0xd2, 0xa1, 0xb7,
0xd2, 0xfe, 0xd5, 0x98, 0x85, 0x82, 0xe3, 0xea, 0xb2, 0xcb, 0xab, 0x41, 0xc6, 0x81, 0x61, 0xa0, 0x50, 0xda, 0xbf, 0x1a, 0xb3, 0x50, 0x70, 0x5c, 0x5d, 0x76, 0x79, 0x35, 0xc8, 0x38, 0x30, 0x0c,
0xcf, 0x00, 0xf6, 0xaf, 0x44, 0xe8, 0x1e, 0x30, 0x79, 0xec, 0xab, 0xea, 0x75, 0x24, 0x34, 0xa8, 0xf4, 0x04, 0x60, 0xff, 0x4a, 0x84, 0xee, 0x01, 0x93, 0xc7, 0xbe, 0xaa, 0x5e, 0x47, 0x42, 0x83,
0x0d, 0xc5, 0x77, 0x6e, 0x97, 0xfa, 0x1c, 0xd7, 0x94, 0xed, 0xc6, 0x2d, 0x0e, 0x56, 0x13, 0xb4, 0xda, 0x50, 0x7c, 0xe7, 0x76, 0xa9, 0xcf, 0x71, 0x4d, 0xd9, 0x6e, 0xdc, 0xe2, 0x60, 0x35, 0x41,
0x23, 0xc3, 0x96, 0x79, 0x7d, 0x44, 0xc5, 0x25, 0x0b, 0x87, 0xef, 0x59, 0x9f, 0xe2, 0x35, 0x9d, 0x3b, 0x32, 0x6c, 0x99, 0xd7, 0x47, 0x54, 0x5c, 0xb2, 0x70, 0xf8, 0x9e, 0xf5, 0x29, 0x5e, 0xd3,
0xd7, 0x09, 0x15, 0x7a, 0x01, 0xb5, 0x23, 0xa6, 0x0f, 0xcf, 0xf3, 0x05, 0x0d, 0xf1, 0x3d, 0xb5, 0x79, 0x9d, 0x50, 0xa1, 0x17, 0x50, 0x3b, 0x62, 0xfa, 0xf0, 0x3c, 0x5f, 0xd0, 0x10, 0x7f, 0xa2,
0x99, 0xb4, 0x52, 0xdd, 0x65, 0xdf, 0x15, 0x67, 0x2c, 0x1c, 0x71, 0xbc, 0xae, 0x10, 0x33, 0x85, 0x36, 0x93, 0x56, 0xaa, 0xbb, 0xec, 0xbb, 0xe2, 0x8c, 0x85, 0x23, 0x8e, 0xd7, 0x15, 0x62, 0xa6,
0xcc, 0xa0, 0x0e, 0xed, 0x85, 0x54, 0x70, 0x7c, 0x7f, 0x59, 0x06, 0x69, 0x10, 0x89, 0xc0, 0x08, 0x90, 0x19, 0xd4, 0xa1, 0xbd, 0x90, 0x0a, 0x8e, 0xef, 0x2d, 0xcb, 0x20, 0x0d, 0x22, 0x11, 0x18,
0x43, 0xa9, 0x73, 0x3e, 0xea, 0x78, 0x7f, 0xa4, 0x18, 0x6d, 0x5a, 0xf5, 0x3c, 0x89, 0x44, 0xf4, 0x61, 0x28, 0x75, 0xce, 0x47, 0x1d, 0xef, 0x8f, 0x14, 0xa3, 0x4d, 0xab, 0x9e, 0x27, 0x91, 0x88,
0x0a, 0xf2, 0x9d, 0xce, 0x01, 0xfe, 0xb1, 0xb2, 0xf6, 0x28, 0xc3, 0x5a, 0xe7, 0x80, 0x48, 0x14, 0x5e, 0x41, 0xbe, 0xd3, 0x39, 0xc0, 0x3f, 0x56, 0xd6, 0x1e, 0x66, 0x58, 0xeb, 0x1c, 0x10, 0x89,
0x42, 0x50, 0x38, 0x75, 0x07, 0x1c, 0x6f, 0xa8, 0x7d, 0xa9, 0x35, 0x7a, 0x08, 0xc5, 0x53, 0x37, 0x42, 0x08, 0x0a, 0xa7, 0xee, 0x80, 0xe3, 0x0d, 0xb5, 0x2f, 0xb5, 0x46, 0x0f, 0xa0, 0x78, 0xea,
0x1c, 0x50, 0x81, 0x1f, 0xa8, 0x98, 0x8d, 0x84, 0xde, 0x40, 0xe9, 0x83, 0xef, 0x8d, 0x3c, 0xc1, 0x86, 0x03, 0x2a, 0xf0, 0x7d, 0x15, 0xb3, 0x91, 0xd0, 0x1b, 0x28, 0x7d, 0xf0, 0xbd, 0x91, 0x27,
0xf1, 0xc3, 0x65, 0x97, 0x53, 0x83, 0x8e, 0xc7, 0x82, 0x44, 0x78, 0xb9, 0x5b, 0x75, 0xde, 0x34, 0x38, 0x7e, 0xb0, 0xec, 0x72, 0x6a, 0xd0, 0xf1, 0x58, 0x90, 0x08, 0x2f, 0x77, 0xab, 0xce, 0x9b,
0xc4, 0x3f, 0x51, 0x36, 0x23, 0x51, 0x3e, 0x31, 0xc7, 0x85, 0xf1, 0xa6, 0x55, 0x2f, 0x93, 0x48, 0x86, 0xf8, 0x27, 0xca, 0x66, 0x24, 0xca, 0x27, 0xe6, 0xb8, 0x30, 0xde, 0xb4, 0xea, 0x65, 0x12,
0x94, 0x5b, 0x3b, 0x99, 0xf8, 0x3e, 0x7e, 0xa4, 0xd4, 0x6a, 0xad, 0xdf, 0xbd, 0x4c, 0x83, 0x93, 0x89, 0x72, 0x6b, 0x27, 0x13, 0xdf, 0xc7, 0x0f, 0x95, 0x5a, 0xad, 0xf5, 0xbb, 0x97, 0x69, 0x70,
0x09, 0x3f, 0xc7, 0xb6, 0x7a, 0x92, 0xd0, 0xcc, 0x9e, 0xbf, 0x63, 0x6e, 0x1f, 0x3f, 0x4e, 0x3e, 0x32, 0xe1, 0xe7, 0xd8, 0x56, 0x4f, 0x12, 0x9a, 0xd9, 0xf3, 0x77, 0xcc, 0xed, 0xe3, 0x47, 0xc9,
0x97, 0x1a, 0x74, 0x08, 0xab, 0x1d, 0xd5, 0x96, 0x4e, 0x54, 0x33, 0xc2, 0x4f, 0x54, 0x1c, 0x2f, 0xe7, 0x52, 0x83, 0x0e, 0x61, 0xb5, 0xa3, 0xda, 0xd2, 0x89, 0x6a, 0x46, 0xf8, 0xb1, 0x8a, 0xe3,
0x1b, 0xb2, 0x73, 0x35, 0xa2, 0xce, 0x25, 0x63, 0x48, 0x36, 0xaf, 0x86, 0x06, 0x93, 0x14, 0xd5, 0x65, 0x43, 0x76, 0xae, 0x46, 0xd4, 0xb9, 0x64, 0x0c, 0xc9, 0xe6, 0xd5, 0xd0, 0x60, 0x92, 0xa2,
0xfe, 0x35, 0xa0, 0xf9, 0xaa, 0x21, 0xab, 0xed, 0x90, 0x4e, 0xa3, 0x6a, 0x3b, 0xa4, 0x53, 0x59, 0x46, 0x75, 0xf5, 0xd3, 0x59, 0x5d, 0xb5, 0xa1, 0xfc, 0x6b, 0x99, 0xe4, 0x52, 0xfd, 0x44, 0xa9,
0x38, 0x2e, 0x5c, 0x7f, 0x12, 0xd5, 0x3c, 0x2d, 0x7c, 0x93, 0xfb, 0xda, 0xb2, 0xbf, 0x85, 0xb5, 0x63, 0xd9, 0xfe, 0x15, 0xa0, 0xf9, 0x1a, 0x23, 0x6d, 0x0c, 0xe9, 0x34, 0xaa, 0xcd, 0x43, 0x3a,
0xf4, 0x85, 0xbe, 0x13, 0xfb, 0x0d, 0x54, 0x13, 0x59, 0x7b, 0x17, 0xaa, 0xf3, 0x6f, 0x0b, 0xaa, 0x95, 0x65, 0xe6, 0xc2, 0xf5, 0x27, 0x51, 0x85, 0xd4, 0xc2, 0xd7, 0xb9, 0xaf, 0x2c, 0xfb, 0x1b,
0x89, 0xab, 0xa5, 0x92, 0x60, 0x3a, 0xa6, 0x86, 0xac, 0xd6, 0x68, 0x17, 0x56, 0x76, 0x84, 0x08, 0x58, 0x4b, 0x5f, 0xff, 0x3b, 0xb1, 0xdf, 0x40, 0x35, 0x91, 0xe3, 0x77, 0xa1, 0x3a, 0xff, 0xb2,
0x65, 0x8b, 0x90, 0x79, 0xf4, 0x8b, 0x1b, 0x2f, 0x68, 0x43, 0xc1, 0xf5, 0x15, 0xd2, 0x54, 0x79, 0xa0, 0x9a, 0xb8, 0x88, 0x2a, 0x65, 0xa6, 0x63, 0x6a, 0xc8, 0x6a, 0x8d, 0x76, 0x61, 0x65, 0x47,
0x83, 0xf6, 0x28, 0x17, 0x5e, 0xe0, 0xca, 0x5b, 0xa6, 0x2a, 0x7a, 0x85, 0x24, 0x55, 0xf6, 0xd7, 0x88, 0x50, 0x36, 0x14, 0x99, 0x75, 0x3f, 0xbf, 0xf1, 0x3a, 0x37, 0x14, 0x5c, 0x5f, 0x38, 0x4d,
0x00, 0x33, 0xda, 0x9d, 0x62, 0xf8, 0x87, 0x05, 0xf7, 0xe7, 0xaa, 0xd0, 0xc2, 0x48, 0x0e, 0xd2, 0x95, 0xf7, 0x6d, 0x8f, 0x72, 0xe1, 0x05, 0xae, 0xbc, 0x93, 0xaa, 0xfe, 0x57, 0x48, 0x52, 0x65,
0x91, 0x6c, 0xdd, 0xb2, 0xa2, 0xcd, 0xc7, 0xf3, 0x7f, 0xec, 0xf6, 0x08, 0x8a, 0xba, 0xf4, 0x2f, 0x7f, 0x05, 0x30, 0xa3, 0xdd, 0x29, 0x86, 0x7f, 0x58, 0x70, 0x6f, 0xae, 0x66, 0x2d, 0x8c, 0xe4,
0xdc, 0xa1, 0x0d, 0xe5, 0x3d, 0x8f, 0xbb, 0x5d, 0x9f, 0xf6, 0x15, 0xb5, 0x4c, 0x62, 0x59, 0xf5, 0x20, 0x1d, 0xc9, 0xd6, 0x2d, 0xeb, 0xdf, 0x7c, 0x3c, 0xff, 0xc7, 0x6e, 0x8f, 0xa0, 0xa8, 0x1b,
0x1d, 0xb5, 0x7b, 0x7d, 0x7a, 0x5a, 0x70, 0xf4, 0x1d, 0x47, 0x6b, 0x90, 0x8b, 0x67, 0x96, 0xdc, 0xc5, 0xc2, 0x1d, 0xda, 0x50, 0xde, 0xf3, 0xb8, 0xdb, 0xf5, 0x69, 0x5f, 0x51, 0xcb, 0x24, 0x96,
0xe1, 0x9e, 0x04, 0xcb, 0x86, 0xab, 0x43, 0xad, 0x10, 0x2d, 0x38, 0x6d, 0x28, 0xea, 0xaa, 0x31, 0x55, 0x97, 0x52, 0xbb, 0xd7, 0xa7, 0xa7, 0x05, 0x47, 0x57, 0x04, 0xb4, 0x06, 0xb9, 0x78, 0xc2,
0x87, 0xb7, 0xa1, 0xdc, 0xf6, 0x7c, 0xaa, 0xfa, 0xb6, 0xde, 0x73, 0x2c, 0xcb, 0xf0, 0xf6, 0x83, 0xc9, 0x1d, 0xee, 0x49, 0xb0, 0x6c, 0xcf, 0x3a, 0xd4, 0x0a, 0xd1, 0x82, 0xd3, 0x86, 0xa2, 0xae,
0x0b, 0xe3, 0x56, 0x2e, 0x9d, 0xed, 0x44, 0x7b, 0x96, 0x71, 0xa8, 0x4e, 0x6e, 0xe2, 0x50, 0xfd, 0x31, 0x73, 0x78, 0x1b, 0xca, 0x6d, 0xcf, 0xa7, 0xaa, 0xcb, 0xeb, 0x3d, 0xc7, 0xb2, 0x0c, 0x6f,
0xfb, 0x21, 0x14, 0xdb, 0x2c, 0x1c, 0xb9, 0xc2, 0x18, 0x33, 0x92, 0xe3, 0xc0, 0xda, 0x61, 0xc0, 0x3f, 0xb8, 0x30, 0x6e, 0xe5, 0xd2, 0xd9, 0x4e, 0x34, 0x73, 0x19, 0x87, 0xea, 0xfb, 0x26, 0x0e,
0xc7, 0xb4, 0x27, 0xb2, 0xc7, 0xbc, 0x63, 0xb8, 0x17, 0x63, 0xcc, 0x80, 0x97, 0x98, 0x53, 0xac, 0xd5, 0xed, 0x1f, 0x40, 0xb1, 0xcd, 0xc2, 0x91, 0x2b, 0x8c, 0x31, 0x23, 0x39, 0x0e, 0xac, 0x1d,
0xbb, 0xcf, 0x29, 0x7f, 0xb7, 0xa0, 0x12, 0x57, 0x22, 0xd4, 0x82, 0xa2, 0x7a, 0x1b, 0xd1, 0xb4, 0x06, 0x7c, 0x4c, 0x7b, 0x22, 0x7b, 0x28, 0x3c, 0x86, 0x4f, 0x62, 0x8c, 0x19, 0x07, 0x13, 0x53,
0xf8, 0xea, 0x86, 0xd2, 0xd5, 0xf8, 0xa8, 0xd0, 0xa6, 0x23, 0x68, 0xaa, 0xfd, 0x03, 0x54, 0x13, 0x8d, 0x75, 0xf7, 0xa9, 0xe6, 0xef, 0x16, 0x54, 0xe2, 0xba, 0x85, 0x5a, 0x50, 0x54, 0x6f, 0x23,
0xea, 0x05, 0x09, 0xb0, 0x95, 0x4c, 0x80, 0xcc, 0x52, 0xae, 0x9d, 0x24, 0xd3, 0x63, 0x0f, 0x8a, 0x9a, 0x2d, 0x5f, 0xdd, 0x50, 0xe8, 0x1a, 0x1f, 0x15, 0xda, 0xf4, 0x0f, 0x4d, 0xb5, 0xbf, 0x87,
0x5a, 0xb9, 0xf0, 0x58, 0x11, 0x14, 0x0e, 0xdc, 0x50, 0xa7, 0x46, 0x9e, 0xa8, 0xb5, 0xd4, 0x75, 0x6a, 0x42, 0xbd, 0x20, 0x01, 0xb6, 0x92, 0x09, 0x90, 0x59, 0xf8, 0xb5, 0x93, 0x64, 0x7a, 0xec,
0xd8, 0x99, 0x50, 0xaf, 0x27, 0x4f, 0xd4, 0xda, 0xf9, 0xa7, 0x05, 0x35, 0x33, 0xfa, 0x99, 0x13, 0x41, 0x51, 0x2b, 0x17, 0x1e, 0x2b, 0x82, 0xc2, 0x81, 0x1b, 0xea, 0xd4, 0xc8, 0x13, 0xb5, 0x96,
0xa4, 0xb0, 0xae, 0x6f, 0x28, 0x0d, 0x23, 0x9d, 0x89, 0xff, 0xcd, 0x92, 0xa3, 0x8c, 0xa0, 0x8d, 0xba, 0x0e, 0x3b, 0x13, 0xea, 0xf5, 0xe4, 0x89, 0x5a, 0x3b, 0xff, 0xb4, 0xa0, 0x66, 0x06, 0x45,
0xeb, 0x5c, 0x7d, 0x1a, 0x73, 0x26, 0xed, 0x16, 0x3c, 0x58, 0x08, 0xbd, 0xd3, 0x15, 0x79, 0x09, 0x73, 0x82, 0x14, 0xd6, 0xf5, 0x0d, 0xa5, 0x61, 0xa4, 0x33, 0xf1, 0xbf, 0x59, 0x72, 0x94, 0x11,
0xf7, 0x67, 0x43, 0x6d, 0x76, 0x9e, 0x6c, 0x00, 0x4a, 0xc2, 0xcc, 0xd0, 0xfb, 0x14, 0xaa, 0xf2, 0xb4, 0x71, 0x9d, 0xab, 0x4f, 0x63, 0xce, 0xa4, 0xdd, 0x82, 0xfb, 0x0b, 0xa1, 0x77, 0xba, 0x22,
0x23, 0x21, 0x9b, 0xe6, 0xc0, 0xaa, 0x06, 0x98, 0x93, 0x41, 0x50, 0x18, 0xd2, 0xa9, 0xce, 0x86, 0x2f, 0xe1, 0xde, 0x6c, 0x04, 0xce, 0xce, 0x93, 0x0d, 0x40, 0x49, 0x98, 0x19, 0x91, 0x9f, 0x42,
0x0a, 0x51, 0x6b, 0xe7, 0x6f, 0x96, 0x9c, 0xf5, 0xc7, 0x13, 0xf1, 0x9e, 0x72, 0xee, 0x0e, 0x64, 0x55, 0x7e, 0x52, 0x64, 0xd3, 0x1c, 0x58, 0xd5, 0x00, 0x73, 0x32, 0x08, 0x0a, 0x43, 0x3a, 0xd5,
0x02, 0x16, 0x0e, 0x03, 0x4f, 0x98, 0xec, 0xfb, 0x3c, 0x6b, 0xe6, 0x1f, 0x4f, 0x84, 0x84, 0x19, 0xd9, 0x50, 0x21, 0x6a, 0xed, 0xfc, 0xcd, 0x92, 0x5f, 0x06, 0xe3, 0x89, 0x78, 0x4f, 0x39, 0x77,
0xd6, 0xc1, 0x8f, 0x88, 0x62, 0xa1, 0x6d, 0x28, 0xec, 0xb9, 0xc2, 0x35, 0xb9, 0x90, 0x31, 0xe1, 0x07, 0x32, 0x01, 0x0b, 0x87, 0x81, 0x27, 0x4c, 0xf6, 0x7d, 0x96, 0xf5, 0x85, 0x30, 0x9e, 0x08,
0x48, 0x44, 0x82, 0x28, 0xc5, 0xdd, 0x92, 0xfc, 0xb0, 0x19, 0x4f, 0x84, 0xf3, 0x02, 0xd6, 0xaf, 0x09, 0x33, 0xac, 0x83, 0x1f, 0x11, 0xc5, 0x42, 0xdb, 0x50, 0xd8, 0x73, 0x85, 0x6b, 0x72, 0x21,
0x5b, 0x5f, 0x10, 0xda, 0x57, 0x50, 0x4d, 0x58, 0x51, 0xf7, 0xf6, 0xb8, 0xad, 0x00, 0x65, 0x22, 0x63, 0x1e, 0x92, 0x88, 0x04, 0x51, 0x8a, 0xbb, 0x25, 0xf9, 0x19, 0x34, 0x9e, 0x08, 0xe7, 0x05,
0x97, 0x32, 0xd6, 0x78, 0x23, 0xab, 0xda, 0x87, 0x73, 0x0f, 0x6a, 0xca, 0x74, 0x7c, 0x82, 0x7f, 0xac, 0x5f, 0xb7, 0xbe, 0x20, 0xb4, 0x2f, 0xa1, 0x9a, 0xb0, 0xa2, 0xee, 0xed, 0x71, 0x5b, 0x01,
0xca, 0x41, 0x29, 0x32, 0xb1, 0x9d, 0x8a, 0xfb, 0x59, 0x56, 0xdc, 0xf3, 0x21, 0xbf, 0x86, 0x82, 0xca, 0x44, 0x2e, 0x65, 0xac, 0xf1, 0x46, 0x56, 0xb5, 0x0f, 0xe7, 0x13, 0xa8, 0x29, 0xd3, 0xf1,
0xac, 0x1f, 0x26, 0xe4, 0x8c, 0xf1, 0xa0, 0xdd, 0x4f, 0xd0, 0x24, 0x1c, 0x7d, 0x07, 0x45, 0x42, 0x09, 0xfe, 0x29, 0x07, 0xa5, 0xc8, 0xc4, 0x76, 0x2a, 0xee, 0x67, 0x59, 0x71, 0xcf, 0x87, 0xfc,
0xb9, 0x1c, 0x65, 0xf4, 0xd0, 0xff, 0x7c, 0x31, 0x51, 0x63, 0x66, 0x64, 0x43, 0x92, 0xf4, 0x8e, 0x1a, 0x0a, 0xb2, 0x7e, 0x98, 0x90, 0x33, 0x86, 0x89, 0x76, 0x3f, 0x41, 0x93, 0x70, 0xf4, 0x2d,
0x37, 0x08, 0x5c, 0x1f, 0x17, 0x96, 0xd1, 0x35, 0x26, 0x41, 0xd7, 0x8a, 0xd9, 0x71, 0xff, 0xc5, 0x14, 0x09, 0xe5, 0x72, 0xf0, 0xd1, 0x9f, 0x08, 0xcf, 0x17, 0x13, 0x35, 0x66, 0x46, 0x36, 0x24,
0x82, 0xea, 0xd2, 0xa3, 0x5e, 0xfe, 0x59, 0x36, 0xf7, 0xa9, 0x98, 0xff, 0x1f, 0x3f, 0x15, 0xff, 0x49, 0xef, 0x78, 0x83, 0xc0, 0xf5, 0x71, 0x61, 0x19, 0x5d, 0x63, 0x12, 0x74, 0xad, 0x98, 0x1d,
0x9c, 0x4b, 0x1b, 0x52, 0x53, 0x8d, 0xbc, 0x4f, 0x63, 0xe6, 0x05, 0xc2, 0xa4, 0x6c, 0x42, 0x23, 0xf7, 0x5f, 0x2c, 0xa8, 0x2e, 0x3d, 0xea, 0xe5, 0x1f, 0x71, 0x73, 0x1f, 0x96, 0xf9, 0xff, 0xf1,
0x37, 0xda, 0x1a, 0xf5, 0x4d, 0xd1, 0x97, 0x4b, 0x79, 0xcd, 0x8e, 0x98, 0xd4, 0x55, 0x55, 0x1a, 0xc3, 0xf2, 0xcf, 0xb9, 0xb4, 0x21, 0x35, 0x03, 0xc9, 0xfb, 0x34, 0x66, 0x5e, 0x20, 0x4c, 0xca,
0x68, 0x61, 0x56, 0xd2, 0xf3, 0xa6, 0xa4, 0xcb, 0xd4, 0xf8, 0xc0, 0x69, 0xa8, 0x0e, 0xae, 0x42, 0x26, 0x34, 0x72, 0xa3, 0xad, 0x51, 0xdf, 0x14, 0x7d, 0xb9, 0x94, 0xd7, 0xec, 0x88, 0x49, 0x5d,
0xd4, 0x5a, 0x56, 0xf1, 0x23, 0xa6, 0xb4, 0x2b, 0x8a, 0x6c, 0x24, 0xe5, 0xe5, 0xb2, 0x8f, 0x8b, 0x55, 0xa5, 0x81, 0x16, 0x66, 0x25, 0x3d, 0x6f, 0x4a, 0xba, 0x4c, 0x8d, 0x0f, 0x9c, 0x86, 0xea,
0xfa, 0x38, 0x5a, 0x97, 0x91, 0x97, 0xcb, 0x3e, 0x2e, 0xc5, 0x5e, 0x2e, 0x95, 0x97, 0x53, 0x31, 0xe0, 0x2a, 0x44, 0xad, 0x65, 0x15, 0x3f, 0x62, 0x4a, 0xbb, 0xa2, 0xc8, 0x46, 0x52, 0x5e, 0x2e,
0xc5, 0x65, 0x9d, 0x80, 0xa7, 0x62, 0x2a, 0xdb, 0x0c, 0x61, 0xbe, 0xdf, 0x75, 0x7b, 0x43, 0x5c, 0xfb, 0xb8, 0xa8, 0x8f, 0xa3, 0x75, 0x19, 0x79, 0xb9, 0xec, 0xe3, 0x52, 0xec, 0xe5, 0x52, 0x79,
0xd1, 0xfd, 0x2d, 0x92, 0xe5, 0xfc, 0x27, 0xcf, 0xdc, 0x73, 0x7d, 0xf5, 0xa5, 0x50, 0x26, 0x91, 0x39, 0x15, 0x53, 0x5c, 0xd6, 0x09, 0x78, 0x2a, 0xa6, 0xb2, 0xcd, 0x10, 0xe6, 0xfb, 0x5d, 0xb7,
0xe8, 0xec, 0x40, 0x25, 0x4e, 0x15, 0xd9, 0xb9, 0xda, 0x7d, 0xf5, 0x2a, 0x6a, 0x24, 0xd7, 0xee, 0x37, 0xc4, 0x15, 0xdd, 0xdf, 0x22, 0x59, 0x4e, 0x8b, 0xf2, 0xcc, 0x3d, 0xd7, 0x57, 0xdf, 0x15,
0x47, 0x59, 0x9e, 0x9b, 0xcf, 0xf2, 0x7c, 0x22, 0xcb, 0xb7, 0xa1, 0x96, 0x4a, 0x1a, 0x09, 0x22, 0x65, 0x12, 0x89, 0xce, 0x0e, 0x54, 0xe2, 0x54, 0x91, 0x9d, 0xab, 0xdd, 0x57, 0xaf, 0xa2, 0x46,
0xec, 0x92, 0x1b, 0x43, 0x6a, 0x2d, 0x75, 0x2d, 0xe6, 0xeb, 0x6f, 0xe1, 0x1a, 0x51, 0x6b, 0xe7, 0x72, 0xed, 0x7e, 0x94, 0xe5, 0xb9, 0xf9, 0x2c, 0xcf, 0x27, 0xb2, 0x7c, 0x1b, 0x6a, 0xa9, 0xa4,
0x39, 0xd4, 0x52, 0xe9, 0xb2, 0xa8, 0x2e, 0x3b, 0xcf, 0xa0, 0xd6, 0x11, 0xae, 0x98, 0x2c, 0xf9, 0x91, 0x20, 0xc2, 0x2e, 0xb9, 0x31, 0xa4, 0xd6, 0x52, 0xd7, 0x62, 0xbe, 0xfe, 0x72, 0xae, 0x11,
0xf3, 0xe2, 0x3f, 0x16, 0xac, 0x45, 0x18, 0x53, 0x79, 0x7e, 0x09, 0xe5, 0x0b, 0x1a, 0x0a, 0x7a, 0xb5, 0x76, 0x9e, 0x43, 0x2d, 0x95, 0x2e, 0x8b, 0xea, 0xb2, 0xf3, 0x0c, 0x6a, 0x1d, 0xe1, 0x8a,
0x15, 0xf7, 0x22, 0x3c, 0x3f, 0x7e, 0x7e, 0x54, 0x08, 0x12, 0x23, 0xd1, 0x37, 0x50, 0xe6, 0xca, 0xc9, 0x92, 0xbf, 0x3a, 0xfe, 0x63, 0xc1, 0x5a, 0x84, 0x31, 0x95, 0xe7, 0x17, 0x50, 0xbe, 0xa0,
0x0e, 0x8d, 0xe6, 0x98, 0xcf, 0xb2, 0x58, 0xc6, 0x5f, 0x8c, 0x47, 0x4d, 0x28, 0xf8, 0x6c, 0xc0, 0xa1, 0xa0, 0x57, 0x71, 0x2f, 0xc2, 0xf3, 0xc3, 0xea, 0x47, 0x85, 0x20, 0x31, 0x12, 0x7d, 0x0d,
0xd5, 0x7b, 0xaf, 0x6e, 0x3d, 0xce, 0xe2, 0xbd, 0x63, 0x03, 0xa2, 0x80, 0xe8, 0x2d, 0x94, 0x2f, 0x65, 0xae, 0xec, 0xd0, 0x68, 0x8e, 0x79, 0x92, 0xc5, 0x32, 0xfe, 0x62, 0x3c, 0x6a, 0x42, 0xc1,
0xdd, 0x30, 0xf0, 0x82, 0x41, 0xf4, 0x0d, 0xfd, 0x34, 0x8b, 0xf4, 0x83, 0xc6, 0x91, 0x98, 0xe0, 0x67, 0x03, 0xae, 0xde, 0x7b, 0x75, 0xeb, 0x51, 0x16, 0xef, 0x1d, 0x1b, 0x10, 0x05, 0x44, 0x6f,
0xd4, 0xe4, 0x25, 0x3a, 0x63, 0xe6, 0x4c, 0x9c, 0xdf, 0xc8, 0x5c, 0x96, 0xa2, 0x09, 0xff, 0x10, 0xa1, 0x7c, 0xe9, 0x86, 0x81, 0x17, 0x0c, 0xa2, 0x2f, 0xee, 0xa7, 0x59, 0xa4, 0xef, 0x35, 0x8e,
0x6a, 0xfa, 0x3e, 0x7c, 0xa4, 0x21, 0x97, 0x53, 0xa1, 0xb5, 0xec, 0xce, 0xee, 0x26, 0xa1, 0x24, 0xc4, 0x04, 0xa7, 0x26, 0x2f, 0xd1, 0x19, 0x33, 0x67, 0xe2, 0xfc, 0x46, 0xe6, 0xb2, 0x14, 0x4d,
0xcd, 0x74, 0x3e, 0x99, 0x76, 0x17, 0x29, 0x64, 0x2e, 0x8d, 0xdd, 0xde, 0xd0, 0x1d, 0x44, 0xef, 0xf8, 0x87, 0x50, 0xd3, 0xf7, 0xe1, 0x23, 0x0d, 0xb9, 0x9c, 0x0a, 0xad, 0x65, 0x77, 0x76, 0x37,
0x29, 0x12, 0xe5, 0x93, 0x0b, 0xe3, 0x4f, 0x5f, 0xdb, 0x48, 0x94, 0xb9, 0x19, 0xd2, 0x0b, 0x8f, 0x09, 0x25, 0x69, 0xa6, 0xf3, 0x83, 0x69, 0x77, 0x91, 0x42, 0xe6, 0xd2, 0xd8, 0xed, 0x0d, 0xdd,
0xcf, 0x06, 0xd4, 0x58, 0xde, 0xfa, 0x6b, 0x09, 0xa0, 0x15, 0xef, 0x07, 0x9d, 0xc0, 0x8a, 0xf2, 0x41, 0xf4, 0x9e, 0x22, 0x51, 0x3e, 0xb9, 0x30, 0xfe, 0xf4, 0xb5, 0x8d, 0x44, 0x99, 0x9b, 0x21,
0x87, 0x9c, 0xa5, 0xcd, 0x53, 0xc5, 0x6d, 0x3f, 0xbf, 0x45, 0x83, 0x45, 0x1f, 0x65, 0xf2, 0xab, 0xbd, 0xf0, 0xf8, 0x6c, 0x40, 0x8d, 0xe5, 0xad, 0xbf, 0x96, 0x00, 0x5a, 0xf1, 0x7e, 0xd0, 0x09,
0xa1, 0x07, 0xbd, 0xc8, 0x2a, 0x13, 0xc9, 0xb9, 0xc9, 0x7e, 0x79, 0x03, 0xca, 0xd8, 0xfd, 0x00, 0xac, 0x28, 0x7f, 0xc8, 0x59, 0xda, 0x3c, 0x55, 0xdc, 0xf6, 0xf3, 0x5b, 0x34, 0x58, 0xf4, 0x51,
0x45, 0x9d, 0x05, 0x28, 0xab, 0x16, 0x26, 0xf3, 0xd6, 0x7e, 0xb1, 0x1c, 0xa4, 0x8d, 0x7e, 0x61, 0x26, 0xbf, 0x1a, 0x7a, 0xd0, 0x8b, 0xac, 0x32, 0x91, 0x9c, 0x9b, 0xec, 0x97, 0x37, 0xa0, 0x8c,
0x21, 0x62, 0x2a, 0x25, 0x72, 0x96, 0xb4, 0x42, 0x73, 0x63, 0xb2, 0x0e, 0x20, 0xd5, 0x75, 0xea, 0xdd, 0x0f, 0x50, 0xd4, 0x59, 0x80, 0xb2, 0x6a, 0x61, 0x32, 0x6f, 0xed, 0x17, 0xcb, 0x41, 0xda,
0x16, 0xfa, 0x1e, 0x8a, 0xba, 0xd6, 0xa1, 0x9f, 0x2e, 0x26, 0x44, 0xf6, 0x96, 0x3f, 0xae, 0x5b, 0xe8, 0xe7, 0x16, 0x22, 0xa6, 0x52, 0x22, 0x67, 0x49, 0x2b, 0x34, 0x37, 0x26, 0xeb, 0x00, 0x52,
0x5f, 0x58, 0xe8, 0x3d, 0x14, 0x64, 0x93, 0x47, 0x19, 0x1d, 0x2b, 0x31, 0x21, 0xd8, 0xce, 0x32, 0x5d, 0xa7, 0x6e, 0xa1, 0xef, 0xa0, 0xa8, 0x6b, 0x1d, 0xfa, 0x74, 0x31, 0x21, 0xb2, 0xb7, 0xfc,
0x88, 0x39, 0xc5, 0x4f, 0x00, 0xb3, 0x51, 0x03, 0x65, 0xfc, 0x13, 0x32, 0x37, 0xb3, 0xd8, 0xf5, 0x71, 0xdd, 0xfa, 0xdc, 0x42, 0xef, 0xa1, 0x20, 0x9b, 0x3c, 0xca, 0xe8, 0x58, 0x89, 0x09, 0xc1,
0x9b, 0x81, 0xc6, 0xc1, 0x7b, 0xd9, 0x67, 0xcf, 0x18, 0xca, 0xec, 0xb0, 0xf1, 0x35, 0xb2, 0x9d, 0x76, 0x96, 0x41, 0xcc, 0x29, 0xfe, 0x00, 0x30, 0x1b, 0x35, 0x50, 0xc6, 0xff, 0x26, 0x73, 0x33,
0x65, 0x10, 0x63, 0xee, 0x1c, 0x6a, 0xa9, 0x7f, 0x4a, 0xd1, 0xcf, 0xb3, 0x83, 0xbc, 0xfe, 0xc7, 0x8b, 0x5d, 0xbf, 0x19, 0x68, 0x1c, 0xbc, 0x97, 0x7d, 0xf6, 0x8c, 0xa1, 0xcc, 0x0e, 0x1b, 0x5f,
0xab, 0xfd, 0xea, 0x56, 0x58, 0xe3, 0x49, 0x24, 0x67, 0x35, 0xf3, 0x18, 0x35, 0x6e, 0x8a, 0x3b, 0x23, 0xdb, 0x59, 0x06, 0x31, 0xe6, 0xce, 0xa1, 0x96, 0xfa, 0x5f, 0x15, 0xfd, 0x2c, 0x3b, 0xc8,
0xfd, 0xaf, 0xa7, 0xdd, 0xbc, 0x35, 0x5e, 0x7b, 0xdd, 0x2d, 0xfc, 0x36, 0x37, 0xee, 0x76, 0x8b, 0xeb, 0x7f, 0xd3, 0xda, 0xaf, 0x6e, 0x85, 0x35, 0x9e, 0x44, 0x72, 0x56, 0x33, 0x8f, 0x51, 0xe3,
0xea, 0x0f, 0xe4, 0xaf, 0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x18, 0x4b, 0xe5, 0x8f, 0xde, 0x16, 0xa6, 0xb8, 0xd3, 0xff, 0x91, 0xda, 0xcd, 0x5b, 0xe3, 0xb5, 0xd7, 0xdd, 0xc2, 0x6f, 0x73, 0xe3,
0x00, 0x00, 0x6e, 0xb7, 0xa8, 0xfe, 0x6e, 0xfe, 0xf2, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x12, 0x75, 0xc9,
0x38, 0x0c, 0x17, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

View File

@ -77,6 +77,8 @@ message BuildOptions {
bool ExportPush = 26; bool ExportPush = 26;
bool ExportLoad = 27; bool ExportLoad = 27;
moby.buildkit.v1.sourcepolicy.Policy SourcePolicy = 28; moby.buildkit.v1.sourcepolicy.Policy SourcePolicy = 28;
string Ref = 29;
string GroupRef = 30;
} }
message ExportEntry { message ExportEntry {

View File

@ -1,19 +1,43 @@
package localstate package localstate
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt"
"os" "os"
"path/filepath" "path/filepath"
"sync"
"github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/pkg/ioutils"
"github.com/pkg/errors" "github.com/pkg/errors"
"golang.org/x/sync/errgroup"
) )
const refsDir = "refs" const (
refsDir = "refs"
groupDir = "__group__"
)
type State struct { type State struct {
// Target is the name of the invoked target (default if empty)
Target string
// LocalPath is the absolute path to the context
LocalPath string LocalPath string
// DockerfilePath is the absolute path to the Dockerfile
DockerfilePath string DockerfilePath string
// GroupRef is the ref of the state group that this ref belongs to
GroupRef string `json:",omitempty"`
}
type StateGroup struct {
// Definition is the raw representation of the group (bake definition)
Definition []byte
// Targets are the targets invoked
Targets []string `json:",omitempty"`
// Inputs are the user inputs (bake overrides)
Inputs []string `json:",omitempty"`
// Refs are used to track all the refs that belong to the same group
Refs []string
} }
type LocalState struct { type LocalState struct {
@ -62,11 +86,61 @@ func (ls *LocalState) SaveRef(builderName, nodeName, id string, st State) error
return ioutils.AtomicWriteFile(filepath.Join(refDir, id), dt, 0600) return ioutils.AtomicWriteFile(filepath.Join(refDir, id), dt, 0600)
} }
func (ls *LocalState) ReadGroup(id string) (*StateGroup, error) {
dt, err := os.ReadFile(filepath.Join(ls.root, refsDir, groupDir, id))
if err != nil {
return nil, err
}
var stg StateGroup
if err := json.Unmarshal(dt, &stg); err != nil {
return nil, err
}
return &stg, nil
}
func (ls *LocalState) SaveGroup(id string, stg StateGroup) error {
refDir := filepath.Join(ls.root, refsDir, groupDir)
if err := os.MkdirAll(refDir, 0700); err != nil {
return err
}
dt, err := json.Marshal(stg)
if err != nil {
return err
}
return ioutils.AtomicWriteFile(filepath.Join(refDir, id), dt, 0600)
}
func (ls *LocalState) RemoveBuilder(builderName string) error { func (ls *LocalState) RemoveBuilder(builderName string) error {
if builderName == "" { if builderName == "" {
return errors.Errorf("builder name empty") return errors.Errorf("builder name empty")
} }
return os.RemoveAll(filepath.Join(ls.root, refsDir, builderName))
dir := filepath.Join(ls.root, refsDir, builderName)
if _, err := os.Lstat(dir); err != nil {
if !os.IsNotExist(err) {
return err
}
return nil
}
fis, err := os.ReadDir(dir)
if err != nil {
return err
}
eg, _ := errgroup.WithContext(context.TODO())
for _, fi := range fis {
func(fi os.DirEntry) {
eg.Go(func() error {
return ls.RemoveBuilderNode(builderName, fi.Name())
})
}(fi)
}
if err := eg.Wait(); err != nil {
return err
}
return os.RemoveAll(dir)
} }
func (ls *LocalState) RemoveBuilderNode(builderName string, nodeName string) error { func (ls *LocalState) RemoveBuilderNode(builderName string, nodeName string) error {
@ -76,7 +150,76 @@ func (ls *LocalState) RemoveBuilderNode(builderName string, nodeName string) err
if nodeName == "" { if nodeName == "" {
return errors.Errorf("node name empty") return errors.Errorf("node name empty")
} }
return os.RemoveAll(filepath.Join(ls.root, refsDir, builderName, nodeName))
dir := filepath.Join(ls.root, refsDir, builderName, nodeName)
if _, err := os.Lstat(dir); err != nil {
if !os.IsNotExist(err) {
return err
}
return nil
}
fis, err := os.ReadDir(dir)
if err != nil {
return err
}
var murefs sync.Mutex
grefs := make(map[string][]string)
srefs := make(map[string][]string)
eg, _ := errgroup.WithContext(context.TODO())
for _, fi := range fis {
func(fi os.DirEntry) {
eg.Go(func() error {
st, err := ls.ReadRef(builderName, nodeName, fi.Name())
if err != nil {
return err
}
if st.GroupRef == "" {
return nil
}
murefs.Lock()
defer murefs.Unlock()
if _, ok := grefs[st.GroupRef]; !ok {
if grp, err := ls.ReadGroup(st.GroupRef); err == nil {
grefs[st.GroupRef] = grp.Refs
}
}
srefs[st.GroupRef] = append(srefs[st.GroupRef], fmt.Sprintf("%s/%s/%s", builderName, nodeName, fi.Name()))
return nil
})
}(fi)
}
if err := eg.Wait(); err != nil {
return err
}
for gid, refs := range grefs {
if s, ok := srefs[gid]; ok {
if len(s) != len(refs) {
continue
}
if err := ls.removeGroup(gid); err != nil {
return err
}
}
}
return os.RemoveAll(dir)
}
func (ls *LocalState) removeGroup(id string) error {
if id == "" {
return errors.Errorf("group ref empty")
}
f := filepath.Join(ls.root, refsDir, groupDir, id)
if _, err := os.Lstat(f); err != nil {
if !os.IsNotExist(err) {
return err
}
return nil
}
return os.Remove(f)
} }
func (ls *LocalState) validate(builderName, nodeName, id string) error { func (ls *LocalState) validate(builderName, nodeName, id string) error {

View File

@ -0,0 +1,99 @@
package localstate
import (
"path/filepath"
"testing"
"github.com/stretchr/testify/require"
)
func TestNew(t *testing.T) {
_ = newls(t)
}
func TestReadRef(t *testing.T) {
l := newls(t)
r, err := l.ReadRef(testBuilderName, testNodeName, testStateRefID)
require.NoError(t, err)
require.Equal(t, testStateRef, *r)
}
func TestReadGroup(t *testing.T) {
l := newls(t)
g, err := l.ReadGroup(testStateGroupID)
require.NoError(t, err)
require.Equal(t, testStateGroup, *g)
}
func TestRemoveBuilder(t *testing.T) {
l := newls(t)
require.NoError(t, l.RemoveBuilder(testBuilderName))
}
func TestRemoveBuilderNode(t *testing.T) {
l := newls(t)
require.NoError(t, l.RemoveBuilderNode(testBuilderName, testNodeName))
}
func newls(t *testing.T) *LocalState {
t.Helper()
tmpdir := t.TempDir()
l, err := New(tmpdir)
require.NoError(t, err)
require.DirExists(t, filepath.Join(tmpdir, refsDir))
require.Equal(t, tmpdir, l.root)
require.NoError(t, l.SaveRef(testBuilderName, testNodeName, testStateRefID, testStateRef))
require.NoError(t, l.SaveGroup(testStateGroupID, testStateGroup))
require.NoError(t, l.SaveRef(testBuilderName, testNodeName, testStateGroupRef1ID, testStateGroupRef1))
require.NoError(t, l.SaveRef(testBuilderName, testNodeName, testStateGroupRef2ID, testStateGroupRef2))
require.NoError(t, l.SaveRef(testBuilderName, testNodeName, testStateGroupRef3ID, testStateGroupRef3))
return l
}
var (
testBuilderName = "builder"
testNodeName = "builder0"
testStateRefID = "32n3ffqrxjw41ok5zxd2qhume"
testStateRef = State{
Target: "default",
LocalPath: "/home/foo/github.com/docker/docker-bake-action",
DockerfilePath: "/home/foo/github.com/docker/docker-bake-action/dev.Dockerfile",
}
testStateGroupID = "kvqs0sgly2rmitz84r25u9qd0"
testStateGroup = StateGroup{
Definition: []byte(`{"group":{"default":{"targets":["pre-checkin"]},"pre-checkin":{"targets":["vendor-update","format","build"]}},"target":{"build":{"context":".","dockerfile":"dev.Dockerfile","target":"build-update","platforms":["linux/amd64"],"output":["."]},"format":{"context":".","dockerfile":"dev.Dockerfile","target":"format-update","platforms":["linux/amd64"],"output":["."]},"vendor-update":{"context":".","dockerfile":"dev.Dockerfile","target":"vendor-update","platforms":["linux/amd64"],"output":["."]}}}`),
Targets: []string{"pre-checkin"},
Inputs: []string{"*.platform=linux/amd64"},
Refs: []string{"builder/builder0/hx2qf1w11qvz1x3k471c5i8xw", "builder/builder0/968zj0g03jmlx0s8qslnvh6rl", "builder/builder0/naf44f9i1710lf7y12lv5hb1z"},
}
testStateGroupRef1ID = "hx2qf1w11qvz1x3k471c5i8xw"
testStateGroupRef1 = State{
Target: "format",
LocalPath: "/home/foo/github.com/docker/docker-bake-action",
DockerfilePath: "/home/foo/github.com/docker/docker-bake-action/dev.Dockerfile",
GroupRef: "kvqs0sgly2rmitz84r25u9qd0",
}
testStateGroupRef2ID = "968zj0g03jmlx0s8qslnvh6rl"
testStateGroupRef2 = State{
Target: "build",
LocalPath: "/home/foo/github.com/docker/docker-bake-action",
DockerfilePath: "/home/foo/github.com/docker/docker-bake-action/dev.Dockerfile",
GroupRef: "kvqs0sgly2rmitz84r25u9qd0",
}
testStateGroupRef3ID = "naf44f9i1710lf7y12lv5hb1z"
testStateGroupRef3 = State{
Target: "vendor-update",
LocalPath: "/home/foo/github.com/docker/docker-bake-action",
DockerfilePath: "/home/foo/github.com/docker/docker-bake-action/dev.Dockerfile",
GroupRef: "kvqs0sgly2rmitz84r25u9qd0",
}
)