161 lines
5.3 KiB
Bash
Executable File
161 lines
5.3 KiB
Bash
Executable File
#!/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}"
|
|
DIST_ROOT="dist"
|
|
|
|
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")
|
|
|
|
prune_dist_cache() {
|
|
local arch="$1"
|
|
local dist_dir="${DIST_ROOT}/${arch}"
|
|
local keep_prefix="gitea-${VERSION}-linux-${arch}."
|
|
|
|
mkdir -p "${dist_dir}"
|
|
|
|
find "${dist_dir}" -maxdepth 1 -type f -name 'gitea-*' ! -name "${keep_prefix}*" -print -delete
|
|
}
|
|
|
|
# Download Gitea Binaries and Signatures
|
|
for ARCH in "${ARCHS[@]}"; do
|
|
echo "Downloading Gitea ${VERSION} for ${ARCH} …"
|
|
echo "Pruning old cache entries in ${DIST_ROOT}/${ARCH}"
|
|
prune_dist_cache "${ARCH}"
|
|
for FILE in "${FILES[@]}"; do
|
|
FILE_NAME="gitea-${VERSION}-linux-${ARCH}.${FILE}"
|
|
FILE_URL="${DOWNLOAD_BASE_URL}/${FILE_NAME}"
|
|
TARGET_FILE="${DIST_ROOT}/${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_ROOT}/${ARCH}/gitea-${VERSION}-linux-${ARCH}.xz.asc" "${DIST_ROOT}/${ARCH}/gitea-${VERSION}-linux-${ARCH}.xz"
|
|
gpg --verify "${DIST_ROOT}/${ARCH}/gitea-${VERSION}-linux-${ARCH}.xz.sha256.asc" "${DIST_ROOT}/${ARCH}/gitea-${VERSION}-linux-${ARCH}.xz.sha256"
|
|
done
|
|
|
|
|
|
# Verify Checksums
|
|
for ARCH in "${ARCHS[@]}"; do
|
|
echo "Verifying SHA256 checksum for ${ARCH} …"
|
|
(cd "${DIST_ROOT}/${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_ROOT}/${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
|
|
)
|