diff options
Diffstat (limited to 'src/CI/travis/lib.sh')
-rw-r--r-- | src/CI/travis/lib.sh | 304 |
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 |