Skip to content

Commit 73cc480

Browse files
authored
feat: improve binary size with build tags (#976)
1 parent 7abd9fe commit 73cc480

7 files changed

Lines changed: 85 additions & 22 deletions

File tree

.github/workflows/nightly.yml

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,27 @@ jobs:
3535
VERSION: ${{ steps.metadata.outputs.VERSION }}
3636
COMMIT_HASH: ${{ steps.metadata.outputs.COMMIT_HASH }}
3737
BUILD_TIMESTAMP: ${{ steps.metadata.outputs.BUILD_TIMESTAMP }}
38+
BUILD_TAGS: ${{ steps.metadata.outputs.BUILD_TAGS }}
3839
steps:
3940
- name: Checkout
4041
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
4142
with:
4243
ref: nightly
4344

45+
- name: Install go
46+
uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6
47+
with:
48+
go-version: "^1.26.4"
49+
4450
- name: Generate metadata
4551
id: metadata
4652
run: |
4753
echo "VERSION=nightly" >> "$GITHUB_OUTPUT"
4854
echo "COMMIT_HASH=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"
4955
echo "BUILD_TIMESTAMP=$(date '+%Y-%m-%dT%H:%M:%S')" >> "$GITHUB_OUTPUT"
56+
export TAILSCALE_BUILD_TAGS=$(go run tailscale.com/cmd/featuretags@v1.100.0 -min -add acme,serve,netstack)
57+
export GIN_BUILD_TAGS=nomsgpack
58+
echo "BUILD_TAGS=$TAILSCALE_BUILD_TAGS,$GIN_BUILD_TAGS" >> "$GITHUB_OUTPUT"
5059
5160
binary-build:
5261
runs-on: ubuntu-latest
@@ -83,7 +92,11 @@ jobs:
8392
- name: Build
8493
run: |
8594
cp -r frontend/dist internal/assets/dist
86-
go build -ldflags "-X github.com/tinyauthapp/tinyauth/internal/model.Version=${{ needs.generate-metadata.outputs.VERSION }} -X github.com/tinyauthapp/tinyauth/internal/model.CommitHash=${{ needs.generate-metadata.outputs.COMMIT_HASH }} -X github.com/tinyauthapp/tinyauth/internal/model.BuildTimestamp=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}" -o tinyauth-amd64 ./cmd/tinyauth
95+
go build -tags ${{ needs.generate-metadata.outputs.BUILD_TAGS }} \
96+
-ldflags "-X github.com/tinyauthapp/tinyauth/internal/model.Version=${{ needs.generate-metadata.outputs.VERSION }} \
97+
-X github.com/tinyauthapp/tinyauth/internal/model.CommitHash=${{ needs.generate-metadata.outputs.COMMIT_HASH }} \
98+
-X github.com/tinyauthapp/tinyauth/internal/model.BuildTimestamp=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}" \
99+
-o tinyauth-amd64 ./cmd/tinyauth
87100
env:
88101
CGO_ENABLED: 0
89102

@@ -128,7 +141,11 @@ jobs:
128141
- name: Build
129142
run: |
130143
cp -r frontend/dist internal/assets/dist
131-
go build -ldflags "-X github.com/tinyauthapp/tinyauth/internal/model.Version=${{ needs.generate-metadata.outputs.VERSION }} -X github.com/tinyauthapp/tinyauth/internal/model.CommitHash=${{ needs.generate-metadata.outputs.COMMIT_HASH }} -X github.com/tinyauthapp/tinyauth/internal/model.BuildTimestamp=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}" -o tinyauth-arm64 ./cmd/tinyauth
144+
go build -tags ${{ needs.generate-metadata.outputs.BUILD_TAGS }} \
145+
-ldflags "-X github.com/tinyauthapp/tinyauth/internal/model.Version=${{ needs.generate-metadata.outputs.VERSION }} \
146+
-X github.com/tinyauthapp/tinyauth/internal/model.CommitHash=${{ needs.generate-metadata.outputs.COMMIT_HASH }} \
147+
-X github.com/tinyauthapp/tinyauth/internal/model.BuildTimestamp=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}" \
148+
-o tinyauth-arm64 ./cmd/tinyauth
132149
env:
133150
CGO_ENABLED: 0
134151

@@ -180,6 +197,7 @@ jobs:
180197
VERSION=${{ needs.generate-metadata.outputs.VERSION }}
181198
COMMIT_HASH=${{ needs.generate-metadata.outputs.COMMIT_HASH }}
182199
BUILD_TIMESTAMP=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}
200+
BUILD_TAGS=${{ needs.generate-metadata.outputs.BUILD_TAGS }}
183201
184202
- name: Export digest
185203
run: |
@@ -190,7 +208,7 @@ jobs:
190208
- name: Upload digest
191209
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
192210
with:
193-
name: digests-linux-amd64
211+
name: digests-alpine-linux-amd64
194212
path: ${{ runner.temp }}/digests/*
195213
if-no-files-found: error
196214
retention-days: 1
@@ -239,6 +257,7 @@ jobs:
239257
VERSION=${{ needs.generate-metadata.outputs.VERSION }}
240258
COMMIT_HASH=${{ needs.generate-metadata.outputs.COMMIT_HASH }}
241259
BUILD_TIMESTAMP=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}
260+
BUILD_TAGS=${{ needs.generate-metadata.outputs.BUILD_TAGS }}
242261
243262
- name: Export digest
244263
run: |
@@ -296,6 +315,7 @@ jobs:
296315
VERSION=${{ needs.generate-metadata.outputs.VERSION }}
297316
COMMIT_HASH=${{ needs.generate-metadata.outputs.COMMIT_HASH }}
298317
BUILD_TIMESTAMP=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}
318+
BUILD_TAGS=${{ needs.generate-metadata.outputs.BUILD_TAGS }}
299319
300320
- name: Export digest
301321
run: |
@@ -306,7 +326,7 @@ jobs:
306326
- name: Upload digest
307327
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
308328
with:
309-
name: digests-linux-arm64
329+
name: digests-alpine-linux-arm64
310330
path: ${{ runner.temp }}/digests/*
311331
if-no-files-found: error
312332
retention-days: 1
@@ -355,6 +375,7 @@ jobs:
355375
VERSION=${{ needs.generate-metadata.outputs.VERSION }}
356376
COMMIT_HASH=${{ needs.generate-metadata.outputs.COMMIT_HASH }}
357377
BUILD_TIMESTAMP=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}
378+
BUILD_TAGS=${{ needs.generate-metadata.outputs.BUILD_TAGS }}
358379
359380
- name: Export digest
360381
run: |
@@ -380,7 +401,7 @@ jobs:
380401
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
381402
with:
382403
path: ${{ runner.temp }}/digests
383-
pattern: digests-*
404+
pattern: digests-alpine-*
384405
merge-multiple: true
385406

386407
- name: Login to GitHub Container Registry

.github/workflows/release.yml

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,27 @@ jobs:
1616
VERSION: ${{ steps.metadata.outputs.VERSION }}
1717
COMMIT_HASH: ${{ steps.metadata.outputs.COMMIT_HASH }}
1818
BUILD_TIMESTAMP: ${{ steps.metadata.outputs.BUILD_TIMESTAMP }}
19+
BUILD_TAGS: ${{ steps.metadata.outputs.BUILD_TAGS }}
1920
steps:
2021
- name: Checkout
2122
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
2223

24+
- name: Install go
25+
uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6
26+
with:
27+
go-version: "^1.26.4"
28+
2329
- name: Generate metadata
2430
id: metadata
31+
env:
32+
REF_NAME: ${{ github.ref_name }}
2533
run: |
26-
echo "VERSION=${{ github.ref_name }}" >> "$GITHUB_OUTPUT"
34+
echo "VERSION=$REF_NAME" >> "$GITHUB_OUTPUT"
2735
echo "COMMIT_HASH=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"
2836
echo "BUILD_TIMESTAMP=$(date '+%Y-%m-%dT%H:%M:%S')" >> "$GITHUB_OUTPUT"
37+
export TAILSCALE_BUILD_TAGS=$(go run tailscale.com/cmd/featuretags@v1.100.0 -min -add acme,serve,netstack)
38+
export GIN_BUILD_TAGS=nomsgpack
39+
echo "BUILD_TAGS=$TAILSCALE_BUILD_TAGS,$GIN_BUILD_TAGS" >> "$GITHUB_OUTPUT"
2940
3041
binary-build:
3142
runs-on: ubuntu-latest
@@ -59,7 +70,11 @@ jobs:
5970
- name: Build
6071
run: |
6172
cp -r frontend/dist internal/assets/dist
62-
go build -ldflags "-s -w -X github.com/tinyauthapp/tinyauth/internal/model.Version=${{ needs.generate-metadata.outputs.VERSION }} -X github.com/tinyauthapp/tinyauth/internal/model.CommitHash=${{ needs.generate-metadata.outputs.COMMIT_HASH }} -X github.com/tinyauthapp/tinyauth/internal/model.BuildTimestamp=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}" -o tinyauth-amd64 ./cmd/tinyauth
73+
go build -tags ${{ needs.generate-metadata.outputs.BUILD_TAGS }} \
74+
-ldflags "-s -w -X github.com/tinyauthapp/tinyauth/internal/model.Version=${{ needs.generate-metadata.outputs.VERSION }} \
75+
-X github.com/tinyauthapp/tinyauth/internal/model.CommitHash=${{ needs.generate-metadata.outputs.COMMIT_HASH }} \
76+
-X github.com/tinyauthapp/tinyauth/internal/model.BuildTimestamp=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}" \
77+
-o tinyauth-amd64 ./cmd/tinyauth
6378
env:
6479
CGO_ENABLED: 0
6580

@@ -101,7 +116,11 @@ jobs:
101116
- name: Build
102117
run: |
103118
cp -r frontend/dist internal/assets/dist
104-
go build -ldflags "-s -w -X github.com/tinyauthapp/tinyauth/internal/model.Version=${{ needs.generate-metadata.outputs.VERSION }} -X github.com/tinyauthapp/tinyauth/internal/model.CommitHash=${{ needs.generate-metadata.outputs.COMMIT_HASH }} -X github.com/tinyauthapp/tinyauth/internal/model.BuildTimestamp=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}" -o tinyauth-arm64 ./cmd/tinyauth
119+
go build -tags ${{ needs.generate-metadata.outputs.BUILD_TAGS }} \
120+
-ldflags "-s -w -X github.com/tinyauthapp/tinyauth/internal/model.Version=${{ needs.generate-metadata.outputs.VERSION }} \
121+
-X github.com/tinyauthapp/tinyauth/internal/model.CommitHash=${{ needs.generate-metadata.outputs.COMMIT_HASH }} \
122+
-X github.com/tinyauthapp/tinyauth/internal/model.BuildTimestamp=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}" \
123+
-o tinyauth-arm64 ./cmd/tinyauth
105124
env:
106125
CGO_ENABLED: 0
107126

@@ -151,6 +170,7 @@ jobs:
151170
COMMIT_HASH=${{ needs.generate-metadata.outputs.COMMIT_HASH }}
152171
BUILD_TIMESTAMP=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}
153172
LDFLAGS=-s -w
173+
BUILD_TAGS=${{ needs.generate-metadata.outputs.BUILD_TAGS }}
154174
155175
- name: Export digest
156176
run: |
@@ -161,7 +181,7 @@ jobs:
161181
- name: Upload digest
162182
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
163183
with:
164-
name: digests-linux-amd64
184+
name: digests-alpine-linux-amd64
165185
path: ${{ runner.temp }}/digests/*
166186
if-no-files-found: error
167187
retention-days: 1
@@ -208,6 +228,7 @@ jobs:
208228
COMMIT_HASH=${{ needs.generate-metadata.outputs.COMMIT_HASH }}
209229
BUILD_TIMESTAMP=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}
210230
LDFLAGS=-s -w
231+
BUILD_TAGS=${{ needs.generate-metadata.outputs.BUILD_TAGS }}
211232
212233
- name: Export digest
213234
run: |
@@ -263,6 +284,7 @@ jobs:
263284
COMMIT_HASH=${{ needs.generate-metadata.outputs.COMMIT_HASH }}
264285
BUILD_TIMESTAMP=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}
265286
LDFLAGS=-s -w
287+
BUILD_TAGS=${{ needs.generate-metadata.outputs.BUILD_TAGS }}
266288
267289
- name: Export digest
268290
run: |
@@ -273,7 +295,7 @@ jobs:
273295
- name: Upload digest
274296
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
275297
with:
276-
name: digests-linux-arm64
298+
name: digests-alpine-linux-arm64
277299
path: ${{ runner.temp }}/digests/*
278300
if-no-files-found: error
279301
retention-days: 1
@@ -320,6 +342,7 @@ jobs:
320342
COMMIT_HASH=${{ needs.generate-metadata.outputs.COMMIT_HASH }}
321343
BUILD_TIMESTAMP=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}
322344
LDFLAGS=-s -w
345+
BUILD_TAGS=${{ needs.generate-metadata.outputs.BUILD_TAGS }}
323346
324347
- name: Export digest
325348
run: |
@@ -345,7 +368,7 @@ jobs:
345368
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
346369
with:
347370
path: ${{ runner.temp }}/digests
348-
pattern: digests-*
371+
pattern: digests-alpine-*
349372
merge-multiple: true
350373

351374
- name: Login to GitHub Container Registry

Dockerfile

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ ARG VERSION
2828
ARG COMMIT_HASH
2929
ARG BUILD_TIMESTAMP
3030
ARG LDFLAGS
31+
ARG BUILD_TAGS
3132

3233
WORKDIR /tinyauth
3334

@@ -40,10 +41,11 @@ COPY ./cmd ./cmd
4041
COPY ./internal ./internal
4142
COPY --from=frontend-builder /frontend/dist ./internal/assets/dist
4243

43-
RUN CGO_ENABLED=0 go build -ldflags "${LDFLAGS} \
44+
RUN CGO_ENABLED=0 go build -tags "${BUILD_TAGS}" -ldflags "${LDFLAGS} \
4445
-X github.com/tinyauthapp/tinyauth/internal/model.Version=${VERSION} \
4546
-X github.com/tinyauthapp/tinyauth/internal/model.CommitHash=${COMMIT_HASH} \
46-
-X github.com/tinyauthapp/tinyauth/internal/model.BuildTimestamp=${BUILD_TIMESTAMP}" ./cmd/tinyauth
47+
-X github.com/tinyauthapp/tinyauth/internal/model.BuildTimestamp=${BUILD_TIMESTAMP}" \
48+
-o tinyauth ./cmd/tinyauth
4749

4850
# Runner
4951
FROM alpine:3.24 AS runner

Dockerfile.distroless

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ ARG VERSION
2828
ARG COMMIT_HASH
2929
ARG BUILD_TIMESTAMP
3030
ARG LDFLAGS
31+
ARG BUILD_TAGS
3132

3233
WORKDIR /tinyauth
3334

@@ -36,14 +37,15 @@ COPY go.sum ./
3637

3738
RUN go mod download
3839

39-
COPY ./cmd ./cmd
40+
COPY ./cmd ./cmd/
4041
COPY ./internal ./internal
4142
COPY --from=frontend-builder /frontend/dist ./internal/assets/dist
4243

43-
RUN CGO_ENABLED=0 go build -ldflags "${LDFLAGS} \
44+
RUN CGO_ENABLED=0 go build -tags "${BUILD_TAGS}" -ldflags "${LDFLAGS} \
4445
-X github.com/tinyauthapp/tinyauth/internal/model.Version=${VERSION} \
4546
-X github.com/tinyauthapp/tinyauth/internal/model.CommitHash=${COMMIT_HASH} \
46-
-X github.com/tinyauthapp/tinyauth/internal/model.BuildTimestamp=${BUILD_TIMESTAMP}" ./cmd/tinyauth
47+
-X github.com/tinyauthapp/tinyauth/internal/model.BuildTimestamp=${BUILD_TIMESTAMP}" \
48+
-o tinyauth ./cmd/tinyauth
4749

4850
# Make the data directory with a non-root user
4951
RUN addgroup tinyauth && adduser -DH tinyauth -G tinyauth

Makefile

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ COMMIT_HASH := $(shell git rev-parse HEAD)
99
BUILD_TIMESTAMP := $(shell date '+%Y-%m-%dT%H:%M:%S')
1010
BIN_NAME := tinyauth-$(GOARCH)
1111
LDFLAGS := -s -w
12+
# We don't want all of the tailscale feature-set
13+
TAILSCALE_BUILD_TAGS = $(shell go run tailscale.com/cmd/featuretags@v1.100.0 -min -add acme,serve,netstack)
14+
# Whatever 6MB serialization lib Gin is using
15+
GIN_BUILD_TAGS := nomsgpack
16+
BUILD_TAGS = $(GIN_BUILD_TAGS),$(TAILSCALE_BUILD_TAGS)
1217

1318
# Development vars
1419
DEV_COMPOSE := $(shell test -f "docker-compose.test.yml" && echo "docker-compose.test.yml" || echo "docker-compose.dev.yml" )
@@ -39,7 +44,7 @@ webui: clean-webui
3944

4045
# Build the binary
4146
binary: webui
42-
CGO_ENABLED=$(CGO_ENABLED) go build -ldflags "${LDFLAGS} \
47+
CGO_ENABLED=$(CGO_ENABLED) go build -tags "${BUILD_TAGS}" -ldflags "${LDFLAGS} \
4348
-X github.com/tinyauthapp/tinyauth/internal/model.Version=${TAG_NAME} \
4449
-X github.com/tinyauthapp/tinyauth/internal/model.CommitHash=${COMMIT_HASH} \
4550
-X github.com/tinyauthapp/tinyauth/internal/model.BuildTimestamp=${BUILD_TIMESTAMP}" \
@@ -97,8 +102,18 @@ generate:
97102

98103
# Docker image
99104
docker:
100-
docker buildx build -t tinyauthapp/tinyauth:dev --build-arg=VERSION=$(TAG_NAME) --build-arg=COMMIT_HASH=$(COMMIT_HASH) --build-arg=BUILD_TIMESTAMP=$(BUILD_TIMESTAMP) -f Dockerfile .
105+
docker buildx build -t tinyauthapp/tinyauth:dev \
106+
--build-arg=VERSION=$(TAG_NAME) \
107+
--build-arg=COMMIT_HASH=$(COMMIT_HASH) \
108+
--build-arg=BUILD_TIMESTAMP=$(BUILD_TIMESTAMP) \
109+
--build-arg=BUILD_TAGS=$(BUILD_TAGS) \
110+
-f Dockerfile .
101111

102112
# Docker image distroless
103113
docker-distroless:
104-
docker buildx build -t tinyauthapp/tinyauth:dev-distroless --build-arg=VERSION=$(TAG_NAME) --build-arg=COMMIT_HASH=$(COMMIT_HASH) --build-arg=BUILD_TIMESTAMP=$(BUILD_TIMESTAMP) -f Dockerfile.distroless .
114+
docker buildx build -t tinyauthapp/tinyauth:dev-distroless \
115+
--build-arg=VERSION=$(TAG_NAME) \
116+
--build-arg=COMMIT_HASH=$(COMMIT_HASH) \
117+
--build-arg=BUILD_TIMESTAMP=$(BUILD_TIMESTAMP) \
118+
--build-arg=BUILD_TAGS=$(BUILD_TAGS) \
119+
-f Dockerfile.distroless .

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.26.4
44

55
require (
66
charm.land/huh/v2 v2.0.3
7+
charm.land/lipgloss/v2 v2.0.1
78
github.com/cenkalti/backoff/v5 v5.0.3
89
github.com/docker/docker v28.5.2+incompatible
910
github.com/gin-gonic/gin v1.12.0
@@ -25,6 +26,7 @@ require (
2526
golang.org/x/crypto v0.53.0
2627
golang.org/x/oauth2 v0.36.0
2728
golang.org/x/tools v0.47.0
29+
gopkg.in/yaml.v3 v3.0.1
2830
k8s.io/apimachinery v0.36.2
2931
k8s.io/client-go v0.36.2
3032
modernc.org/sqlite v1.53.0
@@ -34,7 +36,6 @@ require (
3436
require (
3537
charm.land/bubbles/v2 v2.0.0 // indirect
3638
charm.land/bubbletea/v2 v2.0.2 // indirect
37-
charm.land/lipgloss/v2 v2.0.1 // indirect
3839
dario.cat/mergo v1.0.1 // indirect
3940
filippo.io/edwards25519 v1.2.0 // indirect
4041
github.com/Azure/go-ntlmssp v0.1.1 // indirect
@@ -169,7 +170,6 @@ require (
169170
golang.zx2c4.com/wireguard/windows v0.5.3 // indirect
170171
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect
171172
gopkg.in/inf.v0 v0.9.1 // indirect
172-
gopkg.in/yaml.v3 v3.0.1 // indirect
173173
gotest.tools/v3 v3.5.2 // indirect
174174
gvisor.dev/gvisor v0.0.0-20260224225140-573d5e7127a8 // indirect
175175
k8s.io/klog/v2 v2.140.0 // indirect

internal/controller/oidc_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,7 @@ func (controller *OIDCController) resolveRequestObject(c *gin.Context) (*service
739739
func (controller *OIDCController) resolveNormalParams(c *gin.Context) (*service.AuthorizeRequest, error) {
740740
var req service.AuthorizeRequest
741741

742-
bind := binding.Query
742+
var bind binding.Binding = binding.Query
743743

744744
if c.Request.Method == http.MethodPost {
745745
bind = binding.Form

0 commit comments

Comments
 (0)