initial commit
Some checks failed
ci / go (push) Has been cancelled
ci / admin-ui (push) Has been cancelled
ci / runtime-sdk (push) Has been cancelled
ci / helm (push) Has been cancelled
ci / openapi (push) Has been cancelled
ci / container (push) Has been cancelled
ci / release-config (push) Has been cancelled
ci / shared styling (push) Has been cancelled
ci / security (push) Has been cancelled
ci / all green (push) Has been cancelled

This commit is contained in:
Daniel Noulet 2026-10-07 15:11:35 +02:00
commit 951dd8d26b
175 changed files with 50041 additions and 0 deletions

197
goreleaser.yaml Normal file
View file

@ -0,0 +1,197 @@
# GoReleaser configuration.
#
# The binary is fully static (CGO_ENABLED=0), so every target is a plain file with
# no runtime dependency. That makes the archives boring on purpose: the only thing
# a consumer needs is the binary and, optionally, the frontend assets.
#
# The frontend assets are built inside the Dockerfile rather than here, so the
# released container image and a local `docker build` are byte-for-byte the same
# artefact. Goreleaser handles the standalone binaries, which are for people
# running the service without a container at all.
version: 2
project_name: go-bananas
before:
hooks:
- go mod download
- go mod verify
# The release image ships the admin UI and the runtime SDK, so they have to
# exist before the Docker build. `npm ci` rather than `install`, because the
# lockfile is the point: a release that silently resolved different dependency
# versions from the ones CI tested would not be the artefact that was signed.
- npm --prefix web ci --no-audit --no-fund
- npm --prefix web run build
- npm --prefix sdk ci --no-audit --no-fund
- npm --prefix sdk run build
builds:
- id: go-bananas
main: ./cmd/go-bananas
binary: go-bananas
env:
# Pure Go throughout: modernc.org/sqlite needs no cgo, so the binary has no
# libc dependency and cross-compilation is trivial.
- CGO_ENABLED=0
flags:
- -trimpath
ldflags:
- -s -w
- -X github.com/urpi/go-bananas/internal/app.Version={{ .Version }}
- -X github.com/urpi/go-bananas/internal/app.Commit={{ .FullCommit }}
- -X github.com/urpi/go-bananas/internal/app.BuildDate={{ .Date }}
goos:
- linux
- darwin
- windows
goarch:
- amd64
- arm64
goarm: ["7"]
ignore:
# Windows on arm64 has no meaningful server use, and the darwin/arm64 build
# is only useful for local development.
- goos: windows
goarch: arm64
- goos: darwin
goarch: arm64
mod_timestamp: "{{ .CommitTimestamp }}"
archives:
- id: default
ids: [go-bananas]
formats: [tar.gz]
format_overrides:
- goos: windows
formats: [zip]
name_template: >-
{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}
{{- with .Arm }}v{{ . }}{{ end }}
files:
- LICENSE
- README.md
- docs/**/*
- src: internal/store/migrations/*.sql
dst: migrations
# The built admin UI is not embedded in the binary, so a standalone run needs
# to be told where it is. Shipping the directory keeps `go-bananas` usable
# outside a container.
- src: web/dist/**
dst: web
- src: sdk/dist/**
dst: sdk
checksum:
name_template: "{{ .ProjectName }}_{{ .Version }}_checksums.txt"
algorithm: sha256
snapshot:
version_template: "{{ incpatch .Version }}-next"
changelog:
sort: asc
filters:
exclude:
- "^docs:"
- "^test:"
- "^chore:"
- "^ci:"
- Merge pull request
- Merge branch
groups:
- title: Features
regexp: '^feat(\(.+\))?!?:'
- title: Fixes
regexp: '^fix(\(.+\))?!?:'
- title: Security
regexp: '^(security|sec)(\(.+\))?!?:'
- title: Dependencies
regexp: '^(build|ci|chore)(\(.+\))?!?:'
sboms:
- id: default
# CycloneDX is the format most vulnerability scanners understand out of the box.
cmd: syft
args: ["dir:.", "-o", "cyclonedx-json={{ .ArtifactName }}.sbom.json"]
artifacts: archive
signs:
- id: default
# Cosign with keyless OIDC: no long-lived signing key to protect or rotate.
cmd: cosign
certificate: "${artifact}.pem"
args:
- sign-blob
- "--output-certificate=${certificate}"
- "--output-signature=${signature}"
- "${artifact}"
- "--yes"
env:
- COSIGN_EXPERIMENTAL=1
artifacts: archive
# Signing only runs where a keyless identity is available; a fork's release
# job has none, and a failed sign should not fail the whole release.
ids: ["default"]
release:
prerelease: auto
# Draft by default. A published container image or a pushed tag is very hard to
# walk back, so the final promotion is a deliberate human action.
draft: false
footer: |
## Installation
```bash
helm install go-bananas oci://ghcr.io/urpi/charts/go-bananas --version {{ .Version }}
```
## Verification
```bash
cosign verify-blob \\
--certificate {{ .ArtifactName }}.pem \\
--signature {{ .ArtifactName }}.sig \\
{{ .ArtifactName }}
```
dockers:
- id: amd64
ids: [go-bananas]
goos: linux
goarch: amd64
dockerfile: Dockerfile.release
image_templates:
- "ghcr.io/urpi/go-bananas:{{ .Version }}-amd64"
extra_files:
- web/dist
- sdk/dist
build_flag_templates:
- "--platform=linux/amd64"
- "--build-arg=TARGETARCH=amd64"
- "--build-arg=VERSION={{ .Version }}"
- "--build-arg=COMMIT={{ .FullCommit }}"
- "--build-arg=BUILD_DATE={{ .Date }}"
- id: arm64
ids: [go-bananas]
goos: linux
goarch: arm64
dockerfile: Dockerfile.release
image_templates:
- "ghcr.io/urpi/go-bananas:{{ .Version }}-arm64"
extra_files:
- web/dist
- sdk/dist
build_flag_templates:
- "--platform=linux/arm64"
- "--build-arg=TARGETARCH=arm64"
- "--build-arg=VERSION={{ .Version }}"
- "--build-arg=COMMIT={{ .FullCommit }}"
- "--build-arg=BUILD_DATE={{ .Date }}"
docker_manifests:
- name_template: "ghcr.io/urpi/go-bananas:{{ .Version }}"
image_templates:
- "ghcr.io/urpi/go-bananas:{{ .Version }}-amd64"
- "ghcr.io/urpi/go-bananas:{{ .Version }}-arm64"