Skip to content

Commit ad1c306

Browse files
committed
add --build-host flag for remote builds
1 parent 7ba2f92 commit ad1c306

2 files changed

Lines changed: 23 additions & 8 deletions

File tree

src/lib.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,18 @@ type JobSpec struct {
2020
User string `json:"user"` // ssh user
2121
}
2222

23-
func buildClosure(flake string, spec JobSpec) (string, error) {
23+
func buildClosure(flake string, spec JobSpec, builder string) (string, error) {
2424
expr := fmt.Sprintf("%s#%sConfigurations.%s.config.system.build.toplevel", flake, spec.Type, spec.Output)
2525

26-
data, err := runJSON("nix", "build", "--no-link", "--json", expr)
26+
var data []byte
27+
var err error
28+
29+
if builder != "localhost" {
30+
data, err = runJSON("nix", "build", "--no-link", "--json", "--store", fmt.Sprintf("ssh-ng://%s", builder), expr)
31+
} else {
32+
data, err = runJSON("nix", "build", "--no-link", "--json", expr)
33+
}
34+
2735
if err != nil {
2836
return "", fmt.Errorf("Failed to build %s: %v", spec.Output, err)
2937
}
@@ -36,6 +44,10 @@ func buildClosure(flake string, spec JobSpec) (string, error) {
3644
out, ok := res[0].Outputs["out"]
3745
if !ok {
3846
return "", fmt.Errorf("Missing 'out' for %s", spec.Output)
47+
} else if builder != "localhost" {
48+
if _, err := run("nix", "copy", "--from", "ssh-ng://"+builder, out, "--no-check-sigs"); err != nil {
49+
return "", fmt.Errorf("Error copying from %s: %v", builder, err)
50+
}
3951
}
4052

4153
return out, nil
@@ -59,7 +71,7 @@ func deployClosure(name string, spec JobSpec, outs map[string]string, op string)
5971
cmds = append(cmds, []string{"ssh", target, "sudo", path + "/bin/switch-to-configuration", op})
6072
}
6173

62-
if _, err := run("nix", "copy", "--to", "ssh://"+target, path); err != nil {
74+
if _, err := run("nix", "copy", "--to", "ssh-ng://"+target, path); err != nil {
6375
return fmt.Errorf("error copying to %s: %v", target, err)
6476
}
6577

src/main.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,21 @@ func main() {
3232
cfgDefault = "deployments.nix"
3333
}
3434

35-
flakeFlag := flag.String("flake", flakeDefault, "Flake URL or path.")
36-
opFlag := flag.String("operation", opDefault, "Operation to perform.")
35+
buildHostFlag := flag.String("build-host", "localhost", "Build closures on a specified remote host instead of locally.")
3736
cfgFlag := flag.String("deployments", cfgDefault, "Path to deployments file.")
37+
flakeFlag := flag.String("flake", flakeDefault, "Flake URL or path.")
3838
jobsFlag := flag.String("jobs", "", "Filtered, comma-separated subset of deployment jobs to run.")
39+
opFlag := flag.String("operation", opDefault, "Operation to perform.")
3940
skipFlag := flag.String("skip", "", "Comma-separated list of deployment jobs to skip.")
4041
verboseFlag := flag.Bool("verbose", false, "Enable verbose output.")
4142

4243
flag.Parse()
4344

44-
flake := *flakeFlag
45-
op := *opFlag
45+
buildHost := *buildHostFlag
4646
cfg := *cfgFlag
47+
flake := *flakeFlag
4748
jobFilter := *jobsFlag
49+
op := *opFlag
4850
skipFilter := *skipFlag
4951
verbose := *verboseFlag
5052

@@ -114,7 +116,8 @@ func main() {
114116
outs := make(map[string]string, len(jobs))
115117
for name, spec := range jobs {
116118
verboseInfo(verbose, "Building %s#%s...", flake, spec.Output)
117-
out, err := buildClosure(flake, spec)
119+
120+
out, err := buildClosure(flake, spec, buildHost)
118121
if err != nil {
119122
fatal("Failure building closures: %v", err)
120123
}

0 commit comments

Comments
 (0)