diff --git a/pkg/build/buildkit/build.go b/pkg/build/buildkit/build.go index bc6bcb3..4deb29a 100644 --- a/pkg/build/buildkit/build.go +++ b/pkg/build/buildkit/build.go @@ -230,6 +230,25 @@ func generateContainerfile(w io.Writer, image string, tsuruYamlHooks *build.Tsur return err } +func findAndReadTsuruYaml(tmpDir string) (string, error) { + contextDir := filepath.Join(tmpDir, "context") + + // Try all possible Tsuru YAML filenames + for _, filename := range build.TsuruYamlNames { + tsuruYamlPath := filepath.Join(contextDir, filename) + if _, err := os.Stat(tsuruYamlPath); err == nil { + tsuruYamlData, err := os.ReadFile(tsuruYamlPath) + if err != nil { + return "", fmt.Errorf("failed to read %s: %w", filename, err) + } + return string(tsuruYamlData), nil + } + } + + // No Tsuru YAML file found, return empty string (not an error) + return "", nil +} + func (b *BuildKit) buildFromContainerImage(ctx context.Context, c *client.Client, r *pb.BuildRequest, w console.File) (*pb.TsuruConfig, error) { if err := ctx.Err(); err != nil { return nil, err @@ -462,6 +481,16 @@ func (b *BuildKit) buildFromContainerFile(ctx context.Context, c *client.Client, return nil, err } + if tc.TsuruYaml == "" { + tsuruYamlData, err := findAndReadTsuruYaml(tmpDir) + if err != nil { + return nil, err + } + if tsuruYamlData != "" { + tc.TsuruYaml = tsuruYamlData + } + } + tc.ImageConfig = ic return tc, nil diff --git a/pkg/build/buildkit/build_test.go b/pkg/build/buildkit/build_test.go index 62d9dcc..d814d67 100644 --- a/pkg/build/buildkit/build_test.go +++ b/pkg/build/buildkit/build_test.go @@ -697,6 +697,43 @@ kubernetes: }, appFiles) }) + t.Run("Extract tsuru.yaml from context when is not present on container fs", func(t *testing.T) { + destImage := baseRegistry(t, "my-app", "") + + dockerfile, err := os.ReadFile("./testdata/tsuru-files-from-context/Dockerfile") + require.NoError(t, err) + + req := &pb.BuildRequest{ + Kind: pb.BuildKind_BUILD_KIND_APP_BUILD_WITH_CONTAINER_FILE, + App: &pb.TsuruApp{ + Name: "my-app", + }, + DestinationImages: []string{destImage}, + Containerfile: string(dockerfile), + Data: compressGZIP(t, "./testdata/tsuru-files-from-context/"), + PushOptions: &pb.PushOptions{ + InsecureRegistry: registryHTTP, + }, + } + + appFiles, err := NewBuildKit(bc, BuildKitOptions{TempDir: t.TempDir()}).Build(context.TODO(), req, os.Stdout) + require.NoError(t, err) + assert.Equal(t, &pb.TsuruConfig{ + Procfile: "", + TsuruYaml: `healthcheck: + path: /healthz + interval_seconds: 3 + timeout_seconds: 1 + ports: + - port: 443 +`, + ImageConfig: &pb.ContainerImageConfig{ + Cmd: []string{"echo", "Hello from Tsuru files from context!"}, + WorkingDir: "/tmp", + }, + }, appFiles) + }) + t.Run("Dockerfile mounting the app's env vars", func(t *testing.T) { destImage := baseRegistry(t, "my-app", "") diff --git a/pkg/build/buildkit/testdata/tsuru-files-from-context/Dockerfile b/pkg/build/buildkit/testdata/tsuru-files-from-context/Dockerfile new file mode 100644 index 0000000..9b681db --- /dev/null +++ b/pkg/build/buildkit/testdata/tsuru-files-from-context/Dockerfile @@ -0,0 +1,4 @@ +FROM busybox:latest + +WORKDIR /tmp +CMD ["echo", "Hello from Tsuru files from context!"] \ No newline at end of file diff --git a/pkg/build/buildkit/testdata/tsuru-files-from-context/Procfile b/pkg/build/buildkit/testdata/tsuru-files-from-context/Procfile new file mode 100644 index 0000000..1033112 --- /dev/null +++ b/pkg/build/buildkit/testdata/tsuru-files-from-context/Procfile @@ -0,0 +1 @@ +web: my-server --addr 0.0.0.0:${PORT} \ No newline at end of file diff --git a/pkg/build/buildkit/testdata/tsuru-files-from-context/tsuru.yaml b/pkg/build/buildkit/testdata/tsuru-files-from-context/tsuru.yaml new file mode 100644 index 0000000..0f07bd4 --- /dev/null +++ b/pkg/build/buildkit/testdata/tsuru-files-from-context/tsuru.yaml @@ -0,0 +1,6 @@ +healthcheck: + path: /healthz + interval_seconds: 3 + timeout_seconds: 1 + ports: + - port: 443