Skip to content

Commit da1d534

Browse files
authored
Merge pull request #234 from crazy-max/versioning
Set version and revision at linked time
2 parents 5124911 + a2d8aac commit da1d534

File tree

10 files changed

+123
-75
lines changed

10 files changed

+123
-75
lines changed

.dockerignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
/bin
2-
/release

.github/workflows/build.yml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ jobs:
128128
-
129129
name: Checkout
130130
uses: actions/checkout@v3
131+
with:
132+
fetch-depth: 0
131133
-
132134
name: Set up QEMU
133135
uses: docker/setup-qemu-action@v2
@@ -153,3 +155,16 @@ jobs:
153155
name: docker-credential-helpers
154156
path: ${{ env.DESTDIR }}/*
155157
if-no-files-found: error
158+
159+
build-deb:
160+
runs-on: ubuntu-20.04
161+
steps:
162+
-
163+
name: Checkout
164+
uses: actions/checkout@v3
165+
with:
166+
fetch-depth: 0
167+
-
168+
name: Build
169+
run: |
170+
make deb

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
/bin
2-
/release

Dockerfile

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ ARG XX_VERSION=1.1.2
55
ARG OSXCROSS_VERSION=11.3-r7-alpine
66
ARG GOLANGCI_LINT_VERSION=v1.47.3
77

8-
ARG PKG=github.com/docker/docker-credential-helpers
8+
ARG PACKAGE=github.com/docker/docker-credential-helpers
99

1010
# xx is a helper for cross-compilation
1111
FROM --platform=$BUILDPLATFORM tonistiigi/xx:${XX_VERSION} AS xx
@@ -15,7 +15,7 @@ FROM crazymax/osxcross:${OSXCROSS_VERSION} AS osxcross
1515

1616
FROM --platform=$BUILDPLATFORM golang:${GO_VERSION}-alpine AS gobase
1717
COPY --from=xx / /
18-
RUN apk add --no-cache clang file git lld llvm pkgconf rsync
18+
RUN apk add --no-cache clang file git lld llvm make pkgconf rsync
1919
ENV GOFLAGS="-mod=vendor"
2020
ENV CGO_ENABLED="1"
2121
WORKDIR /src
@@ -57,13 +57,6 @@ RUN --mount=type=bind,target=. \
5757
--mount=from=golangci-lint,source=/usr/bin/golangci-lint,target=/usr/bin/golangci-lint \
5858
golangci-lint run ./...
5959

60-
FROM gobase AS version
61-
ARG PKG
62-
RUN --mount=target=. \
63-
VERSION=$(git describe --match 'v[0-9]*' --dirty='.m' --always --tags); \
64-
echo "-s -w -X ${PKG}/credentials.Version=${VERSION}" | tee /tmp/.ldflags; \
65-
echo -n "${VERSION}" | tee /tmp/.version;
66-
6760
FROM gobase AS base
6861
ARG TARGETPLATFORM
6962
RUN xx-apk add musl-dev gcc libsecret-dev pass
@@ -93,50 +86,49 @@ FROM scratch AS test-coverage
9386
COPY --from=test /out /
9487

9588
FROM base AS build-linux
89+
ARG PACKAGE
9690
ARG TARGETOS
9791
ARG TARGETARCH
9892
ARG TARGETVARIANT
9993
RUN --mount=type=bind,target=. \
10094
--mount=type=cache,target=/root/.cache \
101-
--mount=type=cache,target=/go/pkg/mod \
102-
--mount=type=bind,from=version,source=/tmp/.ldflags,target=/tmp/.ldflags <<EOT
95+
--mount=type=cache,target=/go/pkg/mod <<EOT
10396
set -ex
104-
mkdir /out
105-
xx-go build -ldflags "$(cat /tmp/.ldflags)" -o /out/docker-credential-pass-${TARGETOS}-${TARGETARCH}${TARGETVARIANT} ./pass/cmd/
97+
xx-go --wrap
98+
make build-pass PACKAGE=$PACKAGE DESTDIR=/out BINNAME=docker-credential-pass-${TARGETOS}-${TARGETARCH}${TARGETVARIANT}
10699
xx-verify /out/docker-credential-pass-${TARGETOS}-${TARGETARCH}${TARGETVARIANT}
107-
xx-go build -ldflags "$(cat /tmp/.ldflags)" -o /out/docker-credential-secretservice-${TARGETOS}-${TARGETARCH}${TARGETVARIANT} ./secretservice/cmd/
100+
make build-secretservice PACKAGE=$PACKAGE DESTDIR=/out BINNAME=docker-credential-secretservice-${TARGETOS}-${TARGETARCH}${TARGETVARIANT}
108101
xx-verify /out/docker-credential-secretservice-${TARGETOS}-${TARGETARCH}${TARGETVARIANT}
109102
EOT
110103

111104
FROM base AS build-darwin
105+
ARG PACKAGE
112106
ARG TARGETOS
113107
ARG TARGETARCH
114108
ARG TARGETVARIANT
115109
RUN --mount=type=bind,target=. \
116110
--mount=type=cache,target=/root/.cache \
117111
--mount=type=cache,target=/go/pkg/mod \
118-
--mount=type=bind,from=osxcross,src=/osxsdk,target=/xx-sdk \
119-
--mount=type=bind,from=version,source=/tmp/.ldflags,target=/tmp/.ldflags <<EOT
112+
--mount=type=bind,from=osxcross,src=/osxsdk,target=/xx-sdk <<EOT
120113
set -ex
121-
mkdir /out
122-
xx-go install std
123-
xx-go build -ldflags "$(cat /tmp/.ldflags)" -o /out/docker-credential-osxkeychain-${TARGETARCH}${TARGETVARIANT} ./osxkeychain/cmd/
114+
xx-go --wrap
115+
go install std
116+
make build-osxkeychain PACKAGE=$PACKAGE DESTDIR=/out BINNAME=docker-credential-osxkeychain-${TARGETARCH}${TARGETVARIANT}
124117
xx-verify /out/docker-credential-osxkeychain-${TARGETARCH}${TARGETVARIANT}
125-
126-
xx-go build -ldflags "$(cat /tmp/.ldflags)" -o /out/docker-credential-pass-${TARGETOS}-${TARGETARCH}${TARGETVARIANT} ./pass/cmd/
118+
make build-pass PACKAGE=$PACKAGE DESTDIR=/out BINNAME=docker-credential-pass-${TARGETOS}-${TARGETARCH}${TARGETVARIANT}
127119
xx-verify /out/docker-credential-pass-${TARGETOS}-${TARGETARCH}${TARGETVARIANT}
128120
EOT
129121

130122
FROM base AS build-windows
123+
ARG PACKAGE
131124
ARG TARGETARCH
132125
ARG TARGETVARIANT
133126
RUN --mount=type=bind,target=. \
134127
--mount=type=cache,target=/root/.cache \
135-
--mount=type=cache,target=/go/pkg/mod \
136-
--mount=type=bind,from=version,source=/tmp/.ldflags,target=/tmp/.ldflags <<EOT
128+
--mount=type=cache,target=/go/pkg/mod <<EOT
137129
set -ex
138-
mkdir /out
139-
xx-go build -ldflags "$(cat /tmp/.ldflags)" -o /out/docker-credential-wincred-${TARGETARCH}${TARGETVARIANT}.exe ./wincred/cmd/
130+
xx-go --wrap
131+
make build-wincred PACKAGE=$PACKAGE DESTDIR=/out BINNAME=docker-credential-wincred-${TARGETARCH}${TARGETVARIANT}.exe
140132
xx-verify /out/docker-credential-wincred-${TARGETARCH}${TARGETVARIANT}.exe
141133
EOT
142134

Makefile

Lines changed: 50 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,95 @@
1-
.PHONY: all osxkeychain secretservice test lint validate-vendor fmt validate wincred pass deb vendor
1+
PACKAGE ?= github.com/docker/docker-credential-helpers
2+
VERSION ?= $(shell git describe --match 'v[0-9]*' --dirty='.m' --always --tags)
3+
REVISION ?= $(shell git rev-parse HEAD)$(shell if ! git diff --no-ext-diff --quiet --exit-code; then echo .m; fi)
24

3-
VERSION := $(shell grep 'const Version' credentials/version.go | awk -F'"' '{ print $$2 }')
5+
GO_PKG = github.com/docker/docker-credential-helpers
6+
GO_LDFLAGS = -s -w -X ${GO_PKG}/credentials.Version=${VERSION} -X ${GO_PKG}/credentials.Revision=${REVISION} -X ${GO_PKG}/credentials.Package=${PACKAGE}
47

5-
all: test
8+
BUILDX_CMD ?= docker buildx
9+
DESTDIR ?= ./bin/build
610

11+
.PHONY: all
12+
all: cross
13+
14+
.PHONY: clean
715
clean:
816
rm -rf bin
9-
rm -rf release
10-
11-
osxkeychain:
12-
mkdir -p bin
13-
go build -ldflags -s -o bin/docker-credential-osxkeychain ./osxkeychain/cmd/
14-
15-
osxcodesign: osxkeychain
16-
$(eval SIGNINGHASH = $(shell security find-identity -v -p codesigning | grep "Developer ID Application: Docker Inc" | cut -d ' ' -f 4))
17-
xcrun -log codesign -s $(SIGNINGHASH) --force --verbose bin/docker-credential-osxkeychain
18-
xcrun codesign --verify --deep --strict --verbose=2 --display bin/docker-credential-osxkeychain
1917

20-
secretservice:
21-
mkdir -p bin
22-
go build -o bin/docker-credential-secretservice ./secretservice/cmd/
18+
.PHONY: build-%
19+
build-%: # build, can be one of build-osxkeychain build-pass build-secretservice build-wincred
20+
$(eval BINNAME := docker-credential-$*)
21+
go build -trimpath -ldflags="$(GO_LDFLAGS) -X ${GO_PKG}/credentials.Name=docker-credential-$*" -o $(DESTDIR)/$(BINNAME) ./$*/cmd/
2322

24-
pass:
25-
mkdir -p bin
26-
go build -o bin/docker-credential-pass ./pass/cmd/
23+
# aliases for build-* targets
24+
.PHONY: osxkeychain secretservice pass wincred
25+
osxkeychain: build-osxkeychain
26+
secretservice: build-secretservice
27+
pass: build-pass
28+
wincred: build-wincred
2729

28-
wincred:
29-
mkdir -p bin
30-
go build -o bin/docker-credential-wincred.exe ./wincred/cmd/
30+
.PHONY: osxcodesign
31+
osxcodesign: build-osxkeychain
32+
$(eval SIGNINGHASH = $(shell security find-identity -v -p codesigning | grep "Developer ID Application: Docker Inc" | cut -d ' ' -f 4))
33+
xcrun -log codesign -s $(SIGNINGHASH) --force --verbose bin/build/docker-credential-osxkeychain
34+
xcrun codesign --verify --deep --strict --verbose=2 --display bin/build/docker-credential-osxkeychain
3135

36+
.PHONY: linuxrelease
3237
linuxrelease:
3338
mkdir -p release
34-
cd bin && tar cvfz ../release/docker-credential-pass-v$(VERSION)-amd64.tar.gz docker-credential-pass
35-
cd bin && tar cvfz ../release/docker-credential-secretservice-v$(VERSION)-amd64.tar.gz docker-credential-secretservice
39+
cd bin && tar cvfz ../release/docker-credential-pass-$(VERSION)-amd64.tar.gz docker-credential-pass
40+
cd bin && tar cvfz ../release/docker-credential-secretservice-$(VERSION)-amd64.tar.gz docker-credential-secretservice
3641

42+
.PHONY: osxrelease
3743
osxrelease:
3844
mkdir -p release
39-
cd bin && tar cvfz ../release/docker-credential-osxkeychain-v$(VERSION)-amd64.tar.gz docker-credential-osxkeychain
40-
cd bin && tar cvfz ../release/docker-credential-pass-v$(VERSION)-darwin-amd64.tar.gz docker-credential-pass
45+
cd bin && tar cvfz ../release/docker-credential-osxkeychain-$(VERSION)-amd64.tar.gz docker-credential-osxkeychain
46+
cd bin && tar cvfz ../release/docker-credential-pass-$(VERSION)-darwin-amd64.tar.gz docker-credential-pass
4147

48+
.PHONY: winrelease
4249
winrelease:
4350
mkdir -p release
44-
cd bin && zip ../release/docker-credential-wincred-v$(VERSION)-amd64.zip docker-credential-wincred.exe
51+
cd bin && zip ../release/docker-credential-wincred-$(VERSION)-amd64.zip docker-credential-wincred.exe
52+
53+
.PHONY: cross
54+
cross: # cross build all supported credential helpers
55+
$(BUILDX_CMD) bake cross
4556

57+
.PHONY: test
4658
test:
4759
# tests all packages except vendor
4860
go test -v `go list ./... | grep -v /vendor/`
4961

62+
.PHONY: lint
5063
lint:
51-
docker buildx bake lint
64+
$(BUILDX_CMD) bake lint
5265

66+
.PHONY: validate-vendor
5367
validate-vendor:
54-
docker buildx bake vendor-validate
68+
$(BUILDX_CMD) bake vendor-validate
5569

70+
.PHONY: fmt
5671
fmt:
5772
gofmt -s -l `ls **/*.go | grep -v vendor`
5873

74+
.PHONY: validate
5975
validate: lint validate-vendor fmt
6076

6177
BUILDIMG:=docker-credential-secretservice-$(VERSION)
78+
.PHONY: deb
6279
deb:
6380
mkdir -p release
6481
docker build -f deb/Dockerfile \
65-
--build-arg VERSION=$(VERSION) \
66-
--build-arg DISTRO=xenial \
82+
--build-arg VERSION=$(patsubst v%,%,$(VERSION)) \
83+
--build-arg REVISION=$(REVISION) \
6784
--tag $(BUILDIMG) \
6885
.
6986
docker run --rm --net=none $(BUILDIMG) tar cf - /release | tar xf -
7087
docker rmi $(BUILDIMG)
7188

89+
.PHONY: vendor
7290
vendor:
7391
$(eval $@_TMP_OUT := $(shell mktemp -d -t docker-output.XXXXXXXXXX))
74-
docker buildx bake --set "*.output=type=local,dest=$($@_TMP_OUT)" vendor
92+
$(BUILDX_CMD) bake --set "*.output=type=local,dest=$($@_TMP_OUT)" vendor
7593
rm -rf ./vendor
7694
cp -R "$($@_TMP_OUT)"/* .
7795
rm -rf "$($@_TMP_OUT)"

credentials/credentials.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,6 @@ func List(helper Helper, writer io.Writer) error {
181181

182182
// PrintVersion outputs the current version.
183183
func PrintVersion(writer io.Writer) error {
184-
fmt.Fprintln(writer, Version)
184+
fmt.Fprintf(writer, "%s (%s) %s\n", Name, Package, Version)
185185
return nil
186186
}

credentials/version.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,16 @@
11
package credentials
22

3-
// Version holds a string describing the current version
4-
const Version = "0.6.4"
3+
var (
4+
// Name is filled at linking time
5+
Name = ""
6+
7+
// Package is filled at linking time
8+
Package = "github.com/docker/docker-credential-helpers"
9+
10+
// Version holds the complete version number. Filled in at linking time.
11+
Version = "v0.0.0+unknown"
12+
13+
// Revision is filled with the VCS (e.g. git) revision being used to build
14+
// the program at linking time.
15+
Revision = ""
16+
)

deb/Dockerfile

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
1-
FROM ubuntu:xenial
1+
ARG GO_VERSION=1.18.5
2+
ARG DISTRO=ubuntu
3+
ARG SUITE=focal
24

3-
ARG VERSION
4-
ARG DISTRO
5+
FROM golang:${GO_VERSION}-buster AS golang
6+
7+
FROM ${DISTRO}:${SUITE}
58

6-
RUN apt-get update && apt-get install -yy debhelper dh-make golang-go libsecret-1-dev
9+
ARG DEBIAN_FRONTEND=noninteractive
10+
RUN apt-get update && apt-get install -yy debhelper dh-make libsecret-1-dev
711
RUN mkdir -p /build
812

913
WORKDIR /build
10-
ENV GOPATH /build
14+
ENV GOPROXY=https://proxy.golang.org|direct
15+
ENV GO111MODULE=off
16+
ENV GOPATH=/build
17+
ENV PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
18+
COPY --from=golang /usr/local/go /usr/local/go
1119

1220
COPY Makefile .
1321
COPY credentials credentials
@@ -16,4 +24,12 @@ COPY pass pass
1624
COPY deb/debian ./debian
1725
COPY deb/build-deb .
1826

19-
RUN /build/build-deb ${VERSION} ${DISTRO}
27+
ARG VERSION
28+
ENV VERSION=${VERSION}
29+
ARG REVISION
30+
ENV REVISION=${REVISION}
31+
ARG DISTRO
32+
ENV DISTRO=${DISTRO}
33+
ARG SUITE
34+
ENV SUITE=${SUITE}
35+
RUN /build/build-deb

deb/build-deb

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
#!/usr/bin/env bash
2-
set -x
3-
set -e
4-
5-
version=$1
6-
distro=$2
2+
set -ex
73

84
maintainer=$(awk -F ': ' '$1 == "Maintainer" { print $2; exit }' debian/control)
95

106
cat > "debian/changelog" <<-EOF
11-
docker-credential-helpers ($version) $DISTRO; urgency=low
7+
docker-credential-helpers ($VERSION) $DISTRO-$SUITE; urgency=low
128
139
* New upstream version
1410

deb/debian/rules

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
DESTDIR := $(CURDIR)/debian/tmp
44

55
override_dh_auto_build:
6-
make secretservice pass
6+
make build-secretservice DESTDIR=bin
7+
make build-pass DESTDIR=bin
78

89
override_dh_auto_install:
910
install -D bin/docker-credential-secretservice $(DESTDIR)/usr/bin/docker-credential-secretservice

0 commit comments

Comments
 (0)