Files
homarr/tools/homarr-dev/internal/run/build.go
T

96 lines
2.9 KiB
Go

package run
import (
"context"
"fmt"
"io"
"os"
"os/exec"
"path/filepath"
"strings"
"github.com/homarr-labs/homarr/tools/homarr-dev/internal/docker"
)
func BuildCurrentImage(tag, directory string) error {
return buildCurrentImage(context.Background(), tag, directory, os.Stdout, os.Stderr)
}
func buildCurrentImage(ctx context.Context, tag, directory string, stdout, stderr io.Writer) error {
options, err := CurrentBuildOptions(ctx, tag, directory)
if err != nil {
return err
}
return docker.BuildContext(ctx, options, stdout, stderr)
}
func BuildPRImage(number int, tag string) error {
return buildPRImage(context.Background(), number, tag, os.Stdout, os.Stderr)
}
func buildPRImage(ctx context.Context, number int, tag string, stdout, stderr io.Writer) error {
options, cleanup, err := PRBuildOptions(ctx, number, tag, func(line string) {
_, _ = fmt.Fprintln(stdout, line)
})
if err != nil {
return err
}
defer cleanup()
return docker.BuildContext(ctx, options, stdout, stderr)
}
func prFetchArgs(repoURL, refSpec string) []string {
return []string{"fetch", "--depth=1", repoURL, refSpec}
}
func RebuildImage(image docker.Image) error {
return RebuildImageContext(context.Background(), image, os.Stdout, os.Stderr)
}
func RebuildImageContext(ctx context.Context, image docker.Image, stdout, stderr io.Writer) error {
if image.PRNumber > 0 {
return buildPRImage(ctx, image.PRNumber, image.Tag, stdout, stderr)
}
if image.Source == "" {
return fmt.Errorf("homarr:%s has no build source metadata", image.Tag)
}
if info, err := os.Stat(image.Source); err != nil || !info.IsDir() {
return fmt.Errorf("build source %s is no longer available", image.Source)
}
return buildCurrentImage(ctx, image.Tag, image.Source, stdout, stderr)
}
func checkoutDetails(ctx context.Context, directory string) (root string, revision string, err error) {
cmdRoot := exec.CommandContext(ctx, "git", "-C", directory, "rev-parse", "--show-toplevel")
cmdRoot.Env = append(
os.Environ(),
"MISE_TRUSTED_CONFIG_PATHS=*",
"MISE_QUIET=1",
"MISE_SILENT=1",
"MISE_YES=1",
"MISE_OVERRIDE_CONFIG_FILENAMES=",
)
rootOutput, err := cmdRoot.CombinedOutput()
if err != nil {
return "", "", fmt.Errorf("find Homarr checkout: %w: %s", err, strings.TrimSpace(string(rootOutput)))
}
root = strings.TrimSpace(string(rootOutput))
if _, err := os.Stat(filepath.Join(root, "Dockerfile")); err != nil {
return "", "", fmt.Errorf("%s is not a Homarr checkout", root)
}
cmdRev := exec.CommandContext(ctx, "git", "-C", root, "rev-parse", "HEAD")
cmdRev.Env = append(
os.Environ(),
"MISE_TRUSTED_CONFIG_PATHS=*",
"MISE_QUIET=1",
"MISE_SILENT=1",
"MISE_YES=1",
"MISE_OVERRIDE_CONFIG_FILENAMES=",
)
revisionOutput, err := cmdRev.CombinedOutput()
if err != nil {
return "", "", fmt.Errorf("read checkout revision: %w: %s", err, strings.TrimSpace(string(revisionOutput)))
}
return root, strings.TrimSpace(string(revisionOutput)), nil
}