#!/bin/bash set -e # Exit on error # Resolve the target version from an explicit override first, then from the # latest published GitHub release. The dl.gitea.com version JSON can lag # behind actual releases, so it is only used as a fallback. resolve_version() { local version="" if [[ -n "${1:-}" ]]; then VERSION_SOURCE="command line argument" echo "$1" return 0 fi if [[ -n "${GITEA_VERSION:-}" ]]; then VERSION_SOURCE="GITEA_VERSION environment variable" echo "${GITEA_VERSION}" return 0 fi if version=$(curl -fsSL https://api.github.com/repos/go-gitea/gitea/releases/latest 2>/dev/null | jq -r '.tag_name // empty' 2>/dev/null); then version="${version#v}" if [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then VERSION_SOURCE="GitHub releases API" echo "$version" return 0 fi fi if version=$(curl -fsSL https://dl.gitea.com/gitea/version.json 2>/dev/null | jq -r '.latest.version // empty' 2>/dev/null); then if [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then VERSION_SOURCE="dl.gitea.com version.json fallback" echo "$version" return 0 fi fi echo "❌ Unable to determine the latest Gitea version. Set GITEA_VERSION or pass a version as the first argument." >&2 exit 1 } VERSION=$(resolve_version "${1:-}") DOWNLOAD_BASE_URL="${GITEA_DOWNLOAD_BASE_URL:-https://github.com/go-gitea/gitea/releases/download/v${VERSION}}" BUILD_ROOT="build/${VERSION}" echo "Current version: ${VERSION}" echo "Version source: ${VERSION_SOURCE}" # Check if this version is already built if [[ -f "../gitea-deb/gitea_${VERSION}_amd64.deb" ]] && [[ -f "../gitea-deb/gitea_${VERSION}_arm64.deb" ]]; then echo "✅ Version ${VERSION} already built and present in release repo. Aborting." exit 0 fi ARCHS=("amd64" "arm64") FILES=("xz" "xz.asc" "xz.sha256" "xz.sha256.asc") # Download Gitea Binaries and Signatures for ARCH in "${ARCHS[@]}"; do echo "Downloading Gitea ${VERSION} for ${ARCH} …" if [[ ! -d "dist/${ARCH}" ]]; then echo "Creating directory dist/${ARCH}" mkdir "dist/${ARCH}" fi for FILE in "${FILES[@]}"; do FILE_NAME="gitea-${VERSION}-linux-${ARCH}.${FILE}" FILE_URL="${DOWNLOAD_BASE_URL}/${FILE_NAME}" TARGET_FILE="dist/${ARCH}/${FILE_NAME}" if [[ -f "$TARGET_FILE" ]]; then echo "✅ File already exists: $TARGET_FILE (Skipping)" else echo "⬇️ Downloading: $FILE_URL" wget -q "$FILE_URL" -O "$TARGET_FILE" fi done done # Verify GPG Signatures for ARCH in "${ARCHS[@]}"; do echo "Verifying GPG signature for ${ARCH} …" gpg --verify "dist/${ARCH}/gitea-${VERSION}-linux-${ARCH}.xz.asc" "dist/${ARCH}/gitea-${VERSION}-linux-${ARCH}.xz" gpg --verify "dist/${ARCH}/gitea-${VERSION}-linux-${ARCH}.xz.sha256.asc" "dist/${ARCH}/gitea-${VERSION}-linux-${ARCH}.xz.sha256" done # Verify Checksums for ARCH in "${ARCHS[@]}"; do echo "Verifying SHA256 checksum for ${ARCH} …" (cd "dist/${ARCH}" && sha256sum -c gitea-${VERSION}-linux-${ARCH}.xz.sha256) done # Stage package contents in a disposable build directory so the repository's # tracked packaging files do not get modified during a build. for ARCH in "${ARCHS[@]}"; do PACKAGE_DIR="${BUILD_ROOT}/${ARCH}" if [[ ! -d "${PACKAGE_DIR}" ]]; then echo "Creating staging directory ${PACKAGE_DIR}" mkdir -p "${PACKAGE_DIR}" fi cp -a "${ARCH}/." "${PACKAGE_DIR}/" if [[ ! -d "${PACKAGE_DIR}/opt/gitea/bin" ]]; then echo "Creating directory ${PACKAGE_DIR}/opt/gitea/bin" mkdir -p "${PACKAGE_DIR}/opt/gitea/bin" fi xz -dc "dist/${ARCH}/gitea-${VERSION}-linux-${ARCH}.xz" > "${PACKAGE_DIR}/opt/gitea/bin/gitea" || { echo "❌ Extraction failed for ${ARCH}"; exit 1; } # Verify the extracted file isn't empty if [[ ! -s "${PACKAGE_DIR}/opt/gitea/bin/gitea" ]]; then echo "❌ Extracted file is empty for ${ARCH}. Something went wrong!" exit 1 fi chmod +x "${PACKAGE_DIR}/opt/gitea/bin/gitea" done # Build Debian Packages for ARCH in "${ARCHS[@]}"; do echo "Building package for ${ARCH} …" PACKAGE_DIR="${BUILD_ROOT}/${ARCH}" sed -i "s/^Version: .*/Version: ${VERSION}/" "${PACKAGE_DIR}/DEBIAN/control" dpkg-deb --build "${PACKAGE_DIR}" "gitea_${VERSION}_${ARCH}.deb" done echo "All packages built successfully:" ls -lh gitea_${VERSION}_*.deb echo "Moving .deb packages to release repo …" mv gitea_${VERSION}_*.deb ../gitea-deb/ ( cd ../gitea-deb echo "Updating APT package index …" dpkg-scanpackages --multiversion . override > Packages dpkg-scanpackages --multiversion . override | gzip -9c > Packages.gz echo "Generating Release file …" apt-ftparchive -c=apt-release.conf release . > Release git add --all . if ! git diff --cached --quiet; then echo "Committing and pushing release …" git commit -m "Release Gitea ${VERSION}" git push else echo "No changes to commit." fi )