diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 18f4286..89451ce 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,6 +31,6 @@ jobs: with: go-version: '1.21' - name: Build - run: VERSION="${{ steps.version.outputs.VERSION }}" make all + run: BUILDVCS_FLAG=-buildvcs=false VERSION="${{ steps.version.outputs.VERSION }}" make all diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ddf5dd6..b768616 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,7 +31,7 @@ jobs: go-version: '1.21' - name: Build all binaries - run: VERSION=${{ steps.version.outputs.VERSION }} make all deb + run: BUILDVCS_FLAG=-buildvcs=false VERSION=${{ steps.version.outputs.VERSION }} make all deb - name: Upload artifacts uses: actions/upload-artifact@v4 @@ -76,7 +76,7 @@ jobs: echo "Resolved VERSION=${{ steps.version.outputs.VERSION }}" - name: Build RPM package - run: VERSION=${{ steps.version.outputs.VERSION }} make rpm + run: BUILDVCS_FLAG=-buildvcs=false VERSION=${{ steps.version.outputs.VERSION }} make rpm - name: Copy RPMs to workspace run: | diff --git a/Makefile b/Makefile index 989adee..e3ce39c 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,17 @@ MANSECTION ?= 1 SHELL=/bin/bash -# Sanitize VERSION for use in filenames and tar transform expressions -# Replace forward slashes with dashes to avoid issues with tar --transform + +# Conditionally disable VCS info embedding in Go builds +# Set BUILDVCS_FLAG=-buildvcs=false when: +# - Building in CI environments where .git may not be accessible +# - Building in containers/chroots where git metadata is unavailable +# - VCS info is not needed (default: embed VCS info if available) +BUILDVCS_FLAG ?= + +# Sanitize VERSION for use in filenames and directories +# Replace forward slashes with dashes to avoid issues with directory and filename creation VERSION_SAFE = $(subst /,-,$(VERSION)) + .PHONY: clean snap rpm rpm-setup rpm-local rpm-clean ci-sim-ubuntu ci-sim-fedora ci-sim default: linux all: linux windows darwin freebsd @@ -40,38 +49,38 @@ snap: snapcraft pack bin/linux-amd64/mdview: manpage - env GOOS=linux GOARCH=amd64 go build -buildvcs=false -ldflags "-X main.appVersion=$(VERSION)" -o ./bin/linux-amd64/mdview + env GOOS=linux GOARCH=amd64 go build $(BUILDVCS_FLAG) -ldflags "-X main.appVersion=$(VERSION)" -o ./bin/linux-amd64/mdview cp mdview.1 bin/linux-amd64/ - tar czvf mdview-$(VERSION_SAFE)-linux-amd64.tar.gz --transform s/linux-amd64/mdview-$(VERSION_SAFE)/ -C bin linux-amd64 + mkdir -p bin/mdview-$(VERSION_SAFE)-linux-amd64 && cp -r bin/linux-amd64/* bin/mdview-$(VERSION_SAFE)-linux-amd64/ && tar czvf mdview-$(VERSION_SAFE)-linux-amd64.tar.gz -C bin mdview-$(VERSION_SAFE)-linux-amd64 && rm -rf bin/mdview-$(VERSION_SAFE)-linux-amd64 bin/linux-i386/mdview: - env GOOS=linux GOARCH=386 go build -buildvcs=false -ldflags "-X main.appVersion=$(VERSION)" -o ./bin/linux-i386/mdview + env GOOS=linux GOARCH=386 go build $(BUILDVCS_FLAG) -ldflags "-X main.appVersion=$(VERSION)" -o ./bin/linux-i386/mdview cp mdview.1 bin/linux-i386/ - tar czvf mdview-$(VERSION_SAFE)-linux-i386.tar.gz --transform s/linux-i386/mdview-$(VERSION_SAFE)/ -C bin linux-i386 + mkdir -p bin/mdview-$(VERSION_SAFE)-linux-i386 && cp -r bin/linux-i386/* bin/mdview-$(VERSION_SAFE)-linux-i386/ && tar czvf mdview-$(VERSION_SAFE)-linux-i386.tar.gz -C bin mdview-$(VERSION_SAFE)-linux-i386 && rm -rf bin/mdview-$(VERSION_SAFE)-linux-i386 bin/linux-arm64/mdview: - env GOOS=linux GOARCH=arm64 go build -buildvcs=false -ldflags "-X main.appVersion=$(VERSION)" -o ./bin/linux-arm64/mdview + env GOOS=linux GOARCH=arm64 go build $(BUILDVCS_FLAG) -ldflags "-X main.appVersion=$(VERSION)" -o ./bin/linux-arm64/mdview cp mdview.1 bin/linux-arm64/ - tar czvf mdview-$(VERSION_SAFE)-linux-arm64.tar.gz --transform s/linux-arm64/mdview-$(VERSION_SAFE)/ -C bin linux-arm64 + mkdir -p bin/mdview-$(VERSION_SAFE)-linux-arm64 && cp -r bin/linux-arm64/* bin/mdview-$(VERSION_SAFE)-linux-arm64/ && tar czvf mdview-$(VERSION_SAFE)-linux-arm64.tar.gz -C bin mdview-$(VERSION_SAFE)-linux-arm64 && rm -rf bin/mdview-$(VERSION_SAFE)-linux-arm64 bin/windows-amd64/mdview.exe: - env GOOS=windows GOARCH=amd64 go build -buildvcs=false -ldflags "-X main.appVersion=$(VERSION)" -o ./bin/windows-amd64/mdview.exe + env GOOS=windows GOARCH=amd64 go build $(BUILDVCS_FLAG) -ldflags "-X main.appVersion=$(VERSION)" -o ./bin/windows-amd64/mdview.exe zip -j mdview-$(VERSION_SAFE)-windows-amd64.zip bin/windows-amd64/mdview.exe bin/darwin-amd64/mdview: - env GOOS=darwin GOARCH=amd64 go build -buildvcs=false -ldflags "-X main.appVersion=$(VERSION)" -o ./bin/darwin-amd64/mdview + env GOOS=darwin GOARCH=amd64 go build $(BUILDVCS_FLAG) -ldflags "-X main.appVersion=$(VERSION)" -o ./bin/darwin-amd64/mdview cp mdview.1 bin/darwin-amd64/ - tar czvf mdview-$(VERSION_SAFE)-darwin-amd64.tar.gz --transform s/darwin-amd64/mdview-$(VERSION_SAFE)/ -C bin darwin-amd64 + mkdir -p bin/mdview-$(VERSION_SAFE)-darwin-amd64 && cp -r bin/darwin-amd64/* bin/mdview-$(VERSION_SAFE)-darwin-amd64/ && tar czvf mdview-$(VERSION_SAFE)-darwin-amd64.tar.gz -C bin mdview-$(VERSION_SAFE)-darwin-amd64 && rm -rf bin/mdview-$(VERSION_SAFE)-darwin-amd64 bin/darwin-arm64/mdview: - env GOOS=darwin GOARCH=arm64 go build -buildvcs=false -ldflags "-X main.appVersion=$(VERSION)" -o ./bin/darwin-arm64/mdview + env GOOS=darwin GOARCH=arm64 go build $(BUILDVCS_FLAG) -ldflags "-X main.appVersion=$(VERSION)" -o ./bin/darwin-arm64/mdview cp mdview.1 bin/darwin-arm64/ - tar czvf mdview-$(VERSION_SAFE)-darwin-arm64.tar.gz --transform s/darwin-arm64/mdview-$(VERSION_SAFE)/ -C bin darwin-arm64 + mkdir -p bin/mdview-$(VERSION_SAFE)-darwin-arm64 && cp -r bin/darwin-arm64/* bin/mdview-$(VERSION_SAFE)-darwin-arm64/ && tar czvf mdview-$(VERSION_SAFE)-darwin-arm64.tar.gz -C bin mdview-$(VERSION_SAFE)-darwin-arm64 && rm -rf bin/mdview-$(VERSION_SAFE)-darwin-arm64 bin/freebsd-amd64/mdview: - env GOOS=freebsd GOARCH=amd64 go build -buildvcs=false -ldflags "-X main.appVersion=$(VERSION)" -o ./bin/freebsd-amd64/mdview + env GOOS=freebsd GOARCH=amd64 go build $(BUILDVCS_FLAG) -ldflags "-X main.appVersion=$(VERSION)" -o ./bin/freebsd-amd64/mdview cp mdview.1 bin/freebsd-amd64/mdview - tar czvf mdview-$(VERSION_SAFE)-freebsd-amd64.tar.gz --transform s/freebsd-amd64/mdview-$(VERSION_SAFE)/ -C bin freebsd-amd64 + mkdir -p bin/mdview-$(VERSION_SAFE)-freebsd-amd64 && cp -r bin/freebsd-amd64/* bin/mdview-$(VERSION_SAFE)-freebsd-amd64/ && tar czvf mdview-$(VERSION_SAFE)-freebsd-amd64.tar.gz -C bin mdview-$(VERSION_SAFE)-freebsd-amd64 && rm -rf bin/mdview-$(VERSION_SAFE)-freebsd-amd64 clean: rm -rf bin diff --git a/PACKAGING.md b/PACKAGING.md index 687ab7d..d93d3c2 100644 --- a/PACKAGING.md +++ b/PACKAGING.md @@ -62,6 +62,30 @@ make rpm-local VERSION=1.6.4 | `make ci-sim-fedora` | Simulate Fedora CI build locally | | `make ci-sim` | Run both CI simulations | +### VCS Information in Binaries + +By default, Go embeds version control system (VCS) information into binaries when building from a git repository. This includes the commit hash, modification status, and timestamp. + +The Makefile supports a `BUILDVCS_FLAG` variable to control this behavior: +- **Default (local builds)**: VCS info is embedded when available +- **CI/Container builds**: Use `BUILDVCS_FLAG=-buildvcs=false` to disable VCS embedding + +**When to disable VCS embedding:** +- Building in CI environments where `.git` directory may not be accessible +- Building in containers/chroots where git metadata is unavailable +- Creating reproducible builds in containerized packaging systems + +**Example:** +```bash +# Local build with VCS info (default) +make linux VERSION=1.6.4 + +# CI/container build without VCS info +BUILDVCS_FLAG=-buildvcs=false make linux VERSION=1.6.4 +``` + +The CI workflows and simulation scripts automatically set this flag for reproducible builds. + ## Installing Built Packages ### Debian @@ -260,3 +284,4 @@ The project is already available via: - Makefile VERSION parameter should use `X.Y.Z` (no `v` prefix) - The build system automatically strips the `v` prefix where needed - RPM VERSION is sanitized to replace invalid characters with dots + diff --git a/scripts/ci-sim-ubuntu.sh b/scripts/ci-sim-ubuntu.sh index 3f0318c..b05cc14 100755 --- a/scripts/ci-sim-ubuntu.sh +++ b/scripts/ci-sim-ubuntu.sh @@ -32,7 +32,7 @@ if ! version_ge "$INSTALLED" "$GO_VERSION"; then wget -q "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" -O "$TARFILE" wget -q "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz.sha256" -O "$CHECKSUM_FILE" # Verify checksum - grep -oE '^[0-9a-f]+' "$CHECKSUM_FILE" | awk '{print $1 " " ENVIRON["TARFILE"]}' > "$CHECKSUM_FILE.checked" + grep -oE '^[0-9a-f]+' "$CHECKSUM_FILE" | awk -v tf="$TARFILE" '{print $1 " " tf}' > "$CHECKSUM_FILE.checked" sha256sum -c "$CHECKSUM_FILE.checked" rm -rf /usr/local/go tar -C /usr/local -xzf "$TARFILE"