Harden live release workflow #25

This commit is contained in:
2026-07-31 09:28:45 +02:00
parent 939dc9819d
commit e8b0645ea6
19 changed files with 223 additions and 43 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
services:
importarr:
image: ghcr.io/OWNER/importarr:0.1.0
image: ghcr.io/OWNER/importarr:0.1.1
env_file: importarr.env
ports:
- "8765:8765"
+2
View File
@@ -17,3 +17,5 @@ IMPORTARR_BIND_HOST=0.0.0.0
IMPORTARR_BIND_PORT=8765
IMPORTARR_POLL_SECONDS=60
# IMPORTARR_REPO_DIR=/path/to/importarr
# Override only when the installed helper is not at the standard systemd path.
# IMPORTARR_UPDATE_COMMAND=/bin/sh /opt/importarr/repo-upgrade.sh
+25 -4
View File
@@ -2,7 +2,7 @@
set -eu
if [ "$(id -u)" -ne 0 ]; then
echo "Run as root: sudo sh /opt/importarr/repo-upgrade.sh" >&2
echo "Run as root: sudo sh /opt/importarr/repo-upgrade.sh vMAJOR.MINOR.PATCH" >&2
exit 1
fi
@@ -13,9 +13,22 @@ if [ -f "$ENV_FILE" ]; then
fi
PREFIX=${IMPORTARR_PREFIX:-/opt/importarr}
REPO_DIR=${IMPORTARR_REPO_DIR:-$(pwd)}
REPO_DIR=${IMPORTARR_REPO_DIR:-$PREFIX/repo}
SERVICE=${IMPORTARR_SERVICE:-importarr.service}
VENV=${IMPORTARR_VENV:-$PREFIX/venv}
RELEASE_TAG=${1:-}
if [ -z "$RELEASE_TAG" ]; then
echo "Usage: $0 vMAJOR.MINOR.PATCH" >&2
exit 2
fi
LOCK_FILE=${IMPORTARR_UPGRADE_LOCK_FILE:-$PREFIX/repo-upgrade.lock}
exec 9>"$LOCK_FILE"
if ! flock -n 9; then
echo "Refusing to upgrade: another Importarr upgrade is already running." >&2
exit 1
fi
if [ ! -d "$REPO_DIR/.git" ]; then
echo "Importarr repo not found at $REPO_DIR" >&2
@@ -29,14 +42,22 @@ if [ -n "$(git status --porcelain)" ]; then
exit 1
fi
git fetch --prune origin
git pull --ff-only
git fetch --prune --tags origin
if ! git rev-parse --verify --quiet "refs/tags/$RELEASE_TAG" >/dev/null; then
echo "Release tag not found: $RELEASE_TAG" >&2
exit 1
fi
git checkout --detach "$RELEASE_TAG"
test "$(git describe --tags --exact-match HEAD)" = "$RELEASE_TAG"
"$VENV/bin/pip" install --upgrade "$REPO_DIR"
install -m 0644 "$REPO_DIR/deploy/importarr.service" /etc/systemd/system/importarr.service
install -m 0755 "$REPO_DIR/deploy/repo-upgrade.sh" "$PREFIX/repo-upgrade.sh"
systemctl daemon-reload
GIT_SHA="$(git rev-parse --short=12 HEAD 2>/dev/null || printf development)"
BUILD_DATE="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
VERSION="$RELEASE_TAG"
cat > "$PREFIX/build.env" <<EOF
IMPORTARR_VERSION=$VERSION
IMPORTARR_GIT_SHA=$GIT_SHA
IMPORTARR_BUILD_DATE=$BUILD_DATE
EOF
+10 -4
View File
@@ -16,17 +16,23 @@ if [ ! -f /etc/importarr/importarr.env ]; then
install -m 0600 "$REPO_DIR/deploy/importarr.env.example" /etc/importarr/importarr.env
echo "Created /etc/importarr/importarr.env; edit it before starting the service."
fi
if ! grep -q '^IMPORTARR_REPO_DIR=' /etc/importarr/importarr.env; then
printf '\nIMPORTARR_REPO_DIR=%s\n' "$REPO_DIR" >> /etc/importarr/importarr.env
fi
install -m 0644 "$REPO_DIR/deploy/importarr.service" /etc/systemd/system/importarr.service
install -m 0644 "$REPO_DIR/deploy/manual-media-import.service" /etc/systemd/system/manual-media-import.service
install -m 0644 "$REPO_DIR/deploy/manual-media-import.timer" /etc/systemd/system/manual-media-import.timer
install -m 0644 "$REPO_DIR/deploy/manual-media-import-failure.service" /etc/systemd/system/manual-media-import-failure.service
install -m 0755 "$REPO_DIR/deploy/repo-upgrade.sh" /opt/importarr/repo-upgrade.sh
if [ "$REPO_DIR" != /opt/importarr/repo ]; then
if [ -e /opt/importarr/repo ] && [ ! -L /opt/importarr/repo ]; then
echo "Refusing to replace existing /opt/importarr/repo; move it or set IMPORTARR_REPO_DIR explicitly." >&2
exit 1
fi
ln -sfn "$REPO_DIR" /opt/importarr/repo
fi
GIT_SHA="$(git -C "$REPO_DIR" rev-parse --short=12 HEAD 2>/dev/null || printf development)"
BUILD_DATE="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
VERSION="$(git -C "$REPO_DIR" describe --tags --exact-match HEAD 2>/dev/null || /opt/importarr/venv/bin/python -c 'from importarr import __version__; print(__version__)')"
cat > /opt/importarr/build.env <<EOF
IMPORTARR_VERSION=$VERSION
IMPORTARR_GIT_SHA=$GIT_SHA
IMPORTARR_BUILD_DATE=$BUILD_DATE
EOF
@@ -35,4 +41,4 @@ systemctl enable importarr.service
systemctl enable manual-media-import.timer
systemctl restart importarr.service
systemctl start manual-media-import.timer
echo "Importarr installed from $REPO_DIR. Future upgrades: sudo -n sh /opt/importarr/repo-upgrade.sh"
echo "Importarr installed from $REPO_DIR. Future upgrades: sudo -n sh /opt/importarr/repo-upgrade.sh vMAJOR.MINOR.PATCH"