summaryrefslogtreecommitdiff
path: root/.ci-make.sh
blob: 4d5de5691debfc7e0f33323179d51820041cd736 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
#!/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"
		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"
				;;
			"installtest")
				APREP_APT_EXTRAS="sudo"
				if [ ! "$TEST_DEBIAN_BUSTER" ] ; then
					APREP_APT_EXTRAS="$APREP_APT_EXTRAS retry"
				fi
				;;
			"")
				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-amd64)
			CI_RELEASE_BINARY_URL=$(echo "$CI_RELEASE_ASSETS" | grep linux-amd64\" | jq -r --jsonargs .browser_download_url)
			CI_RELEASE_SHA256=$(curl $(echo "$CI_RELEASE_ASSETS" | grep linux-amd64.sha256\" | jq -r --jsonargs .browser_download_url) | cut -d ' ' -f1)
			wget -nv --content-disposition $CI_RELEASE_BINARY_URL
			DOWNLOAD_SHA256=$(sha256sum forgejo-*-linux-amd64 | 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-amd64 $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
		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
				echo "ERR! Unable to find the necessary forgejo-common package!"
				exit 96
			fi
		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 &
			else
				echo "No env setup! Run testing defaults using hardcoded vars..."
				sudo -u forgejo USER=forgejo forgejo web -q &
			fi
			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"
			fi
		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")
				shift
				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
				export DEBIAN_FRONTEND=noninteractive
				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_*_amd64.deb ./forgejo-common_*_all.deb
				cat /etc/forgejo/app.ini
				;;
		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
		;;
esac