#!/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