240 lines
6.9 KiB
Bash
240 lines
6.9 KiB
Bash
#!/bin/bash
|
|
|
|
DESTINATION=~/gitea-binaries
|
|
|
|
rm -rf $DESTINATION
|
|
mkdir -p $DESTINATION
|
|
|
|
while [ ${#} -gt 0 ]; do
|
|
case "$1" in
|
|
--git-tag | -v)
|
|
shift
|
|
GITEA_GIT_TAG=$1
|
|
;; # Gitea Git Tag
|
|
--golang-version | -g)
|
|
shift
|
|
GO_VERSION=$1
|
|
;; # GOLANG Version
|
|
--nodejs-version | -n)
|
|
shift
|
|
NODEJS_VERSION=$1
|
|
;; # NodeJS Version
|
|
--static | -s)
|
|
BUILD_STATIC=true
|
|
;; # Also Build Static Assets file
|
|
--type=* )
|
|
BUILD_TYPE="${1#*=}"
|
|
BUILD_TYPE="${BUILD_TYPE,,}"
|
|
case $BUILD_TYPE in
|
|
"gitea") BUILD_TYPE="gitea" ;;
|
|
"forgejo") BUILD_TYPE="forgejo" ;;
|
|
"")
|
|
echo "ERROR : --type= is empty!"
|
|
exit 1
|
|
;;
|
|
*)
|
|
echo "ERROR : Vaild values for --type are -> gitea, forgejo"
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
--patch=* )
|
|
PATCH_FILES="${1#*=}"
|
|
case $PATCH_FILES in
|
|
"")
|
|
echo "ERROR: --patch= is empty!"
|
|
exit 1
|
|
;;
|
|
*)
|
|
;;
|
|
esac # Add Patches to your Gitea build. Format -> patch1.patch or patch1.patch,https://patch (Absolute path)
|
|
;;
|
|
--build-arch=* )
|
|
BUILD_ARCH="${1#*=}"
|
|
case $BUILD_ARCH in
|
|
"x86_64") BUILD_ARCH="x86_64" ;;
|
|
"aarch64") BUILD_ARCH="aarch64" ;;
|
|
"")
|
|
echo "ERROR : --build-arch= is empty!"
|
|
exit 1
|
|
;;
|
|
*)
|
|
echo "ERROR : Vaild values for --build-arch are -> x86_64, aarch64"
|
|
exit 1
|
|
;;
|
|
esac # Architect for your binary to be build. This is for Cross-compiling etc.
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
shift # Shift to next response for parsing
|
|
done
|
|
|
|
# If empty
|
|
NODEJS_VERSION=${NODEJS_VERSION:-"v20.17.0"}
|
|
GO_VERSION=${GO_VERSION:-"1.23.2"}
|
|
BUILD_TYPE=${BUILD_TYPE:-"gitea"}
|
|
|
|
# OS
|
|
GOOS=linux
|
|
NODEJS_DISTRO=linux
|
|
|
|
# ARCHITECT
|
|
|
|
# This Base Architect is to detect "build" build machine Architect. NOT BUILD ARCHITECT
|
|
ARCH=${ARCH:-$(uname -m)}
|
|
case $ARCH in
|
|
"x86_64")
|
|
NODEJS_ARCH=x64
|
|
BASE_GOARCH=amd64
|
|
;;
|
|
"aarch64")
|
|
NODEJS_ARCH=arm64
|
|
BASE_GOARCH=arm64
|
|
;;
|
|
*)
|
|
printf "\nPANIC: Arch %s is not supported! exit...\n" $ARCH
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# This define the architect for Build to be. AKA cross-compile stuff.
|
|
BUILD_ARCH=${BUILD_ARCH:-$(uname -m)}
|
|
case $BUILD_ARCH in
|
|
"x86_64")
|
|
GOARCH=amd64
|
|
;;
|
|
"aarch64")
|
|
GOARCH=arm64
|
|
;;
|
|
*)
|
|
printf "PANIC: Build Arch %s is not supported! exit...\n" $BUILD_ARCH
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
printf "INFO: Build Architect: %s\nINFO: Machine Architect: %s\n" $BUILD_ARCH $ARCH
|
|
|
|
# GITEA_GIT_TAG is being process below
|
|
|
|
# Install Dependencies
|
|
|
|
DISTRO=$(grep '^ID=' /etc/os-release | cut -d'=' -f2)
|
|
case $DISTRO in
|
|
"debian" | "ubuntu" )
|
|
sudo apt update
|
|
sudo apt install -y \
|
|
xz-utils \
|
|
wget \
|
|
git \
|
|
tar \
|
|
g++ \
|
|
make
|
|
;;
|
|
"alpine" )
|
|
apk update
|
|
apk add \
|
|
xz \
|
|
wget \
|
|
git \
|
|
tar \
|
|
g++ \
|
|
make
|
|
;;
|
|
* )
|
|
echo "ERROR: the distro detected is not supported. The script will run as is."
|
|
;;
|
|
esac
|
|
|
|
# NodeJS
|
|
case $DISTRO in
|
|
"alpine")
|
|
apk add nodejs npm # NodeJS in alpine required complex build to be done. For peace of mind i'll use apk until i see better options.
|
|
;;
|
|
* )
|
|
wget https://nodejs.org/dist/$NODEJS_VERSION/node-$NODEJS_VERSION-$NODEJS_DISTRO-$NODEJS_ARCH.tar.xz -O $DESTINATION/node-$NODEJS_VERSION-$DISTRO.tar.xz
|
|
tar -xJvf $DESTINATION/node-$NODEJS_VERSION-$DISTRO.tar.xz -C $DESTINATION
|
|
export PATH=$PATH:$DESTINATION/node-$NODEJS_VERSION-$DISTRO/bin
|
|
;;
|
|
esac
|
|
|
|
# Golang
|
|
wget https://go.dev/dl/go$GO_VERSION.$GOOS-$BASE_GOARCH.tar.gz -O $DESTINATION/go$GO_VERSION.$GOOS-$BASE_GOARCH.tar.gz
|
|
tar -C $DESTINATION -xzf $DESTINATION/go$GO_VERSION.$GOOS-$BASE_GOARCH.tar.gz
|
|
export PATH=$PATH:$DESTINATION/go/bin
|
|
|
|
# Gitea
|
|
|
|
# GIT_TAG=
|
|
# specify the tag which gitea will build on
|
|
|
|
case $BUILD_TYPE in
|
|
"gitea")
|
|
echo "INFO: Building on gitea"
|
|
git clone https://github.com/go-gitea/gitea $DESTINATION/gitea-repo
|
|
;;
|
|
"forgejo")
|
|
echo "INFO: Building on forgejo"
|
|
git clone https://codeberg.org/forgejo/forgejo $DESTINATION/gitea-repo #LOL
|
|
;;
|
|
esac
|
|
|
|
cd $DESTINATION/gitea-repo
|
|
|
|
if [[ -n $GITEA_GIT_TAG ]]
|
|
then
|
|
if git show-ref $GITEA_GIT_TAG --quiet; then
|
|
git checkout $GITEA_GIT_TAG
|
|
else
|
|
echo -e "\nGITEA_GIT_TAG variable doesn't match the repo tag/version. exit to prevent further issue." && exit 1
|
|
fi
|
|
else
|
|
echo -e "GITEA_GIT_TAG variable not found. will build on "main" branch."
|
|
fi
|
|
|
|
if [[ -n $PATCH_FILES ]]
|
|
then
|
|
for patch in $(echo "$PATCH_FILES" | tr ',' '\n'); do
|
|
case $patch in
|
|
http://*|https://*)
|
|
# The random part:
|
|
# https://stackoverflow.com/questions/2793812/generate-a-random-filename-in-unix-shell
|
|
NEW_PATCH_PATH=$DESTINATION/$(head /dev/urandom | tr -cd 'a-f0-9' | head -c 32)".patch"
|
|
|
|
if wget $patch -O $NEW_PATCH_PATH; then
|
|
printf "Info: '%s' has been downloaded. Filename: %s\n" $patch $NEW_PATCH_PATH
|
|
else
|
|
printf "Info: '%s' Download failed! The task is aborted.\n" $patch
|
|
exit 1
|
|
fi
|
|
|
|
patch=$NEW_PATCH_PATH ;;
|
|
*) ;;
|
|
esac
|
|
|
|
if git apply --check $patch; then
|
|
git apply $patch
|
|
printf "Info: PATCH '%s' applied successful!\n" $patch
|
|
else
|
|
printf "Error: PATCH '%s' cannot be applied! exiting...\n" $patch
|
|
exit 1
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# Sometimes VPS Provider's CPU limitation is dick
|
|
export LDFLAGS="-X \"code.gitea.io/gitea/modules/setting.AppWorkPath=/var/lib/gitea/\" -X \"code.gitea.io/gitea/modules/setting.CustomConf=/etc/gitea/app.ini\""
|
|
export TAGS="bindata sqlite sqlite_unlock_notify"
|
|
export GOOS=$GOOS
|
|
export GOARCH=$GOARCH
|
|
|
|
make build
|
|
mv gitea $DESTINATION/gitea
|
|
|
|
if [[ "$BUILD_STATIC" == true ]]
|
|
then
|
|
mkdir -p $DESTINATION/gitea-static
|
|
|
|
make frontend
|
|
mv $DESTINATION/gitea-repo/public/* $DESTINATION/gitea-static
|
|
fi |