#!/bin/sh CI_VERIFY_API="https://codeberg.org" # Query the Forgejo API at this URL to check upstream CI status 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 case "$1" in "submodule-build") cd "$2" 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" ;; "installtest") APREP_APT_EXTRAS="sudo" ;; "") APREP_APT_EXTRAS= ;; *) 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 CI_COMMIT_TAG_RESOLVE=$(git tag --points-at HEAD) 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 fi echo "err! unable to resolve tag or building dev version- skipping binary dl" CI_COMMIT_TAG_RESOLVE= fi fi 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 fi mv forgejo-*-linux-arm64 $2 chmod +x $2 exit 0 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 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.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 apt install -y ./"$2" [ -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 & sleep 10 curl http://localhost:3000/ | grep -A 4 "Powered by Forgejo" 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" sudo -u forgejo USER=forgejo \ HOME=/var/lib/forgejo FORGEJO_WORK_DIR=/var/lib/forgejo \ forgejo web -q --config /etc/fogejo/app.ini & sleep 10 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 ;; esac