diff --git a/Dockerfile b/Dockerfile index c4c8adf..5b8ef30 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,9 @@ COPY go.mod go.sum ./ RUN go mod download COPY . . RUN go generate -tags prod ./... +ARG GIT_COMMIT +ARG RELEASE_CODE +ARG BUILD_TIME RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install -ldflags "-w -s -extldflags '-static' -X main.GitCommit=$GIT_COMMIT -X main.ReleaseCode=$RELEASE_CODE -X 'main.BuildTime=$BUILD_TIME'" github.com/ngerakines/tavern/... FROM alpine:3.11 as tavern diff --git a/README.md b/README.md index dc31c6c..1ca4622 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,13 @@ The build and release process involves code generation in a few ways that aren't The `-tags prod` argument can be used to indicate prod vs non-prod sources. When the `prod` flag **is not** present, asset packages will load content from disk, but will still contain file path references. In other words, whenever you create or delete files including templates, migrations, or translations, you must run `go generate ./...`. +## Docker Builds + + $ export TAVERN_RELEASE_CODE=$(git describe --always) + $ export TAVERN_GIT_COMMIT=$(git log --format="%H" -n 1) + $ export TAVERN_BUILD_TIME=$(date --rfc-3339=seconds) + $ docker build --build-arg=GIT_COMMIT=$TAVERN_GIT_COMMIT --build-arg=RELEASE_CODE=$TAVERN_RELEASE_CODE --build-arg=BUILD_TIME="$TAVERN_BUILD_TIME" -t ngerakines/tavern:latest --target=tavern . + # License MIT License diff --git a/main.go b/main.go index 0c077d1..0c1754d 100644 --- a/main.go +++ b/main.go @@ -25,7 +25,7 @@ var GitCommit string var BuildTime string func main() { - compiledAt, err := time.Parse(time.RFC822Z, BuildTime) + compiledAt, err := time.Parse(time.RFC3339, BuildTime) if err != nil { compiledAt = time.Now() } diff --git a/web/command.go b/web/command.go index 9caabd4..1c3afae 100644 --- a/web/command.go +++ b/web/command.go @@ -244,10 +244,23 @@ func serverCommandAction(cliCtx *cli.Context) error { assetQueue := common.NewStringQueue() registry := prometheus.NewRegistry() + if err = registry.Register(prometheus.NewGoCollector()); err != nil { return err } fact := promauto.With(registry) + + { + tavernInfoG := fact.NewGauge(prometheus.GaugeOpts{ + Namespace: "tavern", + Subsystem: "web", + Name: "info", + Help: "", + ConstLabels: map[string]string{"buildtime": g.BuildTime, "version": g.Version(), "ua": g.UserAgent()}, + }) + tavernInfoG.Set(1) + } + httpClient := common.InstrumentedDefaultHTTPClient(fact, "web", "client") var svgConv SVGConverter