b1f23e5f4c
CI periodically shows error like Failed to decrypt some environment variables so it will be better to stop immediately when environment is inconsistent for unknown reason (e.g. due to Github's problems).
153 lines
4.3 KiB
Bash
Executable File
153 lines
4.3 KiB
Bash
Executable File
#!/bin/bash
|
|
##
|
|
## Determine modified packages and build/upload them.
|
|
##
|
|
|
|
set -e
|
|
|
|
###############################################################################
|
|
##
|
|
## Preparation.
|
|
##
|
|
###############################################################################
|
|
|
|
REPO_DIR=$(realpath "$(dirname "$(realpath "$0")")/../../../")
|
|
cd "$REPO_DIR" || {
|
|
echo "[!] Failed to cd into '$REPO_DIR'."
|
|
exit 1
|
|
}
|
|
|
|
DO_UPLOAD=false
|
|
if [ $# -ge 1 ]; then
|
|
if [ "$1" = "--upload" ]; then
|
|
DO_UPLOAD=true
|
|
fi
|
|
fi
|
|
|
|
###############################################################################
|
|
##
|
|
## Determining changes.
|
|
##
|
|
###############################################################################
|
|
|
|
set +e
|
|
|
|
# Some environment variables are important for correct functionality
|
|
# of this script.
|
|
if [ -z "$CIRRUS_CHANGE_IN_REPO" ]; then
|
|
echo "[!] CIRRUS_CHANGE_IN_REPO is not set."
|
|
exit 1
|
|
fi
|
|
|
|
if [ -n "$CIRRUS_PR" ] && [ -z "$CIRRUS_BASE_SHA" ]; then
|
|
echo "[!] CIRRUS_BASE_SHA is not set."
|
|
exit 1
|
|
fi
|
|
|
|
# Process tag '%ci:no-build' that may be added as line to commit message.
|
|
# Will force CI to exit with status 'passed' without performing build.
|
|
if grep -qiP '^\s*%ci:no-build\s*$' <(git log --format="%B" -n 1 "$CIRRUS_CHANGE_IN_REPO"); then
|
|
echo "[!] Exiting with status 'passed' (tag '%ci:no-build' applied)."
|
|
exit 0
|
|
fi
|
|
|
|
# Process tag '%ci:reset-backlog' that may be added as line to commit message.
|
|
# Will force CI to build changes only for the current commit.
|
|
if grep -qiP '^\s*%ci:reset-backlog\s*$' <(git log --format="%B" -n 1 "$CIRRUS_CHANGE_IN_REPO"); then
|
|
echo "[!] Building only last pushed commit (tag '%ci:reset-backlog' applied)."
|
|
unset CIRRUS_LAST_GREEN_CHANGE
|
|
unset CIRRUS_BASE_SHA
|
|
fi
|
|
|
|
if [ -z "$CIRRUS_PR" ]; then
|
|
if [ -z "$CIRRUS_LAST_GREEN_CHANGE" ]; then
|
|
UPDATED_FILES=$(git diff-tree --no-commit-id --name-only -r "$CIRRUS_CHANGE_IN_REPO" 2>/dev/null | grep -P "packages/")
|
|
else
|
|
UPDATED_FILES=$(git diff-tree --no-commit-id --name-only -r "${CIRRUS_LAST_GREEN_CHANGE}..${CIRRUS_CHANGE_IN_REPO}" 2>/dev/null | grep -P "packages/")
|
|
fi
|
|
else
|
|
# Pull requests are handled in a bit different way.
|
|
UPDATED_FILES=$(git diff-tree --no-commit-id --name-only -r "${CIRRUS_BASE_SHA}..${CIRRUS_CHANGE_IN_REPO}" 2>/dev/null | grep -P "packages/")
|
|
fi
|
|
|
|
## Determine modified packages.
|
|
existing_dirs=""
|
|
for dir in $(echo "$UPDATED_FILES" | grep -oP "packages/[a-z0-9+._-]+" | sort | uniq); do
|
|
if [ -d "${REPO_DIR}/${dir}" ]; then
|
|
existing_dirs+=" $dir"
|
|
fi
|
|
done
|
|
PACKAGE_DIRS="$existing_dirs"
|
|
unset dir existing_dirs
|
|
|
|
## Get names of modified packages.
|
|
PACKAGE_NAMES=$(echo "$PACKAGE_DIRS" | sed 's/packages\///g')
|
|
if [ -z "$PACKAGE_NAMES" ]; then
|
|
echo "[*] No modified packages found." >&2
|
|
exit 0
|
|
fi
|
|
|
|
|
|
## Some packages should be excluded from auto builds.
|
|
EXCLUDED_PACKAGES="rust texlive"
|
|
|
|
for excluded_pkg in $EXCLUDED_PACKAGES; do
|
|
PACKAGE_NAMES=$(echo "$PACKAGE_NAMES" | sed "s/\<${excluded_pkg}\>//g")
|
|
done
|
|
unset excluded_pkg
|
|
|
|
set -e
|
|
|
|
###############################################################################
|
|
##
|
|
## Building packages.
|
|
##
|
|
###############################################################################
|
|
|
|
if ! $DO_UPLOAD; then
|
|
echo "[*] Building packages: $PACKAGE_NAMES"
|
|
if [ -n "$CIRRUS_PR" ]; then
|
|
echo "[*] Pull request: https://github.com/termux/termux-packages/pull/${CIRRUS_PR}"
|
|
else
|
|
if [ -n "$CIRRUS_LAST_GREEN_CHANGE" ]; then
|
|
echo "[*] Changes: ${CIRRUS_LAST_GREEN_CHANGE}..${CIRRUS_CHANGE_IN_REPO}"
|
|
else
|
|
echo "[*] Changes: ${CIRRUS_CHANGE_IN_REPO}"
|
|
fi
|
|
fi
|
|
|
|
./build-package.sh -a "$TERMUX_ARCH" -I $PACKAGE_NAMES
|
|
else
|
|
if [ -z "$BINTRAY_API_KEY" ]; then
|
|
echo "[!] Can't upload without Bintray API key."
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$BINTRAY_GPG_PASSPHRASE" ]; then
|
|
echo "[!] Can't upload without GPG passphrase."
|
|
exit 1
|
|
fi
|
|
|
|
# Workaround for concurrent uploads.
|
|
UPLOAD_DELAY=$((30 + RANDOM % 120))
|
|
echo "[!] Using workaround for Bintray issue with concurrent uploads."
|
|
echo "[!] Delaying upload by ${UPLOAD_DELAY} seconds."
|
|
sleep $UPLOAD_DELAY
|
|
unset UPLOAD_DELAY
|
|
|
|
for attempt in 1 2 3; do
|
|
echo "[*] Uploading packages to Bintray:"
|
|
if ./scripts/package_uploader.sh -p "${PWD}/debs" $PACKAGE_NAMES; then
|
|
break
|
|
else
|
|
if [ "$attempt" = "3" ]; then
|
|
echo "[!] Went through 3 attempts of upload, giving up..."
|
|
exit 1
|
|
else
|
|
echo "[!] Failure, retrying in 30 seconds..."
|
|
sleep 30
|
|
fi
|
|
fi
|
|
done
|
|
fi
|