ship every cmd binary in the release
ci/woodpecker/pr/build Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful

Take the binary list from cmd/ in the Makefile, the RPM packaging and the
release pipeline so a new tool ships without a pipeline edit.
This commit is contained in:
2026-09-12 16:46:51 +10:00
parent 2e2562018f
commit 6551ab9f13
7 changed files with 68 additions and 66 deletions
+2 -4
View File
@@ -1,5 +1,3 @@
# built binaries (repo root only — not the cmd/ source dirs)
/catalog-diff
# cross-compiled release artifacts (e.g. catalog-diff-linux-amd64)
/catalog-diff-*
# build output: binaries, completions, cross-compiled release artifacts and
# packages all land under dist/
dist/
+10 -8
View File
@@ -17,8 +17,8 @@ steps:
memory: 2Gi
cpu: 2
# Build every binary into dist/ (consumed by the RPM step) plus the
# cross-platform binaries attached to the Gitea release.
# Build every binary into dist/bin (consumed by the RPM step) plus the
# cross-platform binaries attached to the Gitea release, in dist/release.
- name: build
image: git.unkin.net/unkin/almalinux9-gobuilder:20260606
commands:
@@ -27,12 +27,13 @@ steps:
# for the shell instead of substituting them (as pipeline vars) at parse
# time. ${CI_COMMIT_TAG} is a real Woodpecker var and stays single-$.
- |
for name in catalog-diff; do
mkdir -p dist/release
for name in $$(make print-binaries); do
for osarch in linux/amd64 linux/arm64 darwin/amd64 darwin/arm64; do
os="$${osarch%/*}"; arch="$${osarch#*/}"
GOOS="$$os" GOARCH="$$arch" \
go build -ldflags="-s -w -X main.version=${CI_COMMIT_TAG}" \
-o "$${name}-$${os}-$${arch}" "./cmd/$${name}"
-o "dist/release/$${name}-$${os}-$${arch}" "./cmd/$${name}"
done
done
depends_on: [test]
@@ -126,11 +127,12 @@ steps:
NOTES=$$(git log --pretty=format:"- %s")
fi
tea releases create --tag "${CI_COMMIT_TAG}" --title "${CI_COMMIT_TAG}" --note "$${NOTES}" --login gitea --repo "${CI_REPO}"
# Everything to attach lives in dist/release, so the asset list is the
# directory rather than a hand-kept list of binary names.
RPM=$$(ls dist/*.rpm 2>/dev/null | head -1)
ASSETS="catalog-diff-linux-amd64 catalog-diff-linux-arm64 catalog-diff-darwin-amd64 catalog-diff-darwin-arm64"
[ -n "$$RPM" ] && ASSETS="$$ASSETS $$RPM"
sha256sum $$ASSETS > sha256sums.txt
tea releases assets create "${CI_COMMIT_TAG}" $$ASSETS sha256sums.txt \
if [ -n "$$RPM" ]; then cp "$$RPM" dist/release/; fi
(cd dist/release && sha256sum * >../sha256sums.txt && mv ../sha256sums.txt .)
tea releases assets create "${CI_COMMIT_TAG}" dist/release/* \
--login gitea --repo "${CI_REPO}"
depends_on: [upload-rpm]
backend_options:
+3 -3
View File
@@ -30,9 +30,9 @@ scripts/build-rpm.sh # completions + nfpm packaging
.woodpecker/ # CI: build, test, pre-commit (PR) + release (tag)
```
Adding a binary: create `cmd/<name>/`, add the name to `BINARIES` in the
Makefile and to `scripts/build-rpm.sh`, and add its files to
`packaging/nfpm.yaml`.
Adding a binary: create `cmd/<name>/`. The Makefile, `scripts/build-rpm.sh`,
`packaging/nfpm.yaml` and the release pipeline all take the shipped list from
`cmd/`, so nothing else needs editing.
## Transport
+19 -12
View File
@@ -1,25 +1,31 @@
# All shipped binaries. Every tool is a separate main package under cmd/, so
# adding one is a matter of adding its name here.
BINARIES := catalog-diff catalog-impact
# All shipped binaries, discovered from cmd/. Every tool is a separate main
# package there, so adding one needs no edit here.
BINARIES := $(notdir $(wildcard cmd/*))
DIST := dist
BINDIR := $(DIST)/bin
COMPDIR := $(DIST)/completions
VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo dev)
GOFLAGS := -ldflags="-s -w -X main.version=$(VERSION)"
OS ?= $(shell go env GOOS)
ARCH ?= $(shell go env GOARCH)
.PHONY: all build test lint fmt pre-commit clean install completions rpm rpm-package patch minor major _tag
.PHONY: all build test lint fmt pre-commit clean install completions print-binaries rpm rpm-package patch minor major _tag
all: build
# Build every binary into dist/ so the nfpm packaging step
# Build every binary into dist/bin so the nfpm packaging step
# (scripts/build-rpm.sh) can find them. Each main package needs its own -o, so
# they are built individually rather than with a single ./... invocation.
build:
@for b in $(BINARIES); do \
echo "building $$b"; \
CGO_ENABLED=0 GOOS=$(OS) GOARCH=$(ARCH) go build $(GOFLAGS) -o $(DIST)/$$b ./cmd/$$b || exit 1; \
CGO_ENABLED=0 GOOS=$(OS) GOARCH=$(ARCH) go build $(GOFLAGS) -o $(BINDIR)/$$b ./cmd/$$b || exit 1; \
done
# The binary list, for CI steps that cross-compile the same set.
print-binaries:
@echo $(BINARIES)
test:
go test -v -race ./...
@@ -33,18 +39,19 @@ pre-commit:
pre-commit run --all-files
clean:
rm -rf $(DIST) $(BINARIES)
rm -rf $(DIST)
install:
go install $(GOFLAGS) ./...
# Generate bash/zsh/fish completions for every binary into dist/completions.
# Generate bash/zsh/fish completions for every binary into dist/completions,
# named and laid out exactly as they install (the RPM globs these directories).
completions: build
@mkdir -p $(DIST)/completions
@mkdir -p $(COMPDIR)/bash $(COMPDIR)/zsh $(COMPDIR)/fish
@for b in $(BINARIES); do \
$(DIST)/$$b completion bash > $(DIST)/completions/$$b.bash; \
$(DIST)/$$b completion zsh > $(DIST)/completions/_$$b; \
$(DIST)/$$b completion fish > $(DIST)/completions/$$b.fish; \
$(BINDIR)/$$b completion bash > $(COMPDIR)/bash/$$b; \
$(BINDIR)/$$b completion zsh > $(COMPDIR)/zsh/_$$b; \
$(BINDIR)/$$b completion fish > $(COMPDIR)/fish/$$b.fish; \
done
# Build the binaries then package them (with completions) into an RPM via nfpm.
+1 -1
View File
@@ -16,7 +16,7 @@ persisted on the server.
```bash
dnf install puppet-catalog-tools # from the artifactapi rpm-internal repo
# or
make build # -> dist/
make build # -> dist/bin/
```
# catalog-diff
+11 -29
View File
@@ -22,44 +22,26 @@ replaces:
provides:
- puppet-catalog-tools
# Globs, so a new tool under cmd/ ships without editing this file.
contents:
- src: dist/catalog-diff
dst: /usr/bin/catalog-diff
- src: dist/bin/*
dst: /usr/bin
file_info:
mode: 0755
owner: root
group: root
- src: dist/catalog-impact
dst: /usr/bin/catalog-impact
file_info:
mode: 0755
owner: root
group: root
# Shell completions (generated by scripts/build-rpm.sh before packaging).
- src: dist/completions/catalog-diff.bash
dst: /usr/share/bash-completion/completions/catalog-diff
# Shell completions (generated by scripts/build-rpm.sh before packaging,
# already named as they install).
- src: dist/completions/bash/*
dst: /usr/share/bash-completion/completions
file_info:
mode: 0644
- src: dist/completions/_catalog-diff
dst: /usr/share/zsh/site-functions/_catalog-diff
- src: dist/completions/zsh/*
dst: /usr/share/zsh/site-functions
file_info:
mode: 0644
- src: dist/completions/catalog-diff.fish
dst: /usr/share/fish/vendor_completions.d/catalog-diff.fish
file_info:
mode: 0644
- src: dist/completions/catalog-impact.bash
dst: /usr/share/bash-completion/completions/catalog-impact
file_info:
mode: 0644
- src: dist/completions/_catalog-impact
dst: /usr/share/zsh/site-functions/_catalog-impact
file_info:
mode: 0644
- src: dist/completions/catalog-impact.fish
dst: /usr/share/fish/vendor_completions.d/catalog-impact.fish
- src: dist/completions/fish/*
dst: /usr/share/fish/vendor_completions.d
file_info:
mode: 0644
+22 -9
View File
@@ -12,24 +12,37 @@ cd "${ROOT_DIR}"
VERSION="${1:-${CI_COMMIT_TAG:-0.0.0-dev}}"
VERSION="${VERSION#v}" # strip a leading v
PACKAGE="puppet-catalog-tools"
BINARIES=(catalog-diff catalog-impact)
DIST="dist"
BIN_DIR="${DIST}/bin"
COMP_DIR="${DIST}/completions"
# Every tool is a main package under cmd/, so the shipped list is the contents
# of cmd/ — the same list the Makefile builds.
BINARIES=()
for dir in cmd/*/; do
BINARIES+=("$(basename "${dir}")")
done
if [ ${#BINARIES[@]} -eq 0 ]; then
echo "ERROR: no binaries found under cmd/" >&2
exit 1
fi
for b in "${BINARIES[@]}"; do
if [ ! -f "${DIST}/${b}" ]; then
echo "ERROR: ${DIST}/${b} not found; run 'make build' first" >&2
if [ ! -f "${BIN_DIR}/${b}" ]; then
echo "ERROR: ${BIN_DIR}/${b} not found; run 'make build' first" >&2
exit 1
fi
done
# Generate shell completions from the freshly built binaries so they always
# match the shipped flags/subcommands.
COMP_DIR="${DIST}/completions"
mkdir -p "${COMP_DIR}"
# match the shipped flags/subcommands. They are written under the name and
# directory they install as, because nfpm globs these directories.
rm -rf "${COMP_DIR}"
mkdir -p "${COMP_DIR}/bash" "${COMP_DIR}/zsh" "${COMP_DIR}/fish"
for b in "${BINARIES[@]}"; do
"./${DIST}/${b}" completion bash >"${COMP_DIR}/${b}.bash"
"./${DIST}/${b}" completion zsh >"${COMP_DIR}/_${b}"
"./${DIST}/${b}" completion fish >"${COMP_DIR}/${b}.fish"
"./${BIN_DIR}/${b}" completion bash >"${COMP_DIR}/bash/${b}"
"./${BIN_DIR}/${b}" completion zsh >"${COMP_DIR}/zsh/_${b}"
"./${BIN_DIR}/${b}" completion fish >"${COMP_DIR}/fish/${b}.fish"
done
export PACKAGE_NAME="${PACKAGE}"