//go:build integration package builder import ( "context" "strings" "testing" ) func TestABuildNeedingTheRegistryIsRefusedOnAnAgentWithoutOne(t *testing.T) { none := Npmrc{Machine: "workstation"} cases := map[string]struct { manifest string files map[string]string held map[string]string }{ "a package": {aPackage, map[string]string{"package.json": `{"name":"@novox/mesh-sdk","version":"0.1.0"}`}, nil}, "an image naming .npmrc": {withBoth, map[string]string{ "Dockerfile": "FROM scratch\nCOPY .npmrc /root/.npmrc\n", "files/x": "y"}, nil}, "a TypeScript bundle depending on the SDK": {aBundle, map[string]string{ "index.ts": "console.log(1)", "package.json": `{"dependencies":{"@novox/mesh-sdk":"^0.1.0"}}`}, map[string]string{"mesh-tools/build": "registry.invalid/mesh-tools/build@sha256:" + strings.Repeat("b", 64)}}, } for name, c := range cases { t.Run(name, func(t *testing.T) { r, workspace := aRepository(t, c.manifest, c.files) var said []string _, err := Build(context.Background(), compiling{r}.run, r, "https://forge.invalid/m.git", "", "", workspace, c.held, none, GitCredential{}, func(step, message string) { said = append(said, step+": "+message) }) if err == nil { t.Fatal("built with no package registry") } for _, want := range []string{"workstation", "npm-package-registry", "unbound", "gitea"} { if !strings.Contains(err.Error(), want) { t.Errorf("the refusal does not say %q: %v", want, err) } } for _, line := range r.ran { if strings.HasPrefix(line, "docker build") || strings.HasPrefix(line, "docker run") || strings.HasPrefix(line, "docker pull") { t.Errorf("something was built after the refusal: %s", line) } } if len(r.images) != 0 || len(r.archives) != 0 { t.Errorf("something was published after the refusal: %v %v", r.images, r.archives) } if !strings.Contains(strings.Join(said, "\n"), "REFUSED") { t.Errorf("the build's log does not say it was refused:\n%s", strings.Join(said, "\n")) } }) } // A Go artifact builds on the same agent. files := aSharedRepository("one", "1") manifest := `{"module":"ctl","version":"1","build":{"artifacts":[ {"name":"controller","kind":"bundle","language":"go","system":"arch","from":"cmd/ctl","binary":"ctl"}]}, "resources":[{"id":"controller","type":"process","name":"ctl","artifact":"controller","run":["./ctl"]}]}` r := &recorded{contents: map[string]string{ManifestName: manifest}} for k, v := range files { r.contents[k] = v } held := map[string]string{"mesh-tools-go/build": "registry.invalid/mesh-tools-go/build@sha256:" + strings.Repeat("b", 64)} if _, err := Build(context.Background(), onTrunk{recorded: r}.run, r, "https://forge.invalid/ctl.git", "", "", t.TempDir(), held, none, GitCredential{}, nil); err != nil { t.Fatalf("a Go artifact did not build on an agent without the registry: %v", err) } // And an image that does not name .npmrc. r, workspace := aRepository(t, withBoth, map[string]string{"Dockerfile": "FROM scratch\nCOPY . .", "files/x": "y"}) if _, err := Build(context.Background(), r.run, r, "https://forge.invalid/meshboard.git", "", "", workspace, nil, none, GitCredential{}, nil); err != nil { t.Fatalf("an image not naming .npmrc did not build on an agent without the registry: %v", err) } } func TestABuildSaysWhichRegistryItResolvedFrom(t *testing.T) { for _, from := range []string{FromBinding, FromGenesis} { r, workspace := aRepository(t, aPackage, map[string]string{ "package.json": `{"name":"@novox/mesh-sdk","version":"0.1.0"}`, }) n := Npmrc{Scope: "@novox", Registry: "http://127.0.0.1:3000/api/packages/novox/npm/", Username: "mesh-builder", Password: "p", From: from, Machine: "anchor"} var said []string if _, err := Build(context.Background(), r.run, r, "https://forge.invalid/mesh-sdk.git", "", "", workspace, nil, n, GitCredential{}, func(step, message string) { said = append(said, step+": "+message) }); err != nil { t.Fatalf("%s: %v", from, err) } if !strings.Contains(strings.Join(said, "\n"), "from "+from) { t.Errorf("the log does not say the registry came from %s:\n%s", from, strings.Join(said, "\n")) } } }