sshkeeper/release.sh

77 lines
2.3 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")"
APP=sshkeeper
VERSION=${VERSION:-${1:-$(git describe --tags --always --dirty 2>/dev/null || echo "dev")}}
LDFLAGS="-s -w -X main.version=${VERSION}"
DIST_DIR="dist"
SOURCE_DATE_EPOCH=${SOURCE_DATE_EPOCH:-$(git log -1 --format=%ct 2>/dev/null || date +%s)}
echo "==> Building release ${APP} ${VERSION}..."
echo "==> SOURCE_DATE_EPOCH=${SOURCE_DATE_EPOCH}"
rm -rf "${DIST_DIR}"
mkdir -p "${DIST_DIR}"
package_docs() {
local package_dir="$1"
cp README.md LICENSE "${package_dir}/"
if [[ -f docs/guide.md ]]; then
mkdir -p "${package_dir}/docs"
cp docs/guide.md "${package_dir}/docs/"
fi
}
normalize_package() {
local package_dir="$1"
find "${package_dir}" -exec touch -h -d "@${SOURCE_DATE_EPOCH}" {} +
}
build_tarball() {
local goos="$1"
local goarch="$2"
local package_dir="${DIST_DIR}/${APP}_${VERSION}_${goos}_${goarch}"
local archive="${DIST_DIR}/${APP}_${VERSION}_${goos}_${goarch}.tar.gz"
echo "==> ${goos}/${goarch}..."
rm -rf "${package_dir}"
mkdir -p "${package_dir}"
GOOS="${goos}" GOARCH="${goarch}" CGO_ENABLED=0 go build -trimpath -ldflags "${LDFLAGS}" -o "${package_dir}/${APP}" .
package_docs "${package_dir}"
normalize_package "${package_dir}"
tar --sort=name --owner=0 --group=0 --numeric-owner --mtime="@${SOURCE_DATE_EPOCH}" -cf - -C "${DIST_DIR}" "$(basename "${package_dir}")" | gzip -n > "${archive}"
rm -rf "${package_dir}"
}
build_zip() {
local goos="$1"
local goarch="$2"
local package_dir="${DIST_DIR}/${APP}_${VERSION}_${goos}_${goarch}"
local archive="${DIST_DIR}/${APP}_${VERSION}_${goos}_${goarch}.zip"
echo "==> ${goos}/${goarch}..."
rm -rf "${package_dir}"
mkdir -p "${package_dir}"
GOOS="${goos}" GOARCH="${goarch}" CGO_ENABLED=0 go build -trimpath -ldflags "${LDFLAGS}" -o "${package_dir}/${APP}.exe" .
package_docs "${package_dir}"
normalize_package "${package_dir}"
(cd "${DIST_DIR}" && find "$(basename "${package_dir}")" -print | sort | zip -X -q "$(basename "${archive}")" -@)
rm -rf "${package_dir}"
}
build_tarball linux amd64
build_tarball linux arm64
build_tarball darwin amd64
build_tarball darwin arm64
build_zip windows amd64
(cd "${DIST_DIR}" && sha256sum *.tar.gz *.zip > checksums.txt)
echo "==> Done."
ls -lh "${DIST_DIR}/"*.tar.gz "${DIST_DIR}/"*.zip "${DIST_DIR}/checksums.txt"