From 53dd95444bd5280c5a3beb610cb18a02e2a625f9 Mon Sep 17 00:00:00 2001 From: "stuart.warren" Date: Mon, 10 Feb 2025 14:58:45 +0000 Subject: [PATCH 1/2] fix: permit selecting a different tar filter for artifacts permit working with ubuntu core ref: #165 --- cmd/spread/main.go | 6 ++++++ spread/client.go | 4 ++-- spread/runner.go | 19 +++++++++++++++++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/cmd/spread/main.go b/cmd/spread/main.go index 57ac5e2f..552f8e76 100644 --- a/cmd/spread/main.go +++ b/cmd/spread/main.go @@ -31,6 +31,7 @@ var ( restore = flag.Bool("restore", false, "Run only the restore scripts") discard = flag.Bool("discard", false, "Discard reused servers without running") artifacts = flag.String("artifacts", "", "Where to store task artifacts") + tarFilter = flag.String("tar-filter", "xz", "Which tar filter to use for artifacts xz|gzip|bz2") seed = flag.Int64("seed", 0, "Seed for job order permutation") repeat = flag.Int("repeat", 0, "Number of times to repeat each task") garbageCollect = flag.Bool("gc", false, "Garbage collect backend resources when possible") @@ -79,6 +80,10 @@ func run() error { } } + tarfilter, ok := spread.TarFilters[*tarFilter] + if !ok { + return fmt.Errorf("unknown tar-filter %q", *tarFilter) + } options := &spread.Options{ Password: password, Filter: filter, @@ -93,6 +98,7 @@ func run() error { Restore: *restore, Discard: *discard, Artifacts: *artifacts, + TarFilter: tarfilter, Seed: *seed, Repeat: *repeat, GarbageCollect: *garbageCollect, diff --git a/spread/client.go b/spread/client.go index 3c4e25f2..727b0cd6 100644 --- a/spread/client.go +++ b/spread/client.go @@ -635,7 +635,7 @@ func (c *Client) SendTar(tar io.Reader, unpackDir string) error { return nil } -func (c *Client) RecvTar(packDir string, include []string, tar io.Writer) error { +func (c *Client) RecvTar(packDir string, include []string, tarFilter TarFilter, tar io.Writer) error { session, err := c.sshc.NewSession() if err != nil { return err @@ -657,7 +657,7 @@ func (c *Client) RecvTar(packDir string, include []string, tar io.Writer) error var stderr safeBuffer session.Stdout = tar session.Stderr = &stderr - cmd := fmt.Sprintf(`%s/bin/tar -C %q -cJ --sort=name --ignore-failed-read -- %s`, c.sudo(), packDir, strings.Join(args, " ")) + cmd := fmt.Sprintf(`%s/bin/tar -C %q -c%s --sort=name --ignore-failed-read -- %s`, c.sudo(), packDir, tarFilter, strings.Join(args, " ")) err = c.runCommand(session, cmd, nil, &stderr) if err != nil { return outputErr(stderr.Bytes(), err) diff --git a/spread/runner.go b/spread/runner.go index ec006c35..449efabf 100644 --- a/spread/runner.go +++ b/spread/runner.go @@ -18,6 +18,20 @@ import ( "math/rand" ) +type TarFilter string + +const ( + XZ TarFilter = "J" + GZip TarFilter = "z" + Bzip2 TarFilter = "j" +) + +var TarFilters map[string]TarFilter = map[string]TarFilter{ + "xz": XZ, + "gzip": GZip, + "bz2": Bzip2, +} + type Options struct { Password string Filter Filter @@ -32,6 +46,7 @@ type Options struct { Resend bool Discard bool Artifacts string + TarFilter TarFilter Seed int64 Repeat int GarbageCollect bool @@ -827,7 +842,7 @@ func (r *Runner) fetchArtifacts(client *Client, job *Job) error { tarr, tarw := io.Pipe() var stderr bytes.Buffer - cmd := exec.Command("tar", "xJ") + cmd := exec.Command("tar", "x"+string(r.options.TarFilter)) cmd.Dir = localDir cmd.Stdin = tarr cmd.Stderr = &stderr @@ -839,7 +854,7 @@ func (r *Runner) fetchArtifacts(client *Client, job *Job) error { printf("Fetching artifacts of %s...", job) remoteDir := filepath.Join(r.project.RemotePath, job.Task.Name) - err = client.RecvTar(remoteDir, job.Task.Artifacts, tarw) + err = client.RecvTar(remoteDir, job.Task.Artifacts, r.options.TarFilter, tarw) tarw.Close() terr := cmd.Wait() From f2e781526b5cf17808bbb6f3fe35bbae1faf7c88 Mon Sep 17 00:00:00 2001 From: "stuart.warren" Date: Tue, 11 Feb 2025 18:38:22 +0000 Subject: [PATCH 2/2] docs: update readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 91f6ab7c..6e8247bf 100644 --- a/README.md +++ b/README.md @@ -756,6 +756,8 @@ hold it after the job is executed. Residual content is fetched whether the job finishes successfully or not, and even if some of the provided paths are missing. +By default artifacts are fetched and compressed using `xz`. If this is +unavailable use the `-tar-filter` flag specifying an option, eg `gzip`.