summaryrefslogtreecommitdiff
path: root/src/CI/travis/lib.sh
diff options
context:
space:
mode:
Diffstat (limited to 'src/CI/travis/lib.sh')
-rw-r--r--src/CI/travis/lib.sh304
1 files changed, 304 insertions, 0 deletions
diff --git a/src/CI/travis/lib.sh b/src/CI/travis/lib.sh
new file mode 100644
index 0000000..a071cfc
--- /dev/null
+++ b/src/CI/travis/lib.sh
@@ -0,0 +1,304 @@
+#!/bin/sh -e
+
+export TRAVIS_API_URL="https://api.travis-ci.org"
+LOCAL_BUILD_DIR=${LOCAL_BUILD_DIR:-build}
+
+COMMON_SCRIPTS="jobs_running_cnt.py inside_docker.sh"
+
+echo_red() { printf "\033[1;31m$*\033[m\n"; }
+echo_green() { printf "\033[1;32m$*\033[m\n"; }
+echo_blue() { printf "\033[1;34m$*\033[m\n"; }
+
+get_script_path() {
+ local script="$1"
+
+ [ -n "$script" ] || return 1
+
+ if [ -f "CI/travis/$script" ] ; then
+ echo "CI/travis/$script"
+ elif [ -f "ci/travis/$script" ] ; then
+ echo "ci/travis/$script"
+ elif [ -f "${LOCAL_BUILD_DIR}/$script" ] ; then
+ echo "${LOCAL_BUILD_DIR}/$script"
+ else
+ return 1
+ fi
+}
+
+pipeline_branch() {
+ local branch=$1
+
+ [ -n "$branch" ] || return 1
+
+ # master is a always a pipeline branch
+ [ "$branch" = "master" ] && return 0
+
+ set +x
+ # Check if branch name is 20XX_RY where:
+ # XX - 14 to 99 /* wooh, that's a lot of years */
+ # Y - 1 to 9 /* wooh, that's a lot of releases per year */
+ for year in $(seq 2014 2099) ; do
+ for rel_num in $(seq 1 9) ; do
+ [ "$branch" = "${year}_R${rel_num}" ] && \
+ return 0
+ done
+ done
+
+ return 1
+}
+
+should_trigger_next_builds() {
+ local branch="$1"
+
+ [ -z "${COVERITY_SCAN_PROJECT_NAME}" ] || return 1
+
+ # These Travis-CI vars have to be non-empty
+ [ -n "$TRAVIS_PULL_REQUEST" ] || return 1
+ [ -n "$branch" ] || return 1
+ set +x
+ [ -n "$TRAVIS_API_TOKEN" ] || return 1
+
+ # Has to be a non-pull-request
+ [ "$TRAVIS_PULL_REQUEST" = "false" ] || return 1
+
+ pipeline_branch "$branch" || return 1
+
+ local python_script="$(get_script_path jobs_running_cnt.py)"
+ if [ -z "$python_script" ] ; then
+ echo "Could not find 'jobs_running_cnt.py'"
+ return 1
+ fi
+
+ local jobs_cnt=$(python $python_script)
+
+ # Trigger next job if we are the last job running
+ [ "$jobs_cnt" = "1" ]
+}
+
+trigger_build() {
+ local repo_slug="$1"
+ local branch="$2"
+
+ [ -n "$repo_slug" ] || return 1
+ [ -n "$branch" ] || return 1
+
+ local body="{
+ \"request\": {
+ \"branch\":\"$branch\"
+ }
+ }"
+
+ # Turn off tracing here (shortly)
+ set +x
+ curl -s -X POST \
+ -H "Content-Type: application/json" \
+ -H "Accept: application/json" \
+ -H "Travis-API-Version: 3" \
+ -H "Authorization: token $TRAVIS_API_TOKEN" \
+ -d "$body" \
+ https://api.travis-ci.org/repo/$repo_slug/requests
+}
+
+trigger_adi_build() {
+ local adi_repo="$1"
+ local branch="$2"
+
+ [ -n "$adi_repo" ] || return 1
+ trigger_build "analogdevicesinc%2F$adi_repo" "$branch"
+}
+
+command_exists() {
+ local cmd=$1
+ [ -n "$cmd" ] || return 1
+ type "$cmd" >/dev/null 2>&1
+}
+
+get_ldist() {
+ case "$(uname)" in
+ Linux*)
+ if [ ! -f /etc/os-release ] ; then
+ if [ -f /etc/centos-release ] ; then
+ echo "centos-$(sed -e 's/CentOS release //' -e 's/(.*)$//' \
+ -e 's/ //g' /etc/centos-release)-$(uname -m)"
+ return 0
+ fi
+ ls /etc/*elease
+ [ -z "${OSTYPE}" ] || {
+ echo "${OSTYPE}-unknown"
+ return 0
+ }
+ echo "linux-unknown"
+ return 0
+ fi
+ . /etc/os-release
+ if ! command_exists dpkg ; then
+ echo $ID-$VERSION_ID-$(uname -m)
+ else
+ echo $ID-$VERSION_ID-$(dpkg --print-architecture)
+ fi
+ ;;
+ Darwin*)
+ echo "darwin-$(sw_vers -productVersion)"
+ ;;
+ *)
+ echo "$(uname)-unknown"
+ ;;
+ esac
+ return 0
+}
+
+__brew_install_or_upgrade() {
+ brew install $1 || \
+ brew upgrade $1 || \
+ brew ls --version $1
+}
+
+brew_install_or_upgrade() {
+ while [ -n "$1" ] ; do
+ __brew_install_or_upgrade "$1" || return 1
+ shift
+ done
+}
+
+sftp_cmd_pipe() {
+ sftp ${EXTRA_SSH} ${SSHUSER}@${SSHHOST}
+}
+
+sftp_rm_artifact() {
+ local artifact="$1"
+ sftp_cmd_pipe <<-EOF
+ cd ${DEPLOY_TO}
+ rm ${artifact}
+ EOF
+}
+
+sftp_upload() {
+ local FROM="$1"
+ local TO="$2"
+ local LATE="$3"
+
+ sftp_cmd_pipe <<-EOF
+ cd ${DEPLOY_TO}
+
+ put ${FROM} ${TO}
+ ls -l ${TO}
+
+ symlink ${TO} ${LATE}
+ ls -l ${LATE}
+ bye
+ EOF
+}
+
+upload_file_to_swdownloads() {
+
+ if [ "$#" -ne 4 ] ; then
+ echo "skipping deployment of something"
+ echo "send called with $@"
+ return 0
+ fi
+
+ local LIBNAME=$1
+ local FROM=$2
+ local FNAME=$3
+ local EXT=$4
+
+ if [ -z "$FROM" ] ; then
+ echo no file to send
+ return 1
+ fi
+
+ if [ ! -r "$FROM" ] ; then
+ echo "file $FROM is not readable"
+ return 1
+ fi
+
+ if [ -n "$TRAVIS_PULL_REQUEST_BRANCH" ] ; then
+ local branch="$TRAVIS_PULL_REQUEST_BRANCH"
+ else
+ local branch="$TRAVIS_BRANCH"
+ fi
+
+ local TO=${branch}_${FNAME}
+ local LATE=${branch}_latest_${LIBNAME}${LDIST}${EXT}
+ local GLOB=${DEPLOY_TO}/${branch}_${LIBNAME}-*
+
+ echo attemting to deploy $FROM to $TO
+ echo and ${branch}_${LIBNAME}${LDIST}${EXT}
+ ssh -V
+
+ for rmf in ${TO} ${LATE} ; do
+ sftp_rm_artifact ${rmf} || \
+ echo_blue "Could not delete ${rmf}"
+ done
+
+ sftp_upload "${FROM}" "${TO}" "${LATE}" || {
+ echo_red "Failed to upload artifact from '${FROM}', to '${TO}', symlink '${LATE}'"
+ return 1
+ }
+
+ # limit things to a few files, so things don't grow forever
+ if [ "${EXT}" = ".deb" ] ; then
+ for files in $(ssh ${EXTRA_SSH} ${SSHUSER}@${SSHHOST} \
+ "ls -lt ${GLOB}" | tail -n +100 | awk '{print $NF}')
+ do
+ ssh ${EXTRA_SSH} ${SSHUSER}@${SSHHOST} \
+ "rm ${DEPLOY_TO}/${files}" || \
+ return 1
+ done
+ fi
+
+ return 0
+}
+
+prepare_docker_image() {
+ local DOCKER_IMAGE="$1"
+ sudo apt-get -qq update
+ echo 'DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock -s devicemapper"' | sudo tee /etc/default/docker > /dev/null
+ sudo service docker restart
+ sudo docker pull "$DOCKER_IMAGE"
+}
+
+run_docker_script() {
+ local DOCKER_SCRIPT="$(get_script_path $1)"
+ local DOCKER_IMAGE="$2"
+ local OS_TYPE="$3"
+ local MOUNTPOINT="${4:-docker_build_dir}"
+ sudo docker run --rm=true \
+ -v "$(pwd):/${MOUNTPOINT}:rw" \
+ $DOCKER_IMAGE \
+ /bin/bash -e "/${MOUNTPOINT}/${DOCKER_SCRIPT}" "${MOUNTPOINT}" "${OS_TYPE}"
+}
+
+ensure_command_exists() {
+ local cmd="$1"
+ local package="$2"
+ [ -n "$cmd" ] || return 1
+ [ -n "$package" ] || package="$cmd"
+ ! command_exists "$cmd" || return 0
+ # go through known package managers
+ for pacman in apt-get brew yum ; do
+ command_exists $pacman || continue
+ $pacman install -y $package || {
+ # Try an update if install doesn't work the first time
+ $pacman -y update && \
+ $pacman install -y $package
+ }
+ return $?
+ done
+ return 1
+}
+
+ensure_command_exists sudo
+
+# Other scripts will download lib.sh [this script] and lib.sh will
+# in turn download the other scripts it needs.
+# This gives way more flexibility when changing things, as they propagate
+for script in $COMMON_SCRIPTS ; do
+ [ ! -f "CI/travis/$script" ] || continue
+ [ ! -f "ci/travis/$script" ] || continue
+ [ ! -f "${LOCAL_BUILD_DIR}/$script" ] || continue
+ mkdir -p ${LOCAL_BUILD_DIR}
+ ensure_command_exists wget
+ wget https://raw.githubusercontent.com/analogdevicesinc/libiio/master/CI/travis/$script \
+ -O $LOCAL_BUILD_DIR/$script
+done