Prechádzať zdrojové kódy

fix: Build MSI in goreleaser build

jamesread 1 týždeň pred
rodič
commit
b749b797f8

+ 4 - 0
.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)
 

+ 1 - 3
.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}'

+ 1 - 1
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

+ 1 - 1
var/windows/OliveTin.wxs

@@ -34,7 +34,7 @@
     </Directory>
 
     <DirectoryRef Id="ConfigDir">
-      <Component Id="ConfigFile" Guid="A1B2C3D4-E5F6-7890-ABCD-EF1234567890" Win64="yes">
+      <Component Id="ConfigFile" Guid="A1B2C3D4-E5F6-7890-ABCD-EF1234567890" Win64="yes" Permanent="yes" NeverOverwrite="yes">
         <File
           Id="ConfigYaml"
           Source="$(var.ConfigSource)"

+ 5 - 6
var/windows/build-msi.sh

@@ -20,11 +20,11 @@ if ! command -v wixl >/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" \

+ 4 - 2
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}" \

+ 17 - 0
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 "$@"

+ 10 - 5
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