From b749b797f86d0d3ad0727e00f0f19e6d186c34b5 Mon Sep 17 00:00:00 2001 From: jamesread Date: Fri, 26 Jun 2026 21:42:12 +0100 Subject: [PATCH] fix: Build MSI in goreleaser build --- .goreleaser.yml | 4 ++++ .releaserc.yaml | 4 +--- Makefile | 2 +- var/windows/OliveTin.wxs | 2 +- var/windows/build-msi.sh | 11 +++++------ var/windows/generate-resources.sh | 6 ++++-- var/windows/goreleaser-release-with-msi.sh | 17 +++++++++++++++++ var/windows/upload-msi-release.sh | 15 ++++++++++----- 8 files changed, 43 insertions(+), 18 deletions(-) create mode 100755 var/windows/goreleaser-release-with-msi.sh diff --git a/.goreleaser.yml b/.goreleaser.yml index 32c6a76..f299d24 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -43,6 +43,8 @@ builds: checksum: name_template: 'checksums.txt' + extra_files: + - glob: ./dist/OliveTin-windows-amd64.msi snapshot: version_template: "{{ .Branch }}-{{ .ShortCommit }}" changelog: @@ -176,6 +178,8 @@ nfpms: dst: /usr/share/man/man1/OliveTin.1.gz release: + extra_files: + - glob: ./dist/OliveTin-windows-amd64.msi footer: | ## Container images (from GitHub) diff --git a/.releaserc.yaml b/.releaserc.yaml index fc571cf..1aa94a5 100644 --- a/.releaserc.yaml +++ b/.releaserc.yaml @@ -9,8 +9,6 @@ plugins: - '@semantic-release/git' - - "@semantic-release/exec" - publishCmd: | - goreleaser release --clean --timeout 60m - VERSION=${nextRelease.version} ./var/windows/build-msi.sh - ./var/windows/upload-msi-release.sh ${nextRelease.gitTag} + VERSION=${nextRelease.version} GORELEASER_TIMEOUT=60m ./var/windows/goreleaser-release-with-msi.sh tagFormat: '${version}' diff --git a/Makefile b/Makefile index 7ce7955..186b56e 100644 --- a/Makefile +++ b/Makefile @@ -72,4 +72,4 @@ clean: config-tool: cd service && go run cmd/config-tool/main.go -.PHONY: proto service +.PHONY: proto service windows-resources windows-msi diff --git a/var/windows/OliveTin.wxs b/var/windows/OliveTin.wxs index 807dd5b..7884d8a 100644 --- a/var/windows/OliveTin.wxs +++ b/var/windows/OliveTin.wxs @@ -34,7 +34,7 @@ - + /dev/null || ! command -v wixl-heat >/dev/null; then exit 1 fi -normalize_windows_version() { +normalize_msi_version() { local raw="${1#v}" raw="${raw%%-*}" if [[ ! "${raw}" =~ ^[0-9]+(\.[0-9]+){0,3}$ ]]; then - echo "0.0.0.0" + echo "0.0.0" return fi local -a parts=() @@ -32,8 +32,7 @@ normalize_windows_version() { local major="${parts[0]:-0}" local minor="${parts[1]:-0}" local patch="${parts[2]:-0}" - local build="${parts[3]:-0}" - printf '%s.%s.%s.%s' "${major}" "${minor}" "${patch}" "${build}" + printf '%s.%s.%s' "${major}" "${minor}" "${patch}" } VERSION="${VERSION:-}" @@ -44,7 +43,7 @@ if [[ -z "${VERSION}" ]]; then echo "Could not determine release version; set VERSION explicitly" >&2 exit 1 fi -WINDOWS_VERSION="$(normalize_windows_version "${VERSION}")" +MSI_VERSION="$(normalize_msi_version "${VERSION}")" STAGING="$(mktemp -d)" APP_STAGING="$(mktemp -d)" @@ -82,7 +81,7 @@ cp -a "${SOURCE_ROOT}/webui/." "${APP_STAGING}/webui/" wixl \ -v \ -a x64 \ - -D "Version=${WINDOWS_VERSION}" \ + -D "Version=${MSI_VERSION}" \ -D "Win64=yes" \ -D "SourceDir=${APP_STAGING}" \ -D "ConfigSource=${SOURCE_ROOT}/config.yaml" \ diff --git a/var/windows/generate-resources.sh b/var/windows/generate-resources.sh index 50e562c..4728641 100755 --- a/var/windows/generate-resources.sh +++ b/var/windows/generate-resources.sh @@ -70,14 +70,16 @@ fi WINDOWS_VERSION="$(normalize_windows_version "$(resolve_version "${1:-}")")" echo "Generating Windows resources for version ${WINDOWS_VERSION}" +TOOL_BIN="$(mktemp -d)/bin" +export GOBIN="${TOOL_BIN}" go install "github.com/josephspurrier/goversioninfo/cmd/goversioninfo@${GOVERSIONINFO_VERSION}" WORK_DIR="$(mktemp -d)" -trap 'rm -rf "${WORK_DIR}"' EXIT +trap 'rm -rf "${WORK_DIR}" "${TOOL_BIN%/*}"' EXIT ( cd "${WORK_DIR}" - goversioninfo \ + "${TOOL_BIN}/goversioninfo" \ -64 \ -platform-specific \ -icon="${ICON_PATH}" \ diff --git a/var/windows/goreleaser-release-with-msi.sh b/var/windows/goreleaser-release-with-msi.sh new file mode 100755 index 0000000..d69a5e5 --- /dev/null +++ b/var/windows/goreleaser-release-with-msi.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +TIMEOUT="${GORELEASER_TIMEOUT:-60m}" + +if [[ -z "${VERSION:-}" ]]; then + echo "VERSION is required to build the Windows MSI" >&2 + exit 1 +fi + +goreleaser release --clean --timeout "${TIMEOUT}" --skip=checksum,publish "$@" + +"${SCRIPT_DIR}/build-msi.sh" + +goreleaser release --timeout "${TIMEOUT}" \ + --skip=validate,before,build,archive,nfpm,docker,sign,sbom,after,announce "$@" diff --git a/var/windows/upload-msi-release.sh b/var/windows/upload-msi-release.sh index 3773c28..6295c97 100755 --- a/var/windows/upload-msi-release.sh +++ b/var/windows/upload-msi-release.sh @@ -25,11 +25,16 @@ if ! command -v gh >/dev/null; then fi checksums_path="${DIST_DIR}/checksums.txt" -if [[ -f "${checksums_path}" ]] && ! grep -qF " ${MSI_NAME}" "${checksums_path}"; then - ( - cd "${DIST_DIR}" - sha256sum "${MSI_NAME}" - ) >> "${checksums_path}" +new_checksum="$(cd "${DIST_DIR}" && sha256sum "${MSI_NAME}")" +if [[ -f "${checksums_path}" ]] && grep -qF " ${MSI_NAME}" "${checksums_path}"; then + tmp="$(mktemp)" + grep -vF " ${MSI_NAME}" "${checksums_path}" > "${tmp}" + printf '%s\n' "${new_checksum}" >> "${tmp}" + mv "${tmp}" "${checksums_path}" +elif [[ -f "${checksums_path}" ]]; then + printf '%s\n' "${new_checksum}" >> "${checksums_path}" +else + printf '%s\n' "${new_checksum}" > "${checksums_path}" fi gh release upload "${TAG}" "${MSI_PATH}" --clobber