forked from LaconicNetwork/kompose
98 lines
2.8 KiB
Go
98 lines
2.8 KiB
Go
package version
|
|
|
|
import (
|
|
"regexp"
|
|
"strings"
|
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
)
|
|
|
|
var (
|
|
// commitFromGit is a constant representing the source version that
|
|
// generated this build. It should be set during build via -ldflags.
|
|
commitFromGit string
|
|
// versionFromGit is a constant representing the version tag that
|
|
// generated this build. It should be set during build via -ldflags.
|
|
versionFromGit string
|
|
// major version
|
|
majorFromGit string
|
|
// minor version
|
|
minorFromGit string
|
|
// build date in ISO8601 format, output of $(date -u +'%Y-%m-%dT%H:%M:%SZ')
|
|
buildDate string
|
|
)
|
|
|
|
// Info contains versioning information.
|
|
// TODO: Add []string of api versions supported? It's still unclear
|
|
// how we'll want to distribute that information.
|
|
type Info struct {
|
|
Major string `json:"major"`
|
|
Minor string `json:"minor"`
|
|
GitCommit string `json:"gitCommit"`
|
|
GitVersion string `json:"gitVersion"`
|
|
BuildDate string `json:"buildDate"`
|
|
}
|
|
|
|
// Get returns the overall codebase version. It's for detecting
|
|
// what code a binary was built from.
|
|
func Get() Info {
|
|
return Info{
|
|
Major: majorFromGit,
|
|
Minor: minorFromGit,
|
|
GitCommit: commitFromGit,
|
|
GitVersion: versionFromGit,
|
|
BuildDate: buildDate,
|
|
}
|
|
}
|
|
|
|
// String returns info as a human-friendly version string.
|
|
func (info Info) String() string {
|
|
version := info.GitVersion
|
|
if version == "" {
|
|
version = "unknown"
|
|
}
|
|
return version
|
|
}
|
|
|
|
var (
|
|
reCommitSegment = regexp.MustCompile(`\+[0-9a-f]{6,14}$`)
|
|
reCommitIncrement = regexp.MustCompile(`^[0-9a-f]+$`)
|
|
)
|
|
|
|
// LastSemanticVersion attempts to return a semantic version from the GitVersion - which
|
|
// is either <semver>+<commit> or <semver> on release boundaries.
|
|
func (info Info) LastSemanticVersion() string {
|
|
version := info.GitVersion
|
|
parts := strings.Split(version, "-")
|
|
// strip the modifier
|
|
if len(parts) > 1 && parts[len(parts)-1] == "dirty" {
|
|
parts = parts[:len(parts)-1]
|
|
}
|
|
// strip the Git commit
|
|
if len(parts) > 0 && reCommitSegment.MatchString(parts[len(parts)-1]) {
|
|
parts[len(parts)-1] = reCommitSegment.ReplaceAllString(parts[len(parts)-1], "")
|
|
if len(parts[len(parts)-1]) == 0 {
|
|
parts = parts[:len(parts)-1]
|
|
}
|
|
// strip a version increment, but only if we found the commit
|
|
if len(parts) > 1 && reCommitIncrement.MatchString(parts[len(parts)-1]) {
|
|
parts = parts[:len(parts)-1]
|
|
}
|
|
}
|
|
|
|
return strings.Join(parts, "-")
|
|
}
|
|
|
|
func init() {
|
|
buildInfo := prometheus.NewGaugeVec(
|
|
prometheus.GaugeOpts{
|
|
Name: "openshift_build_info",
|
|
Help: "A metric with a constant '1' value labeled by major, minor, git commit & git version from which OpenShift was built.",
|
|
},
|
|
[]string{"major", "minor", "gitCommit", "gitVersion"},
|
|
)
|
|
buildInfo.WithLabelValues(majorFromGit, minorFromGit, commitFromGit, versionFromGit).Set(1)
|
|
|
|
prometheus.MustRegister(buildInfo)
|
|
}
|