name: Release Inventarsystem on: push: tags: - "v*" workflow_dispatch: inputs: bump: description: "Version bump type (major stays fixed from latest release)" required: false default: "patch" type: choice options: - patch - minor - major permissions: contents: write packages: write env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" jobs: release-docker: # Hinweis: Falls dein lokaler Gitea-Runner ein anderes Label hat (z.B. 'linux' oder 'self-hosted'), passe dies hier an. runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Set metadata id: meta env: # Gitea stellt das GITHUB_TOKEN für Kompatibilität mit GitHub Actions automatisch zur Verfügung GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} REPO: ${{ gitea.repository }} EVENT_NAME: ${{ gitea.event_name }} REF_NAME: ${{ gitea.ref_name }} BUMP_TYPE: ${{ gitea.event.inputs.bump || 'patch' }} DOCKER_API_VERSION: '1.44' run: | if [ "$EVENT_NAME" = "push" ] && [ -n "$REF_NAME" ]; then TAG="$REF_NAME" else # Gitea API Endpunkt nutzen, um das aktuellste Release abzufragen latest_tag="v0.8.31" if meta_json=$(curl -fsSL -H "Authorization: Bearer $GH_TOKEN" -H "Accept: application/json" "https://git.invario-software.eu/api/v1/repos/$REPO/releases/latest" 2>/dev/null); then tag_name=$(printf "%s" "$meta_json" | sed -n 's/.*"tag_name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -n1) if [ -n "$tag_name" ]; then latest_tag="$tag_name" fi fi if [[ "$latest_tag" =~ ^v([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then major=${BASH_REMATCH[1]} minor=${BASH_REMATCH[2]} patch=${BASH_REMATCH[3]} else major=0; minor=8; patch=31 fi # Bump strategy: major / minor / patch if [ "${BUMP_TYPE:-}" = "major" ]; then major=$((major + 1)); minor=0; patch=0 elif [ "${BUMP_TYPE:-}" = "minor" ]; then minor=$((minor + 1)); patch=0 else patch=$((patch + 1)) fi # Zusammenbau des Tags für den manuellen Run TAG="v${major}.${minor}.${patch}" fi # Validierung des erzeugten oder übergebenen Tags if ! echo "$TAG" | grep -Eq '^v[0-9]+\.[0-9]+\.[0-9]+(-dev(\.[0-9]+)?)?$'; then echo "Error: tag '$TAG' is not valid semver (vX.Y.Z)" exit 1 fi git fetch --tags --force LATEST_TAG="$(git tag -l 'v*' | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | sort -V | tail -n1)" if [ -z "$LATEST_TAG" ]; then LATEST_TAG="v0.8.31" fi TAG_MAJOR="${TAG#v}" TAG_MAJOR="${TAG_MAJOR%%.*}" LATEST_MAJOR="$(echo "$LATEST_TAG" | grep -Eo '^v[0-9]+' | tr -d 'v')" if [ -z "$LATEST_MAJOR" ]; then LATEST_MAJOR="0" fi # If not explicitly bumping major, disallow changing major version if [ "${BUMP_TYPE:-}" != "major" ] && [ "$TAG_MAJOR" != "$LATEST_MAJOR" ]; then echo "Error: major version must stay v$LATEST_MAJOR.x.x (got $TAG)" exit 1 fi # Ensure tag uniqueness: if tag exists append numeric suffix if git rev-parse -q --verify "refs/tags/$TAG" >/dev/null; then i=1 base="$TAG" while git rev-parse -q --verify "refs/tags/${base}.${i}" >/dev/null; do i="$((i + 1))" done TAG="${base}.${i}" fi # Docker Images verlangen Kleinbuchstaben. Repository-Namen daher umwandeln. LOWER_REPO=$(echo "$REPO" | tr '[:upper:]' '[:lower:]') IMAGE="git.invario-software.eu/${LOWER_REPO}:${TAG}" echo "tag=$TAG" >> "$GITHUB_OUTPUT" echo "image=$IMAGE" >> "$GITHUB_OUTPUT" echo "lower_repo=$LOWER_REPO" >> "$GITHUB_OUTPUT" - name: Ensure Docker CLI is available run: | if command -v docker >/dev/null 2>&1; then docker --version exit 0 fi if command -v apt-get >/dev/null 2>&1; then apt-get update DEBIAN_FRONTEND=noninteractive apt-get install -y docker.io elif command -v apk >/dev/null 2>&1; then apk add --no-cache docker-cli else echo "Error: no supported package manager found to install docker" exit 1 fi - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Gitea Container Registry uses: docker/login-action@v3 with: registry: git.invario-software.eu username: ${{ gitea.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push release image uses: docker/build-push-action@v6 with: context: . file: ./Dockerfile push: true # 'load: true' wurde entfernt, um API-Version-Mismatches mit dem Host-Daemon zu verhindern tags: | ${{ steps.meta.outputs.image }} git.invario-software.eu/${{ steps.meta.outputs.lower_repo }}:latest - name: Build local image tar for offline deploy run: | set -euo pipefail IMG="${{ steps.meta.outputs.image }}" TAG="${{ steps.meta.outputs.tag }}" echo "Pulling freshly pushed image from registry: $IMG" docker pull "$IMG" echo "Saving image to offline tar archive..." docker save "$IMG" | gzip > "inventarsystem-image-${TAG}.tar.gz" - name: Create release-only docker bundle run: | mkdir -p release-bundle cat > release-bundle/docker-compose.yml <