gitbutler/scripts/release.sh

229 lines
5.7 KiB
Bash
Raw Normal View History

#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail
PWD="$(dirname $(readlink -f -- $0))"
2023-07-12 17:06:10 +03:00
CHANNEL=""
DO_SIGN="false"
DO_BUNDLE_UPDATE="false"
2023-02-17 16:21:41 +03:00
VERSION=""
function help() {
local to="$1"
echo "Usage: $0 <flags>" 1>&$to
echo 1>&$to
echo "flags:" 1>&$to
2023-02-17 16:21:41 +03:00
echo " --version release version." 1>&$to
echo " --dist path to store artifacts in." 1>&$to
echo " --sign if set, will sign the app." 1>&$to
2023-07-12 17:06:10 +03:00
echo " --channel the channel to use for the release (release | nightly)." 1>&$to
echo " --help display this message." 1>&$to
}
function error() {
echo "error: $@" 1>&2
echo 1>&2
help 2
exit 1
}
function info() {
echo "$@"
}
function os() {
2023-02-17 14:46:13 +03:00
local os="$(uname -s)"
case "$os" in
Darwin)
echo "macos"
;;
2023-07-31 17:15:21 +03:00
Linux)
echo "linux"
;;
Windows|MSYS*|MINGW*)
echo "windows"
;;
2023-02-17 14:46:13 +03:00
*)
error "$os: unsupported"
2023-02-17 14:46:13 +03:00
;;
esac
}
function arch() {
2023-02-17 14:46:13 +03:00
local arch="$(uname -m)"
case "$arch" in
2023-08-01 18:45:19 +03:00
arm64 | aarch64)
2023-02-17 14:46:13 +03:00
echo "aarch64"
;;
x86_64)
echo "x86_64"
;;
*)
error "$arch: unsupported architecture"
;;
esac
}
ARCH="$(arch)"
OS="$(os)"
2023-02-20 18:39:43 +03:00
DIST="release"
function tauri() {
2023-02-20 18:39:43 +03:00
(cd "$PWD/.." && pnpm tauri "$@")
}
while [[ $# -gt 0 ]]; do
case "$1" in
--help)
help 1
exit 1
;;
2023-02-17 16:21:41 +03:00
--version)
VERSION="$2"
shift
shift
;;
--dist)
DIST="$2"
shift
shift
;;
--sign)
DO_SIGN="true"
shift
;;
2023-07-12 17:06:10 +03:00
--channel)
CHANNEL="$2"
shift
shift
;;
*)
error "unknown flag $1"
;;
esac
done
[ -z "${VERSION-}" ] && error "--version is not set"
2023-02-17 16:21:41 +03:00
[ -z "${TAURI_PRIVATE_KEY-}" ] && error '$TAURI_PRIVATE_KEY is not set'
[ -z "${TAURI_KEY_PASSWORD-}" ] && error '$TAURI_KEY_PASSWORD is not set'
2023-07-12 17:06:10 +03:00
if [ "$CHANNEL" != "release" ] && [ "$CHANNEL" != "nightly" ]; then
error "--channel must be either 'release' or 'nightly'"
fi
export TAURI_PRIVATE_KEY="$TAURI_PRIVATE_KEY"
export TAURI_KEY_PASSWORD="$TAURI_KEY_PASSWORD"
if [ "$DO_SIGN" = "true" ]; then
2023-07-31 17:13:28 +03:00
if [ "$OS" = "macos" ]; then
[ -z "${APPLE_CERTIFICATE-}" ] && error '$APPLE_CERTIFICATE is not set'
[ -z "${APPLE_CERTIFICATE_PASSWORD-}" ] && error '$APPLE_CERTIFICATE_PASSWORD is not set'
[ -z "${APPLE_SIGNING_IDENTITY-}" ] && error '$APPLE_SIGNING_IDENTITY is not set'
[ -z "${APPLE_ID-}" ] && error '$APPLE_ID is not set'
[ -z "${APPLE_TEAM_ID-}" ] && error '$APPLE_TEAM_ID is not set'
[ -z "${APPLE_PASSWORD-}" ] && error '$APPLE_PASSWORD is not set'
2023-07-31 16:55:10 +03:00
export APPLE_CERTIFICATE="$APPLE_CERTIFICATE"
export APPLE_CERTIFICATE_PASSWORD="$APPLE_CERTIFICATE_PASSWORD"
export APPLE_SIGNING_IDENTITY="$APPLE_SIGNING_IDENTITY"
export APPLE_ID="$APPLE_ID"
export APPLE_TEAM_ID="$APPLE_TEAM_ID"
2023-07-31 16:55:10 +03:00
export APPLE_PASSWORD="$APPLE_PASSWORD"
2023-07-31 17:13:28 +03:00
elif [ "$OS" == "linux" ]; then
[ -z "${APPIMAGE_KEY_ID-}" ] && error '$APPIMAGE_KEY_ID is not set'
[ -z "${APPIMAGE_KEY_PASSPHRASE-}" ] && error '$APPIMAGE_KEY_PASSPHRASE is not set'
2023-07-31 16:55:10 +03:00
export SIGN=1
export SIGN_KEY="$APPIMAGE_KEY_ID"
export APPIMAGETOOL_SIGN_PASSPHRASE="$APPIMAGE_KEY_PASSPHRASE"
elif [ "$OS" == "windows" ]; then
info "$OS: signing is not done via the release script on Windows; skipping"
DO_SIGN="false"
2023-07-31 16:55:10 +03:00
else
error "signing is not supported on $(uname -s)"
fi
fi
2023-02-17 14:46:13 +03:00
info "building:"
2023-07-12 17:06:10 +03:00
info " channel: $CHANNEL"
2023-02-17 16:21:41 +03:00
info " version: $VERSION"
2023-02-17 14:46:13 +03:00
info " os: $OS"
info " arch: $ARCH"
2023-02-20 18:19:23 +03:00
info " dist: $DIST"
info " sign: $DO_SIGN"
2023-02-17 16:21:41 +03:00
TMP_DIR="$(mktemp -d)"
trap "rm -rf '$TMP_DIR'" exit
CONFIG_PATH=$(readlink -f "$PWD/../crates/gitbutler-tauri/tauri.conf.$CHANNEL.json")
2023-07-12 17:06:10 +03:00
2023-02-20 18:51:48 +03:00
# update the version in the tauri release config
2023-07-12 17:06:10 +03:00
jq '.package.version="'"$VERSION"'"' "$CONFIG_PATH" >"$TMP_DIR/tauri.conf.json"
2023-02-17 16:21:41 +03:00
2023-07-21 14:05:46 +03:00
FEATURES=""
if [ "$CHANNEL" == "nightly" ]; then
2023-07-31 16:55:10 +03:00
FEATURES="$FEATURES devtools"
2023-07-21 14:05:46 +03:00
fi
2023-02-20 18:51:48 +03:00
# build the app with release config
2023-07-21 14:05:46 +03:00
SENTRY_RELEASE="$VERSION" tauri build \
2023-08-01 10:20:55 +03:00
--verbose \
2023-07-31 16:55:10 +03:00
--features "$FEATURES" \
--config "$TMP_DIR/tauri.conf.json"
2023-09-06 11:46:07 +03:00
BUNDLE_DIR=$(readlink -f "$PWD/../target/release/bundle")
2023-02-17 16:21:41 +03:00
RELEASE_DIR="$DIST/$OS/$ARCH"
mkdir -p "$RELEASE_DIR"
2023-07-31 17:13:28 +03:00
2023-08-01 12:04:19 +03:00
if [ "$OS" = "macos" ]; then
2023-07-31 17:15:21 +03:00
MACOS_DMG="$(find "$BUNDLE_DIR/dmg" -depth 1 -type f -name "*.dmg")"
MACOS_UPDATER="$(find "$BUNDLE_DIR/macos" -depth 1 -type f -name "*.tar.gz")"
MACOS_UPDATER_SIG="$(find "$BUNDLE_DIR/macos" -depth 1 -type f -name "*.tar.gz.sig")"
2023-08-01 10:20:40 +03:00
2023-07-31 17:15:21 +03:00
cp "$MACOS_DMG" "$RELEASE_DIR"
cp "$MACOS_UPDATER" "$RELEASE_DIR"
cp "$MACOS_UPDATER_SIG" "$RELEASE_DIR"
2023-08-01 10:20:40 +03:00
2023-07-31 17:15:21 +03:00
info "built:"
info " - $RELEASE_DIR/$(basename "$MACOS_DMG")"
info " - $RELEASE_DIR/$(basename "$MACOS_UPDATER")"
info " - $RELEASE_DIR/$(basename "$MACOS_UPDATER_SIG")"
2023-08-01 12:04:19 +03:00
elif [ "$OS" = "linux" ]; then
2023-08-01 13:29:33 +03:00
APPIMAGE="$(find $BUNDLE_DIR/appimage -name \*.AppImage)"
2023-08-01 14:22:50 +03:00
APPIMAGE_UPDATER="$(find $BUNDLE_DIR/appimage -name \*.AppImage.tar.gz)"
APPIMAGE_UPDATER_SIG="$(find $BUNDLE_DIR/appimage -name \*.AppImage.tar.gz.sig)"
2023-09-07 18:50:58 +03:00
DEB="$(find $BUNDLE_DIR/deb -name \*.deb)"
2023-08-01 14:22:50 +03:00
2023-08-01 10:20:40 +03:00
cp "$APPIMAGE" "$RELEASE_DIR"
2023-08-01 14:22:50 +03:00
cp "$APPIMAGE_UPDATER" "$RELEASE_DIR"
cp "$APPIMAGE_UPDATER_SIG" "$RELEASE_DIR"
2023-09-07 18:50:58 +03:00
cp "$DEB" "$RELEASE_DIR"
2023-08-01 10:20:40 +03:00
info "built:"
info " - $RELEASE_DIR/$(basename "$APPIMAGE")"
2023-08-01 14:22:50 +03:00
info " - $RELEASE_DIR/$(basename "$APPIMAGE_UPDATER")"
info " - $RELEASE_DIR/$(basename "$APPIMAGE_UPDATER_SIG")"
2023-09-07 18:50:58 +03:00
info " - $RELEASE_DIR/$(basename "$DEB")"
elif [ "$OS" = "windows" ]; then
WINDOWS_INSTALLER="$(find $BUNDLE_DIR/msi -name \*.msi)"
WINDOWS_UPDATER="$(find $BUNDLE_DIR/msi -name \*.msi.zip)"
WINDOWS_UPDATER_SIG="$(find $BUNDLE_DIR/msi -name \*.msi.zip.sig)"
cp "$WINDOWS_INSTALLER" "$RELEASE_DIR"
cp "$WINDOWS_UPDATER" "$RELEASE_DIR"
cp "$WINDOWS_UPDATER_SIG" "$RELEASE_DIR"
info "built:"
info " - $RELEASE_DIR/$(basename "$WINDOWS_INSTALLER")"
info " - $RELEASE_DIR/$(basename "$WINDOWS_UPDATER")"
info " - $RELEASE_DIR/$(basename "$WINDOWS_UPDATER_SIG")"
else
error "unsupported os: $OS"
2023-07-31 17:13:28 +03:00
fi
info "done! bye!"