197 lines
5.7 KiB
Bash
Executable File
197 lines
5.7 KiB
Bash
Executable File
#!/bin/bash
|
|
##
|
|
## Determine modified packages and build/upload them.
|
|
##
|
|
|
|
set -e
|
|
|
|
## Some packages should be excluded from auto builds.
|
|
EXCLUDED_PACKAGES="rust texlive"
|
|
|
|
###############################################################################
|
|
##
|
|
## Determining changes.
|
|
##
|
|
###############################################################################
|
|
|
|
set +e
|
|
|
|
REPO_DIR=$(realpath "$(dirname "$(realpath "$0")")/../../../")
|
|
cd "$REPO_DIR" || {
|
|
echo "[!] Failed to cd into '$REPO_DIR'."
|
|
exit 1
|
|
}
|
|
|
|
# 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
|
|
# Changes determined from the last commit where CI finished with status
|
|
# 'passed' (green) and the top commit.
|
|
if [ -z "$CIRRUS_LAST_GREEN_CHANGE" ]; then
|
|
GIT_CHANGES="$CIRRUS_CHANGE_IN_REPO"
|
|
else
|
|
GIT_CHANGES="${CIRRUS_LAST_GREEN_CHANGE}..${CIRRUS_CHANGE_IN_REPO}"
|
|
fi
|
|
echo "[*] Changes: $GIT_CHANGES"
|
|
else
|
|
# Changes in pull request are determined from commits between the
|
|
# top commit of base branch and latest commit of PR's branch.
|
|
GIT_CHANGES="${CIRRUS_BASE_SHA}..${CIRRUS_CHANGE_IN_REPO}"
|
|
echo "[*] Pull request: https://github.com/termux/termux-packages/pull/${CIRRUS_PR}"
|
|
fi
|
|
|
|
# Determine changes from commit range.
|
|
CHANGED_FILES=$(git diff-tree --no-commit-id --name-only -r "$GIT_CHANGES" 2>/dev/null)
|
|
|
|
# Modified packages.
|
|
PACKAGE_NAMES=$(sed -nE 's@^packages/([^/]*)/build.sh@\1@p' <<< "$CHANGED_FILES")
|
|
|
|
# Docker scripts.
|
|
DOCKER_SCRIPTS=$(grep -P '^scripts/(Dockerfile|properties.sh|setup-android-sdk.sh|setup-ubuntu.sh)$' <<< "$CHANGED_FILES")
|
|
[ -n "$DOCKER_SCRIPTS" ] && DOCKER_IMAGE_UPDATE_NEEDED=true || DOCKER_IMAGE_UPDATE_NEEDED=false
|
|
|
|
unset CHANGED_FILES
|
|
|
|
## Filter deleted packages.
|
|
for pkg in $PACKAGE_NAMES; do
|
|
if [ ! -d "${REPO_DIR}/packages/${pkg}" ]; then
|
|
PACKAGE_NAMES=$(sed -E "s/(^|\s\s*)${pkg}(\$|\s\s*)/ /g" <<< "$PACKAGE_NAMES")
|
|
fi
|
|
done
|
|
|
|
## Filter excluded packages.
|
|
for pkg in $EXCLUDED_PACKAGES; do
|
|
PACKAGE_NAMES=$(sed -E "s/(^|\s\s*)${pkg}(\$|\s\s*)/ /g" <<< "$PACKAGE_NAMES")
|
|
done
|
|
unset pkg
|
|
|
|
## Remove trailing spaces.
|
|
PACKAGE_NAMES=$(sed 's/[[:blank:]]*$//' <<< "$PACKAGE_NAMES")
|
|
|
|
set -e
|
|
|
|
###############################################################################
|
|
##
|
|
## Executing requested actions. Only one per script session.
|
|
##
|
|
###############################################################################
|
|
|
|
case "$1" in
|
|
--update-docker)
|
|
if $DOCKER_IMAGE_UPDATE_NEEDED; then
|
|
if [ "$CIRRUS_BRANCH" != "master" ]; then
|
|
echo "[!] Refusing to update docker image on non-master branch."
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$DOCKER_USERNAME" ]; then
|
|
echo "[!] Can't update docker image without Docker Hub user name."
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$DOCKER_PASSWORD" ]; then
|
|
echo "[!] Can't update docker image without Docker Hub password."
|
|
exit 1
|
|
fi
|
|
|
|
cd "${REPO_DIR}/scripts"
|
|
|
|
docker build --tag termux/package-builder:latest .
|
|
docker login --username "$DOCKER_USERNAME" --password "$DOCKER_PASSWORD"
|
|
docker push termux/package-builder:latest
|
|
else
|
|
echo "[*] No need to update docker image."
|
|
exit 0
|
|
fi
|
|
;;
|
|
--upload)
|
|
if [ -n "$PACKAGE_NAMES" ]; then
|
|
if [ "$CIRRUS_BRANCH" != "master" ]; then
|
|
echo "[!] Refusing to upload packages on non-master branch."
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$BINTRAY_API_KEY" ]; then
|
|
echo "[!] Can't upload packages without Bintray API key."
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$BINTRAY_GPG_PASSPHRASE" ]; then
|
|
echo "[!] Can't upload packages without GPG passphrase."
|
|
exit 1
|
|
fi
|
|
|
|
for arch in aarch64 arm i686 x86_64; do
|
|
ARCHIVE_NAME="debs-${arch}-${CIRRUS_CHANGE_IN_REPO}.tar.gz"
|
|
|
|
echo "[*] Downloading '${ARCHIVE_NAME}' from cache:"
|
|
curl --output "/tmp/${ARCHIVE_NAME}" \
|
|
"http://${CIRRUS_HTTP_CACHE_HOST}/${ARCHIVE_NAME}"
|
|
|
|
if [ -s "/tmp/${ARCHIVE_NAME}" ]; then
|
|
echo "[*] Unpacking '/tmp/${ARCHIVE_NAME}':"
|
|
tar xvf "/tmp/${ARCHIVE_NAME}"
|
|
else
|
|
echo "[!] Empty archive '/tmp/${ARCHIVE_NAME}'."
|
|
fi
|
|
done
|
|
|
|
echo "[*] Uploading packages to Bintray:"
|
|
"${REPO_DIR}/scripts/package_uploader.sh" -p "${PWD}/debs" $PACKAGE_NAMES
|
|
else
|
|
echo "[*] No modified packages found."
|
|
exit 0
|
|
fi
|
|
;;
|
|
*)
|
|
if [ -n "$PACKAGE_NAMES" ]; then
|
|
echo "[*] Building packages:" $PACKAGE_NAMES
|
|
./build-package.sh -a "$TERMUX_ARCH" -I $PACKAGE_NAMES
|
|
|
|
# Store packages in cache so they can be accessed from
|
|
# upload task.
|
|
if [ "$CIRRUS_BRANCH" = "master" ]; then
|
|
ARCHIVE_NAME="debs-${TERMUX_ARCH}-${CIRRUS_CHANGE_IN_REPO}.tar.gz"
|
|
if [ -d "${REPO_DIR}/debs" ]; then
|
|
echo "[*] Archiving packages into '${ARCHIVE_NAME}'."
|
|
tar zcf "$ARCHIVE_NAME" debs
|
|
|
|
echo "[*] Uploading '${ARCHIVE_NAME}' to cache:"
|
|
echo
|
|
curl --upload-file "$ARCHIVE_NAME" \
|
|
"http://${CIRRUS_HTTP_CACHE_HOST}/${ARCHIVE_NAME}"
|
|
echo
|
|
fi
|
|
fi
|
|
else
|
|
echo "[*] No modified packages found."
|
|
exit 0
|
|
fi
|
|
;;
|
|
esac
|