termux-packages/scripts/build/ci/cirrus-ci_dispatcher.sh
Leonid Pliushch b1f23e5f4c CI: do not start upload if API key or passphrase is not set
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).
2019-07-22 21:33:21 +03:00

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