forgejo-deb/.ci-make.sh

325 lines
10 KiB
Bash
Raw Permalink Normal View History

2023-02-06 03:29:43 -07:00
#!/bin/sh
CI_VERIFY_API="https://codeberg.org" # Query the Forgejo API at this URL to check upstream CI status
2025-01-13 15:24:31 +11:00
CI_VERIFY_REPO="forgejo/forgejo" # Check this repo at the Forgejo API for upstream CI status
CI_VERIFY_RETRY_TIME=120 # How long to wait in seconds before retrying if the pipeline is pending
CI_VERIFY_RETRY_COUNT=30 # How many times to retry before giving up if the pipeline is pending
2023-02-06 03:29:43 -07:00
case "$1" in
2025-01-13 15:24:31 +11:00
"submodule-build")
cd "$2"
LDFLAGS="$LDFLAGS -X \"code.gitea.io/gitea/modules/setting.StaticRootPath=/usr/share/forgejo\""
LDFLAGS="$LDFLAGS -X \"code.gitea.io/gitea/modules/setting.AppWorkPath=/var/lib/forgejo\""
LDFLAGS="$LDFLAGS -X \"code.gitea.io/gitea/modules/setting.CustomConf=/etc/forgejo/app.ini\""
export LDFLAGS
make build
EXIT_STATUS=$?
mv gitea ../"$3"
exit $EXIT_STATUS
;;
"submodule-make")
cd "$2"
shift
shift
make "$@"
exit $?
;;
"actions-prep")
case "$2" in
"build-forgejo-deb")
APREP_APT_EXTRAS="debhelper devscripts sudo retry"
2023-02-06 03:29:43 -07:00
;;
2025-01-13 15:24:31 +11:00
"installtest")
APREP_APT_EXTRAS="sudo"
if [ ! "$TEST_DEBIAN_BUSTER" ]; then
APREP_APT_EXTRAS="$APREP_APT_EXTRAS retry"
2024-04-27 18:55:53 -06:00
fi
;;
2025-01-13 15:24:31 +11:00
"")
APREP_APT_EXTRAS=
2023-02-06 03:29:43 -07:00
;;
2025-01-13 15:24:31 +11:00
*)
echo "Invalid argument: $2"
exit 98
;;
esac
EXIT_TOTAL=0
apt update
EXIT_TOTAL=$(($EXIT_TOTAL + $?))
apt upgrade -y
EXIT_TOTAL=$(($EXIT_TOTAL + $?))
if [ "$APREP_APT_EXTRAS" ]; then
apt install $APREP_APT_EXTRAS -y
EXIT_TOTAL=$(($EXIT_TOTAL + $?))
fi
ACTIONS_FORGEJOSHA="$(git rev-parse --short=10 HEAD)"
if [ "$GITHUB_REF_TYPE" = "tag" ]; then
echo "::set-output name=artifactlabel::$GITHUB_REF_NAME-$ACTIONS_FORGEJOSHA"
else
echo "::set-output name=artifactlabel::$ACTIONS_FORGEJOSHA"
fi
echo "::set-output name=forgejosha::$ACTIONS_FORGEJOSHA"
exit $EXIT_TOTAL
;;
"ci-verify")
RETRY_LOOPS=0
while [ $RETRY_LOOPS -le $CI_VERIFY_RETRY_COUNT ]; do
RETRY_LOOPS=$(($RETRY_LOOPS + 1))
CURRENT_COMMIT=$(git submodule status "$2/" | cut -d ' ' -f2)
CI_VERIFY=$(curl $CI_VERIFY_API/api/v1/repos/$CI_VERIFY_REPO/commits/$CURRENT_COMMIT/status | jq --jsonargs .state)
case "$CI_VERIFY" in
'"success"')
echo "CI pipeline passed!"
exit 0
;;
'"pending"')
echo "CI pipeline still pending, checking again in $CI_VERIFY_RETRY_TIME seconds..."
sleep $CI_VERIFY_RETRY_TIME
;;
*)
echo "ERROR: Bad pipeline status $CI_VERIFY"
exit 1
;;
esac
done
exit 255
;;
"download-binary")
if [ "$GITHUB_BASE_REF" ]; then
echo "forgejo actions pull request mode"
echo "making sure you didn't break binary builds..."
PR_MODE=true
fi
if [ "$GITHUB_REF_TYPE" = "tag" ]; then
echo "INFO: Forgejo Actions mode!"
CI_COMMIT_TAG="$GITHUB_REF_NAME"
elif [ "$GITHUB_REF_TYPE" = "branch" ] || [ $PR_MODE ]; then
echo "WARNING: Not building a tag! Simulating it..."
echo "(forgejo actions mode)"
echo "(this will test the binary packaging without cutting a tag in the package)"
echo "Resolving tag..."
cd forgejo
CI_COMMIT_TAG_RESOLVE=$(git tag --points-at HEAD)
if [ ! $CI_COMMIT_TAG_RESOLVE ]; then
echo "Failed to resolve exact tag! Getting as close as we can..."
git describe --tags HEAD
FORGEJO_CLOSEST_TAG=$(git describe --tags HEAD --abbrev=0)
echo "Looking for experimental tag..."
EXPERIMENTAL_REPO="forgejo-experimental/forgejo"
git remote add experimental $CI_VERIFY_API/$EXPERIMENTAL_REPO
git fetch experimental --tags
2024-04-27 18:55:53 -06:00
CI_COMMIT_TAG_RESOLVE=$(git tag --points-at HEAD)
2025-01-13 15:24:31 +11:00
if [ $CI_COMMIT_TAG_RESOLVE ]; then
CI_VERIFY_REPO=$EXPERIMENTAL_REPO
FORGEJO_CLOSEST_TAG=$CI_COMMIT_TAG_RESOLVE
echo "Found it! Using experimental tag and downloading binary from $CI_VERIFY_REPO"
fi
CI_COMMIT_TAG_RESOLVE=$FORGEJO_CLOSEST_TAG
echo "Closest existing tag: $CI_COMMIT_TAG_RESOLVE"
if [ "$CI_COMMIT_TAG_RESOLVE" != "${CI_COMMIT_TAG_RESOLVE%"-dev"}" ] || [ ! "$CI_COMMIT_TAG_RESOLVE" ]; then
if [ $PR_MODE ]; then
echo "I can't figure out which release version of Forgejo to build your PR against."
echo "Whatever you're trying to do is not yet implemented."
exit 97
2024-04-27 20:52:24 -06:00
fi
2025-01-13 15:24:31 +11:00
echo "err! unable to resolve tag or building dev version- skipping binary dl"
CI_COMMIT_TAG_RESOLVE=
2024-04-27 18:55:53 -06:00
fi
fi
2025-01-13 15:24:31 +11:00
cd ..
echo "Proceeding with resolved tag: $CI_COMMIT_TAG_RESOLVE"
CI_COMMIT_TAG="$CI_COMMIT_TAG_RESOLVE"
fi
if [ $CI_COMMIT_TAG ]; then
CI_RELEASE_ASSETS=$(curl $CI_VERIFY_API/api/v1/repos/$CI_VERIFY_REPO/releases/tags/$CI_COMMIT_TAG | jq -c '.assets[]' | grep linux-arm64)
CI_RELEASE_BINARY_URL=$(echo "$CI_RELEASE_ASSETS" | grep linux-arm64\" | jq -r --jsonargs .browser_download_url)
CI_RELEASE_SHA256=$(curl $(echo "$CI_RELEASE_ASSETS" | grep linux-arm64.sha256\" | jq -r --jsonargs .browser_download_url) | cut -d ' ' -f1)
wget -nv --content-disposition $CI_RELEASE_BINARY_URL
DOWNLOAD_SHA256=$(sha256sum forgejo-*-linux-arm64 | cut -d ' ' -f1)
if [ $CI_RELEASE_SHA256 != $DOWNLOAD_SHA256 ]; then
echo "ERROR: Downloaded file didn't match expected SHA256 sum"
exit 1
2023-02-06 03:29:43 -07:00
fi
2025-01-13 15:24:31 +11:00
mv forgejo-*-linux-arm64 $2
chmod +x $2
2023-02-06 03:29:43 -07:00
exit 0
2025-01-13 15:24:31 +11:00
else
echo "not a tag, skipping download"
exit 0
fi
;;
"package-prep")
mkdir deb/forgejo-bin
mkdir deb/forgejo-sqlite-bin
mv forgejo-bin deb/forgejo-bin/forgejo
mv forgejo-sqlite-bin deb/forgejo-sqlite-bin/forgejo
cp -r forgejo/public deb/public
cp -r forgejo/templates deb/templates
cp -r forgejo/options deb/options
if [ -x forgejo-bin-dl ]; then
mkdir deb/forgejo-bin-dl
mv forgejo-bin-dl deb/forgejo-bin-dl/forgejo
mv deb/.forgejo-bin.install deb/debian/forgejo-bin.install
ln -s forgejo-common.preinst deb/debian/forgejo-bin.preinst
ln -s forgejo.postinst deb/debian/forgejo-bin.postinst
ln -s forgejo.prerm deb/debian/forgejo-bin.prerm
echo >>deb/debian/control
cat deb/.forgejo-bin.control >>deb/debian/control
fi
;;
"package-build-deps")
cd deb
mk-build-deps --install --tool "apt-get -o Debug::pkgProblemResolver=yes --no-install-recommends -y" --remove
exit $?
;;
"package-build")
cd deb
if [ "$2" = "actions" ]; then
PACKAGE_BUILD_EXTRA_ARGS="--no-sign"
fi
dpkg-buildpackage -b $PACKAGE_BUILD_EXTRA_ARGS
exit $?
;;
"package-clean")
rm *dbgsym*.deb || true
exit 0
;;
"pkg-gen-sha256")
for deb in *.deb; do
sha256sum $deb >$deb.sha256
done
;;
"preview-sha256")
for p in *.sha256; do
echo $p
cat $p
done
;;
"test-userinst-prep")
cp ./etc/default/forgejo /etc/default/forgejo
mkdir -p /etc/systemd/system/forgejo.service.d
cp ./etc/systemd/system/forgejo.service.d/override.conf /etc/systemd/system/forgejo.service.d/override.conf
;;
"install-run-test")
export DEBIAN_FRONTEND=noninteractive
apt update
if [ "$2" = "${2#"./forgejo-bin_"}" ]; then
APT_FORGEJO_COMMON_RESOLVE="$(ls -1 ./forgejo-common_*_all.deb)"
if [ -f "$APT_FORGEJO_COMMON_RESOLVE" ]; then
APT_FORGEJO_COMMON="./$APT_FORGEJO_COMMON_RESOLVE"
else
2025-01-13 15:24:31 +11:00
echo "ERR! Unable to find the necessary forgejo-common package!"
exit 96
fi
2025-01-13 15:24:31 +11:00
fi
apt install -y $APT_FORGEJO_COMMON ./"$2"
if [ -f "/.dockerenv" ]; then
if [ -f "/etc/default/forgejo" ] || [ "$2" != "${2#"./forgejo-bin_"}" ]; then
[ -f "/etc/default/forgejo" ] && . /etc/default/forgejo
[ -z "$FORGEJO_HOME" ] && FORGEJO_HOME=/var/lib/forgejo
[ -z "$FORGEJO_USER" ] && FORGEJO_USER=forgejo
sudo -u $FORGEJO_USER USER=$FORGEJO_USER \
HOME=$FORGEJO_HOME FORGEJO_WORK_DIR=$FORGEJO_HOME \
forgejo web -q --config /etc/forgejo/app.ini &
2023-11-25 17:12:14 -07:00
else
2025-01-13 15:24:31 +11:00
echo "No env setup! Run testing defaults using hardcoded vars..."
sudo -u forgejo USER=forgejo forgejo web -q &
2023-11-25 17:12:14 -07:00
fi
2025-01-13 15:24:31 +11:00
sleep 1
fi
if [ "$TEST_DEBIAN_BUSTER" ]; then
curl http://localhost:3000/ | grep -A 4 "Powered by Forgejo"
if [ "$?" != "0" ]; then
sleep 3
curl http://localhost:3000/ | grep -A 4 "Powered by Forgejo"
2024-04-09 05:49:38 -06:00
fi
2025-01-13 15:24:31 +11:00
else
retry -d 2 -t 2 curl http://localhost:3000/ | grep -A 4 "Powered by Forgejo"
fi
exit $?
;;
"install-repo-test")
export DEBIAN_FRONTEND=noninteractive
apt update -qq
apt install -y apt-utils apt-listchanges
apt install -y ./"$2"
apt update -qq
apt upgrade -y
apt update -qq
apt install -y "$3"
if [ -f "/.dockerenv" ]; then
sudo -u forgejo USER=forgejo \
HOME=/var/lib/forgejo FORGEJO_WORK_DIR=/var/lib/forgejo \
forgejo web -q --config /etc/fogejo/app.ini &
sleep 1
fi
retry -d 2 -t 2 curl http://localhost:3000/ | grep -A 4 "Powered by Forgejo"
exit $?
;;
"verify-data-dir-chmod")
DATA_DIR_CHMOD="$(stat -c %a /var/lib/forgejo)"
if [ "$DATA_DIR_CHMOD" = "750" ]; then
exit 0
else
exit 100
fi
;;
"force-clean-forgejo")
export DEBIAN_FRONTEND=noninteractive
apt install -y psmisc
killall forgejo
exit $?
;;
"forgejo-test-deps")
echo "deb http://deb.debian.org/debian/ bookworm-backports main contrib" >/etc/apt/sources.list.d/backports.list
export DEBIAN_FRONTEND=noninteractive
apt update -qq
apt install -qq --no-install-recommends -y git-lfs
apt install -qq -y -t bookworm-backports golang-$DEP_GOLANG_VER
ln -sf /usr/lib/go-$DEP_GOLANG_VER/bin/go /usr/local/bin/go
adduser --quiet --comment forgejo --disabled-password forgejo
chown -R forgejo:forgejo .
if [ "$DEP_GOLANG_NODEB_REV" ]; then
su forgejo -c "./.ci-make.sh forgejo-test-deps_upgrade-go $DEP_GOLANG_VER $DEP_GOLANG_NODEB_REV"
fi
;;
"forgejo-test-deps_upgrade-go")
go install golang.org/dl/go$2.$3@latest
ln -s ~/go/bin/go$2.$3 ~/go/bin/go
export PATH="$HOME/go/bin:$PATH"
go download
go version
;;
"complex-test")
shift
case "$1" in
"split-deb-upgrade")
2024-11-18 08:24:37 -07:00
shift
2025-01-13 15:24:31 +11:00
rm forgejo-deb-repo_0-0_all.deb
wget --content-disposition https://code.forgejo.org/forgejo-contrib/-/packages/debian/forgejo-deb-repo/0-0/files/2890
2024-11-18 08:24:37 -07:00
export DEBIAN_FRONTEND=noninteractive
2025-01-13 15:24:31 +11:00
apt install -y ./forgejo-deb-repo_0-0_all.deb
apt update -qq
apt upgrade -y
apt install forgejo$1
cp test-res/app.ini.modified /etc/forgejo/app.ini
apt install ./forgejo$1_*_arm64.deb ./forgejo-common_*_all.deb
cat /etc/forgejo/app.ini
2024-11-18 08:24:37 -07:00
;;
2025-01-13 15:24:31 +11:00
esac
;;
"full-instance-clean")
export DEBIAN_FRONTEND=noninteractive
apt purge -y forgejo forgejo-sqlite forgejo-common forgejo-bin
rm -rf /var/lib/forgejo
rm -rf /etc/forgejo /etc/default/forgejo /etc/systemd/system/forgejo.service.d
if [ "$2" = "userinst" ]; then
sudo deluser git
else
sudo deluser forgejo
fi
apt purge -y forgejo-deb-repo forgejo-deb-repokey
exit 0
;;
2023-02-06 03:29:43 -07:00
esac