mirror of
https://code.forgejo.org/actions/forgejo-release.git
synced 2025-10-13 16:11:56 +03:00
179 lines
3.8 KiB
Bash
Executable file
179 lines
3.8 KiB
Bash
Executable file
#!/usr/bin/env sh
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
set -ex
|
|
PS4='${0##*/}:$LINENO: '
|
|
|
|
test_system_tea_bin() {
|
|
SYSTEM_TEA_BIN=$TMP_DIR/tea
|
|
: >"$SYSTEM_TEA_BIN" && chmod +x "$SYSTEM_TEA_BIN"
|
|
PATH=$TMP_DIR:$PATH
|
|
export PATH
|
|
setup_tea
|
|
[ "$TEA_BIN" = "$SYSTEM_TEA_BIN" ]
|
|
}
|
|
|
|
test_download_tea_bin() {
|
|
# assume tea is not installed on system
|
|
setup_tea
|
|
[ "$TEA_BIN" = "$TMP_DIR/tea" ]
|
|
}
|
|
|
|
test_teardown() {
|
|
setup_api
|
|
api DELETE repos/$REPO/releases/tags/$TAG || true
|
|
api DELETE repos/$REPO/tags/$TAG || true
|
|
rm -fr dist/release
|
|
setup_tea
|
|
"$TEA_BIN" login delete "$DOER" || true
|
|
}
|
|
|
|
test_reset_repo() {
|
|
project="$1"
|
|
api DELETE repos/$REPO || true
|
|
api POST user/repos --data-raw '{"name":"'$project'", "auto_init":true}'
|
|
git clone "$FORGEJO/$REPO" "$TMP_DIR/repo"
|
|
SHA=$(git -C "$TMP_DIR/repo" rev-parse HEAD)
|
|
}
|
|
|
|
test_setup() {
|
|
project="$1"
|
|
test_reset_repo "$project"
|
|
mkdir -p "$RELEASE_DIR"
|
|
: >"$RELEASE_DIR/file-one.txt"
|
|
: >"$RELEASE_DIR/file-two.txt"
|
|
}
|
|
|
|
test_wait_release_fail() {
|
|
! wait_release
|
|
}
|
|
|
|
test_wait_release() {
|
|
wait_release
|
|
release_draft true
|
|
! wait_release
|
|
}
|
|
|
|
test_create_delete_tag() {
|
|
delete_tag
|
|
|
|
! get_tag
|
|
create_tag
|
|
get_tag
|
|
delete_tag
|
|
! get_tag
|
|
}
|
|
|
|
test_ensure_tag() {
|
|
delete_tag
|
|
#
|
|
# idempotent
|
|
#
|
|
ensure_tag
|
|
mv "$TAG_FILE" "$TMP_DIR/tag1.json"
|
|
|
|
ensure_tag
|
|
mv "$TAG_FILE" "$TMP_DIR/tag2.json"
|
|
|
|
diff -u "$TMP_DIR/tag1.json" "$TMP_DIR/tag2.json"
|
|
#
|
|
# sanity check on the SHA of an existing tag
|
|
#
|
|
(
|
|
SHA=12345
|
|
! matched_tag
|
|
! ensure_tag
|
|
)
|
|
delete_tag
|
|
}
|
|
|
|
test_maybe_sign_release_no_gpg() {
|
|
test_maybe_sign_release_setup no_gpg
|
|
|
|
GPG_PRIVATE_KEY=
|
|
maybe_sign_release
|
|
|
|
! [ -f "$RELEASE_DIR/file-one.txt.asc" ]
|
|
}
|
|
|
|
test_maybe_sign_release_gpg_no_passphrase() {
|
|
test_maybe_sign_release_setup gpg_no_passphrase
|
|
|
|
GPG_PRIVATE_KEY=testdata/gpg-private-no-passphrase.asc
|
|
maybe_sign_release
|
|
|
|
test_maybe_sign_release_skipped
|
|
test_maybe_sign_release_verify
|
|
}
|
|
|
|
test_maybe_sign_release_gpg() {
|
|
test_maybe_sign_release_setup gpg
|
|
|
|
GPG_PRIVATE_KEY=testdata/gpg-private.asc
|
|
GPG_PASSPHRASE=testdata/gpg-private.passphrase
|
|
maybe_sign_release
|
|
|
|
test_maybe_sign_release_skipped
|
|
test_maybe_sign_release_verify
|
|
}
|
|
|
|
test_maybe_sign_release_skipped() {
|
|
! [ -f "$RELEASE_DIR/file-one.txt.sha256.asc" ]
|
|
! [ -f "$RELEASE_DIR/file-two.txt.sha256.asc" ]
|
|
}
|
|
|
|
test_maybe_sign_release_verify() {
|
|
for file in "$RELEASE_DIR/file-one.txt" "$RELEASE_DIR/file-two.txt"; do
|
|
gpg --verify "$file.asc" "$file"
|
|
done
|
|
}
|
|
|
|
test_maybe_sign_release_setup() {
|
|
name="$1"
|
|
|
|
echo "========= maybe_sign_release $name ========="
|
|
RELEASE_DIR="$TMP_DIR/$name"
|
|
mkdir -p "$RELEASE_DIR"
|
|
GNUPGHOME="$TMP_DIR/$name/.gnupg"
|
|
mkdir -p "$GNUPGHOME"
|
|
: >"$RELEASE_DIR/file-one.txt"
|
|
: >"$RELEASE_DIR/file-one.txt.sha256"
|
|
: >"$RELEASE_DIR/file-two.txt"
|
|
: >"$RELEASE_DIR/file-two.txt.sha256"
|
|
}
|
|
|
|
test_maybe_sign_release() {
|
|
test_maybe_sign_release_no_gpg
|
|
test_maybe_sign_release_gpg_no_passphrase
|
|
test_maybe_sign_release_gpg
|
|
}
|
|
|
|
test_run() {
|
|
user="$1"
|
|
project="$2"
|
|
test_teardown
|
|
to_push="$TMP_DIR/binaries-releases-to-push"
|
|
pulled="$TMP_DIR/binaries-releases-pulled"
|
|
RELEASE_DIR="$to_push"
|
|
REPO="$user/$project"
|
|
test_setup "$project"
|
|
test_ensure_tag
|
|
test_create_delete_tag
|
|
DELAY=0
|
|
test_wait_release_fail
|
|
echo "================================ TEST BEGIN"
|
|
upload
|
|
RELEASE_DIR="$pulled"
|
|
download
|
|
diff -r "$to_push" "$pulled"
|
|
echo "================================ TEST END"
|
|
test_wait_release
|
|
}
|
|
|
|
TMP_DIR=$(mktemp -d)
|
|
|
|
trap 'rm -fr "$TMP_DIR"' 0 INT TERM
|
|
|
|
: ${TAG:=v17.8.20-1}
|
|
|
|
. "$(dirname "$0")/../forgejo-release.sh"
|