From c96b6a6ab0dc789e4aae49116f12c31c49571b01 Mon Sep 17 00:00:00 2001 From: Dimitris Sotirakis Date: Mon, 17 Oct 2022 18:23:57 +0300 Subject: [PATCH] CI: Move `CreateTempFile` - use it for `rpm`/`deb` packages (#56990) * Move CreateTempFile - use it for rpm/deb packages * Fix typo * Fix tests: --- pkg/build/cmd/publishpackages.go | 6 +++++- pkg/build/fsutil/createtempfile.go | 26 +++++++++++++++++++++++ pkg/build/fsutil/createtempfile_test.go | 28 +++++++++++++++++++++++++ pkg/build/gpg/gpg.go | 19 ++++------------- pkg/build/packaging/deb.go | 7 +++++-- pkg/build/packaging/rpm.go | 7 +++++-- 6 files changed, 73 insertions(+), 20 deletions(-) create mode 100644 pkg/build/fsutil/createtempfile.go create mode 100644 pkg/build/fsutil/createtempfile_test.go diff --git a/pkg/build/cmd/publishpackages.go b/pkg/build/cmd/publishpackages.go index d66067d99c4..3971c65a497 100644 --- a/pkg/build/cmd/publishpackages.go +++ b/pkg/build/cmd/publishpackages.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/grafana/grafana/pkg/build/config" + "github.com/grafana/grafana/pkg/build/fsutil" "github.com/grafana/grafana/pkg/build/gcloud" "github.com/grafana/grafana/pkg/build/gpg" "github.com/grafana/grafana/pkg/build/packaging" @@ -68,7 +69,10 @@ func PublishPackages(c *cli.Context) error { // In test release mode, the operator should configure different GCS buckets for the package repos, // so should be safe. if cfg.ReleaseMode.Mode == config.TagMode { - workDir := os.TempDir() + workDir, err := fsutil.CreateTempFile("") + if err != nil { + return err + } defer func() { if err := os.RemoveAll(workDir); err != nil { log.Printf("Failed to remove temporary directory %q: %s\n", workDir, err.Error()) diff --git a/pkg/build/fsutil/createtempfile.go b/pkg/build/fsutil/createtempfile.go new file mode 100644 index 00000000000..e75dd11677d --- /dev/null +++ b/pkg/build/fsutil/createtempfile.go @@ -0,0 +1,26 @@ +package fsutil + +import ( + "fmt" + "os" +) + +// CreateTempFile generates a temp filepath, based on the provided suffix. +// A typical generated path looks like /var/folders/abcd/abcdefg/A/1137975807. +func CreateTempFile(sfx string) (string, error) { + var suffix string + if sfx != "" { + suffix = fmt.Sprintf("*-%s", sfx) + } else { + suffix = sfx + } + f, err := os.CreateTemp("", suffix) + if err != nil { + return "", err + } + if err := f.Close(); err != nil { + return "", err + } + + return f.Name(), nil +} diff --git a/pkg/build/fsutil/createtempfile_test.go b/pkg/build/fsutil/createtempfile_test.go new file mode 100644 index 00000000000..53da94f7481 --- /dev/null +++ b/pkg/build/fsutil/createtempfile_test.go @@ -0,0 +1,28 @@ +package fsutil + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestCreateTempFile(t *testing.T) { + t.Run("empty suffix, expects pattern like: /var/folders/abcd/abcdefg/A/1137975807", func(t *testing.T) { + filePath, err := CreateTempFile("") + require.NoError(t, err) + + pathParts := strings.Split(filePath, "/") + require.Greater(t, len(pathParts), 1) + require.Len(t, strings.Split(pathParts[len(pathParts)-1], "-"), 1) + }) + + t.Run("non-empty suffix, expects /var/folders/abcd/abcdefg/A/1137975807-foobar", func(t *testing.T) { + filePath, err := CreateTempFile("foobar") + require.NoError(t, err) + + pathParts := strings.Split(filePath, "/") + require.Greater(t, len(pathParts), 1) + require.Len(t, strings.Split(pathParts[len(pathParts)-1], "-"), 2) + }) +} diff --git a/pkg/build/gpg/gpg.go b/pkg/build/gpg/gpg.go index 3b4ad47091c..59f96722014 100644 --- a/pkg/build/gpg/gpg.go +++ b/pkg/build/gpg/gpg.go @@ -7,34 +7,23 @@ import ( "os" "github.com/grafana/grafana/pkg/build/config" + "github.com/grafana/grafana/pkg/build/fsutil" ) -func createTempFile(sfx string) (string, error) { - f, err := os.CreateTemp("", fmt.Sprintf("*-%s", sfx)) - if err != nil { - return "", err - } - if err := f.Close(); err != nil { - return "", err - } - - return f.Name(), nil -} - // LoadGPGKeys loads GPG key pair and password from the environment and writes them to corresponding files. // // The passed config's GPG fields also get updated. Make sure to call RemoveGPGFiles at application exit. func LoadGPGKeys(cfg *config.Config) error { var err error - cfg.GPGPrivateKey, err = createTempFile("priv.key") + cfg.GPGPrivateKey, err = fsutil.CreateTempFile("priv.key") if err != nil { return err } - cfg.GPGPublicKey, err = createTempFile("pub.key") + cfg.GPGPublicKey, err = fsutil.CreateTempFile("pub.key") if err != nil { return err } - cfg.GPGPassPath, err = createTempFile("") + cfg.GPGPassPath, err = fsutil.CreateTempFile("") if err != nil { return err } diff --git a/pkg/build/packaging/deb.go b/pkg/build/packaging/deb.go index bae93282e69..78158296e91 100644 --- a/pkg/build/packaging/deb.go +++ b/pkg/build/packaging/deb.go @@ -5,11 +5,11 @@ import ( "log" "os" "os/exec" - "path" "path/filepath" "strings" "github.com/grafana/grafana/pkg/build/config" + "github.com/grafana/grafana/pkg/build/fsutil" "github.com/grafana/grafana/pkg/infra/fs" "github.com/urfave/cli/v2" ) @@ -122,7 +122,10 @@ func UpdateDebRepo(cfg PublishConfig, workDir string) error { repoName = "beta" } - repoRoot := path.Join(os.TempDir(), "deb-repo") + repoRoot, err := fsutil.CreateTempFile("deb-repo") + if err != nil { + return err + } defer func() { if err := os.RemoveAll(repoRoot); err != nil { log.Printf("Failed to remove temporary directory %q: %s\n", repoRoot, err.Error()) diff --git a/pkg/build/packaging/rpm.go b/pkg/build/packaging/rpm.go index a75ba9d6b1e..a361f28aded 100644 --- a/pkg/build/packaging/rpm.go +++ b/pkg/build/packaging/rpm.go @@ -7,11 +7,11 @@ import ( "log" "os" "os/exec" - "path" "path/filepath" "strings" "github.com/grafana/grafana/pkg/build/config" + "github.com/grafana/grafana/pkg/build/fsutil" "github.com/grafana/grafana/pkg/infra/fs" "golang.org/x/crypto/openpgp" "golang.org/x/crypto/openpgp/armor" @@ -32,7 +32,10 @@ func UpdateRPMRepo(cfg PublishConfig, workDir string) error { return err } - repoRoot := path.Join(os.TempDir(), "rpm-repo") + repoRoot, err := fsutil.CreateTempFile("rpm-repo") + if err != nil { + return err + } defer func() { if err := os.RemoveAll(repoRoot); err != nil { log.Printf("Failed to remove %q: %s\n", repoRoot, err.Error())