From b71378db826d3ce61cccf6038507d9efc69f1739 Mon Sep 17 00:00:00 2001 From: Max Horstmann Date: Wed, 18 Nov 2020 10:42:08 -0500 Subject: [PATCH] (Go version) Multi platform build (#319) --- .github/workflows/build.yml | 3 +- .gitignore | 1 - build/build.go | 75 +++++++++++++++++++++++++++++++++++++ cmd/blackbox/cli.go | 7 ++-- pkg/bbutil/umask_posix.go | 11 ++++++ pkg/bbutil/umask_windows.go | 9 +++++ pkg/crypters/gnupg/gnupg.go | 9 ++--- 7 files changed, 104 insertions(+), 11 deletions(-) create mode 100644 build/build.go create mode 100644 pkg/bbutil/umask_posix.go create mode 100644 pkg/bbutil/umask_windows.go diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 73e1a63..79cb739 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,8 +20,7 @@ jobs: with: go-version: ^1.15 - name: Build binaries - working-directory: cmd/blackbox - run: go build + run: go run build/build.go - name: Run unit tests run: go test ./... - name: Run integration tests diff --git a/.gitignore b/.gitignore index 21f230d..2140328 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,6 @@ __pycache__/ # Distribution / packaging .Python env/ -build/ develop-eggs/ dist/ eggs/ diff --git a/build/build.go b/build/build.go new file mode 100644 index 0000000..062168b --- /dev/null +++ b/build/build.go @@ -0,0 +1,75 @@ +package main + +import ( + "flag" + "fmt" + "log" + "os" + "os/exec" + "strings" + "time" +) + +var sha = flag.String("sha", "", "SHA of current commit") + +var goos = flag.String("os", "", "OS to build (linux, windows, or darwin) Defaults to all.") + +func main() { + flag.Parse() + flags := fmt.Sprintf(`-s -w -X main.SHA="%s" -X main.BuildTime=%d`, getVersion(), time.Now().Unix()) + pkg := "github.com/StackExchange/blackbox/v2/cmd/blackbox" + + build := func(out, goos string) { + log.Printf("Building %s", out) + cmd := exec.Command("go", "build", "-o", out, "-ldflags", flags, pkg) + os.Setenv("GOOS", goos) + os.Setenv("GO111MODULE", "on") + cmd.Stderr = os.Stderr + cmd.Stdout = os.Stdout + err := cmd.Run() + if err != nil { + log.Fatal(err) + } + } + + for _, env := range []struct { + binary, goos string + }{ + {"blackbox-Linux", "linux"}, + {"blackbox.exe", "windows"}, + {"blackbox-Darwin", "darwin"}, + } { + if *goos == "" || *goos == env.goos { + build(env.binary, env.goos) + } + } +} + +func getVersion() string { + if *sha != "" { + return *sha + } + // check teamcity build version + if v := os.Getenv("BUILD_VCS_NUMBER"); v != "" { + return v + } + // check git + cmd := exec.Command("git", "rev-parse", "HEAD") + v, err := cmd.CombinedOutput() + if err != nil { + return "" + } + ver := strings.TrimSpace(string(v)) + // see if dirty + cmd = exec.Command("git", "diff-index", "--quiet", "HEAD", "--") + err = cmd.Run() + // exit status 1 indicates dirty tree + if err != nil { + if err.Error() == "exit status 1" { + ver += "[dirty]" + } else { + log.Printf("!%s!", err.Error()) + } + } + return ver +} diff --git a/cmd/blackbox/cli.go b/cmd/blackbox/cli.go index 74a252f..50f90ac 100644 --- a/cmd/blackbox/cli.go +++ b/cmd/blackbox/cli.go @@ -4,9 +4,10 @@ package main import ( "fmt" - "syscall" "github.com/urfave/cli/v2" + + "github.com/StackExchange/blackbox/v2/pkg/bbutil" ) func flags() *cli.App { @@ -14,8 +15,8 @@ func flags() *cli.App { app.Version = "2.0.0" app.Usage = "Maintain encrypted files in a VCS (Git, Hg, Svn)" - defUmask := syscall.Umask(0) - syscall.Umask(defUmask) + defUmask := bbutil.Umask(0) + bbutil.Umask(defUmask) defUmaskS := fmt.Sprintf("%04o", defUmask) app.Flags = []cli.Flag{ diff --git a/pkg/bbutil/umask_posix.go b/pkg/bbutil/umask_posix.go new file mode 100644 index 0000000..13bddd2 --- /dev/null +++ b/pkg/bbutil/umask_posix.go @@ -0,0 +1,11 @@ +// +build !windows + +package bbutil + +import "syscall" + +// Umask is a no-op on Windows, and calls syscall.Umask on all other +// systems. On Windows it returns 0, which is a decoy. +func Umask(mask int) int { + return syscall.Umask(mask) +} diff --git a/pkg/bbutil/umask_windows.go b/pkg/bbutil/umask_windows.go new file mode 100644 index 0000000..1188a1b --- /dev/null +++ b/pkg/bbutil/umask_windows.go @@ -0,0 +1,9 @@ +// +build windows + +package bbutil + +// Umask is a no-op on Windows, and calls syscall.Umask on all other +// systems. On Windows it returns 0, which is a decoy. +func Umask(mask int) int { + return 0o000 +} diff --git a/pkg/crypters/gnupg/gnupg.go b/pkg/crypters/gnupg/gnupg.go index d2c961e..b29f4b5 100644 --- a/pkg/crypters/gnupg/gnupg.go +++ b/pkg/crypters/gnupg/gnupg.go @@ -7,7 +7,6 @@ import ( "os" "os/exec" "path/filepath" - "syscall" "github.com/StackExchange/blackbox/v2/pkg/bblog" "github.com/StackExchange/blackbox/v2/pkg/bbutil" @@ -66,9 +65,9 @@ func (crypt CrypterHandle) Decrypt(filename string, umask int, overwrite bool) e } a = append(a, filename+".gpg") - oldumask := syscall.Umask(umask) + oldumask := bbutil.Umask(umask) err := bbutil.RunBash(crypt.GPGCmd, a...) - syscall.Umask(oldumask) + bbutil.Umask(oldumask) return err } @@ -118,10 +117,10 @@ func (crypt CrypterHandle) Encrypt(filename string, umask int, receivers []strin a = append(a, filename) //err = bbutil.RunBash("ls", "-la") - oldumask := syscall.Umask(umask) + oldumask := bbutil.Umask(umask) crypt.logDebug.Printf("Args = %q", a) err = bbutil.RunBash(crypt.GPGCmd, a...) - syscall.Umask(oldumask) + bbutil.Umask(oldumask) return encrypted, err }