Skip to content

Commit b1721e8

Browse files
author
Dan Brakeley
committed
embed build version in released binaries
1 parent 38fcc09 commit b1721e8

4 files changed

Lines changed: 97 additions & 7 deletions

File tree

.github/workflows/release.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,7 @@ jobs:
1818
goversion: "1.17.2"
1919
project_path: "./cmd/p4harmonize"
2020
extra_files: LICENSE.txt README.md
21+
ldflags:
22+
'-X "github.com/danbrakeley/actiontest/internal/buildvar.Version=${{ github.event.release.tag_name }}" -X
23+
"github.com/danbrakeley/actiontest/internal/buildvar.BuildTime=${{ github.event.release.created_at }}" -X
24+
"github.com/danbrakeley/actiontest/internal/buildvar.ReleaseURL=${{ github.event.release.html_url }}"'

cmd/p4harmonize/main.go

Lines changed: 65 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,49 @@ package main
22

33
import (
44
"flag"
5+
"fmt"
56
"os"
7+
"strings"
68
"time"
79

810
"github.com/danbrakeley/frog"
11+
"github.com/proletariatgames/p4harmonize/internal/buildvar"
912
)
1013

11-
var (
12-
// config will be loaded from the first extant file from this list
13-
configFileNames = []string{
14-
"config.toml",
15-
"config.tml",
14+
func PrintUsage() {
15+
version := "<local build>"
16+
if len(buildvar.Version) > 0 {
17+
version = buildvar.Version
18+
}
19+
buildTime := "<not set>"
20+
if len(buildvar.BuildTime) > 0 {
21+
buildTime = buildvar.BuildTime
22+
}
23+
url := "https://github.com/proletariatgames/p4harmonize"
24+
if len(buildvar.ReleaseURL) > 0 {
25+
url = buildvar.ReleaseURL
1626
}
17-
)
27+
28+
fmt.Fprintf(os.Stderr,
29+
strings.Join([]string{
30+
"",
31+
"p4harmonize %s, created %s",
32+
"%s",
33+
"",
34+
"Usage:",
35+
"\tp4harmonize [--config PATH]",
36+
"\tp4harmonize --version",
37+
"\tp4harmonize --help",
38+
"Options:",
39+
"\t-c, --config PATH Config file location (default: 'config.toml')",
40+
"\t-v, --version Print just the version number (to stdout)",
41+
"\t-h, --help Print this message (to stderr)",
42+
"",
43+
"Config files must be in TOML format. See the README for an example.",
44+
"",
45+
}, "\n"), version, buildTime, url,
46+
)
47+
}
1848

1949
func main() {
2050
status := mainExit()
@@ -28,10 +58,39 @@ func main() {
2858
}
2959

3060
func mainExit() int {
61+
flag.Usage = PrintUsage
62+
3163
var cfgPath string
64+
var showVersion bool
65+
var showHelp bool
66+
flag.StringVar(&cfgPath, "c", "config.toml", "config file location")
3267
flag.StringVar(&cfgPath, "config", "config.toml", "config file location")
68+
flag.BoolVar(&showVersion, "v", false, "show version info")
69+
flag.BoolVar(&showVersion, "version", false, "show version info")
70+
flag.BoolVar(&showHelp, "h", false, "show version info")
71+
flag.BoolVar(&showHelp, "help", false, "show version info")
3372
flag.Parse()
3473

74+
if showVersion {
75+
if len(buildvar.Version) == 0 {
76+
fmt.Printf("unknown\n")
77+
return 1
78+
}
79+
fmt.Printf("%s\n", strings.TrimPrefix(buildvar.Version, "v"))
80+
return 0
81+
}
82+
83+
if showHelp {
84+
flag.Usage()
85+
return 0
86+
}
87+
88+
if len(flag.Args()) > 0 {
89+
fmt.Printf("unrecognized arguments: %v\n", strings.Join(flag.Args(), " "))
90+
flag.Usage()
91+
return 1
92+
}
93+
3594
start := time.Now()
3695
log := MakeLogger(frog.New(frog.Auto, frog.HideLevel, frog.MessageOnRight, frog.FieldIndent10), "")
3796
defer func() {

internal/buildvar/buildvar.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package buildvar
2+
3+
// -ldflags '-X "github.com/proletariatgames/p4harmonize/internal/buildvar.Version=${{ github.event.release.tag_name }}"'
4+
var Version string
5+
6+
// -ldflags '-X "github.com/proletariatgames/p4harmonize/internal/buildvar.BuildTime=${{ github.event.release.created_at }}"'
7+
var BuildTime string
8+
9+
// -ldflags '-X "github.com/proletariatgames/p4harmonize/internal/buildvar.ReleaseURL=${{ github.event.release.html_url }}"'
10+
var ReleaseURL string

magefile.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package main
44

55
import (
6+
"bytes"
67
"crypto/md5"
78
"encoding/hex"
89
"fmt"
@@ -12,6 +13,7 @@ import (
1213
"path/filepath"
1314
"sort"
1415
"strings"
16+
"time"
1517

1618
"github.com/danbrakeley/bsh"
1719
"github.com/magefile/mage/mg"
@@ -29,7 +31,22 @@ func Build() {
2931

3032
sh.Echof("Building %s...", target)
3133
sh.MkdirAll("local/")
32-
sh.Cmdf("go build -o local/%s ./cmd/%s", target, cmd).Run()
34+
35+
// grab git commit hash to use as version for local builds
36+
commit := "(dev)"
37+
var b bytes.Buffer
38+
n := sh.Cmd(`git log --pretty=format:'%h' -n 1`).Out(&b).RunExitStatus()
39+
if n == 0 {
40+
commit = strings.TrimSpace(b.String())
41+
}
42+
43+
sh.Cmdf(
44+
`go build -ldflags '`+
45+
`-X "github.com/proletariatgames/p4harmonize/internal/buildvar.Version=%s" `+
46+
`-X "github.com/proletariatgames/p4harmonize/internal/buildvar.BuildTime=%s" `+
47+
`-X "github.com/proletariatgames/p4harmonize/internal/buildvar.ReleaseURL=https://github.com/proletariatgames/p4harmonize"`+
48+
`' -o local/%s ./cmd/%s`, commit, time.Now().Format(time.RFC3339), target, cmd,
49+
).Run()
3350
}
3451

3552
// Run runs unit tests, builds, and runs the app

0 commit comments

Comments
 (0)