mirror of
https://github.com/caddyserver/caddy.git
synced 2024-12-23 22:27:38 -05:00
Implant version information with -ldflags with help of build script
Without -ldflags, the verison information needs to be updated manually, which is never done between releases, so development builds appear indiscernable from stable builds using `caddy -version`. This is part of a set of changes intended to relieve the burden of always updating version information manually and distributing binaries that look stable but actually may not be. A stable build is defined as one which is produced at a git tag with a clean working directory (no uncommitted changes). A dev build is anything else. With this build script, `caddy -version` will now reveal whether it is a development build and, if so, the base version, the latest commit, the date and time of build, and the names of files with changes as well as how many changes were made. The output of `caddy -version` for stable builds remains the same.
This commit is contained in:
parent
c827a71d5d
commit
da08c94a8c
3 changed files with 132 additions and 14 deletions
55
build.bash
Executable file
55
build.bash
Executable file
|
@ -0,0 +1,55 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Caddy build script. Automates proper versioning.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
#
|
||||||
|
# $ ./build.bash [output_filename]
|
||||||
|
#
|
||||||
|
# Outputs compiled program in current directory.
|
||||||
|
# Default file name is 'ecaddy'.
|
||||||
|
#
|
||||||
|
set -e
|
||||||
|
|
||||||
|
output="$1"
|
||||||
|
if [ -z "$output" ]; then
|
||||||
|
output="ecaddy"
|
||||||
|
fi
|
||||||
|
|
||||||
|
pkg=main
|
||||||
|
|
||||||
|
# Timestamp of build
|
||||||
|
builddate_id=$pkg.buildDate
|
||||||
|
builddate=`date -u`
|
||||||
|
|
||||||
|
# Current tag, if HEAD is on a tag
|
||||||
|
tag_id=$pkg.gitTag
|
||||||
|
set +e
|
||||||
|
tag=`git describe --exact-match HEAD 2> /dev/null`
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Nearest tag on branch
|
||||||
|
lasttag_id=$pkg.gitNearestTag
|
||||||
|
lasttag=`git describe --abbrev=0 --tags HEAD`
|
||||||
|
|
||||||
|
# Commit SHA
|
||||||
|
commit_id=$pkg.gitCommit
|
||||||
|
commit=`git rev-parse --short HEAD`
|
||||||
|
|
||||||
|
# Summary of uncommited changes
|
||||||
|
shortstat_id=$pkg.gitShortStat
|
||||||
|
shortstat=`git diff-index --shortstat HEAD`
|
||||||
|
|
||||||
|
# List of modified files
|
||||||
|
files_id=$pkg.gitFilesModified
|
||||||
|
files=`git diff-index --name-only HEAD`
|
||||||
|
|
||||||
|
|
||||||
|
go build -ldflags "
|
||||||
|
-X \"$builddate_id=$builddate\"
|
||||||
|
-X \"$tag_id=$tag\"
|
||||||
|
-X \"$lasttag_id=$lasttag\"
|
||||||
|
-X \"$commit_id=$commit\"
|
||||||
|
-X \"$shortstat_id=$shortstat\"
|
||||||
|
-X \"$files_id=$files\"
|
||||||
|
" -o "$output"
|
60
main.go
60
main.go
|
@ -18,21 +18,9 @@ import (
|
||||||
"gopkg.in/natefinch/lumberjack.v2"
|
"gopkg.in/natefinch/lumberjack.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
conf string
|
|
||||||
cpu string
|
|
||||||
logfile string
|
|
||||||
revoke string
|
|
||||||
version bool
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
appName = "Caddy"
|
|
||||||
appVersion = "0.8.2"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
caddy.TrapSignals()
|
caddy.TrapSignals()
|
||||||
|
setVersion()
|
||||||
flag.BoolVar(&https.Agreed, "agree", false, "Agree to Let's Encrypt Subscriber Agreement")
|
flag.BoolVar(&https.Agreed, "agree", false, "Agree to Let's Encrypt Subscriber Agreement")
|
||||||
flag.StringVar(&https.CAUrl, "ca", "https://acme-v01.api.letsencrypt.org/directory", "Certificate authority ACME server")
|
flag.StringVar(&https.CAUrl, "ca", "https://acme-v01.api.letsencrypt.org/directory", "Certificate authority ACME server")
|
||||||
flag.StringVar(&conf, "conf", "", "Configuration file to use (default="+caddy.DefaultConfigFile+")")
|
flag.StringVar(&conf, "conf", "", "Configuration file to use (default="+caddy.DefaultConfigFile+")")
|
||||||
|
@ -83,7 +71,10 @@ func main() {
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
if version {
|
if version {
|
||||||
fmt.Printf("%s %s\n", caddy.AppName, caddy.AppVersion)
|
fmt.Printf("%s %s\n", appName, appVersion)
|
||||||
|
if devBuild && gitShortStat != "" {
|
||||||
|
fmt.Printf("%s\n%s\n", gitShortStat, gitFilesModified)
|
||||||
|
}
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,3 +190,44 @@ func setCPU(cpu string) error {
|
||||||
runtime.GOMAXPROCS(numCPU)
|
runtime.GOMAXPROCS(numCPU)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// setVersion figures out the version information based on
|
||||||
|
// variables set by -ldflags.
|
||||||
|
func setVersion() {
|
||||||
|
// A development build is one that's not at a tag or has uncommitted changes
|
||||||
|
devBuild = gitTag == "" || gitShortStat != ""
|
||||||
|
|
||||||
|
// Only set the appVersion if -ldflags was used
|
||||||
|
if gitNearestTag != "" || gitTag != "" {
|
||||||
|
if devBuild && gitNearestTag != "" {
|
||||||
|
appVersion = fmt.Sprintf("%s (+%s %s)",
|
||||||
|
strings.TrimPrefix(gitNearestTag, "v"), gitCommit, buildDate)
|
||||||
|
} else if gitTag != "" {
|
||||||
|
appVersion = strings.TrimPrefix(gitTag, "v")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const appName = "Caddy"
|
||||||
|
|
||||||
|
// Flags that control program flow or startup
|
||||||
|
var (
|
||||||
|
conf string
|
||||||
|
cpu string
|
||||||
|
logfile string
|
||||||
|
revoke string
|
||||||
|
version bool
|
||||||
|
)
|
||||||
|
|
||||||
|
// Build information obtained with the help of -ldflags
|
||||||
|
var (
|
||||||
|
appVersion = "(untracked dev build)" // inferred at startup
|
||||||
|
devBuild = true // inferred at startup
|
||||||
|
|
||||||
|
buildDate string // date -u
|
||||||
|
gitTag string // git describe --exact-match HEAD 2> /dev/null
|
||||||
|
gitNearestTag string // git describe --abbrev=0 --tags HEAD
|
||||||
|
gitCommit string // git rev-parse HEAD
|
||||||
|
gitShortStat string // git diff-index --shortstat
|
||||||
|
gitFilesModified string // git diff-index --name-only HEAD
|
||||||
|
)
|
||||||
|
|
31
main_test.go
31
main_test.go
|
@ -42,3 +42,34 @@ func TestSetCPU(t *testing.T) {
|
||||||
runtime.GOMAXPROCS(currentCPU)
|
runtime.GOMAXPROCS(currentCPU)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSetVersion(t *testing.T) {
|
||||||
|
setVersion()
|
||||||
|
if !devBuild {
|
||||||
|
t.Error("Expected default to assume development build, but it didn't")
|
||||||
|
}
|
||||||
|
if got, want := appVersion, "(untracked dev build)"; got != want {
|
||||||
|
t.Errorf("Expected appVersion='%s', got: '%s'", want, got)
|
||||||
|
}
|
||||||
|
|
||||||
|
gitTag = "v1.1"
|
||||||
|
setVersion()
|
||||||
|
if devBuild {
|
||||||
|
t.Error("Expected a stable build if gitTag is set with no changes")
|
||||||
|
}
|
||||||
|
if got, want := appVersion, "1.1"; got != want {
|
||||||
|
t.Errorf("Expected appVersion='%s', got: '%s'", want, got)
|
||||||
|
}
|
||||||
|
|
||||||
|
gitTag = ""
|
||||||
|
gitNearestTag = "v1.0"
|
||||||
|
gitCommit = "deadbeef"
|
||||||
|
buildDate = "Fri Feb 26 06:53:17 UTC 2016"
|
||||||
|
setVersion()
|
||||||
|
if !devBuild {
|
||||||
|
t.Error("Expected inferring a dev build when gitTag is empty")
|
||||||
|
}
|
||||||
|
if got, want := appVersion, "1.0 (+deadbeef Fri Feb 26 06:53:17 UTC 2016)"; got != want {
|
||||||
|
t.Errorf("Expected appVersion='%s', got: '%s'", want, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue