#!/bin/bash SCRIPT_DIR="$(readlink -f $(dirname ${BASH_SOURCE[0]}))" JOB_DIR="${SCRIPT_DIR}/jobs" WORKSPACE_DIR="${SCRIPT_DIR}/workspaces" LOG_DIR="${SCRIPT_DIR}/logs" check_for_remote_changes() { local DIR=$1 local BRANCH=$2 pushd "${DIR}" > /dev/null || { echo "Directory ${DIR} not found!"; return 1; } # Fetch the latest changes from the remote git fetch # Get the local and remote commit hashes for the branch LOCAL=$(git rev-parse "${BRANCH}") REMOTE=$(git rev-parse "origin/${BRANCH}") # Check if local and remote are different if [ "${LOCAL}" != "${REMOTE}" ]; then echo $(date +"%Y-%m-%d %H:%M:%S") "Remote changes detected in ${DIR}" popd > /dev/null return 0 else echo $(date +"%Y-%m-%d %H:%M:%S") "No remote changes in ${DIR}" popd > /dev/null return 1 fi } trigger() { REPO="" BRANCH="live" COMMAND="make publish" WORKSPACE="" source "${1}" if [ ${WORKSPACE} ]; then DIR="${WORKSPACE}" else DIR="$(echo ${REPO##*/} | sed -e 's/\.git$//')" fi FORCE=${2} TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S") # echo REPO=${REPO} # echo BRANCH=${BRANCH} # echo COMMAND=${COMMAND} # echo DIR=${DIR} # echo FORCE=${FORCE} pushd ${LOG_DIR} > /dev/null git checkout -B ${DIR} echo > build.log popd > /dev/null if [ ${REPO} ]; then if ! [ -e "${WORKSPACE_DIR}/${DIR}" ] ; then git clone -b ${BRANCH} ${REPO} "${WORKSPACE_DIR}/${DIR}" >> ${LOG_DIR}/build.log 2>&1 FORCE=1 fi if [ "${FORCE}" ] || check_for_remote_changes "${WORKSPACE_DIR}/${DIR}" "${BRANCH}"; then pushd "${WORKSPACE_DIR}/${DIR}" > /dev/null git pull origin ${BRANCH} >> ${LOG_DIR}/build.log 2>&1 ${COMMAND} >> ${LOG_DIR}/build.log 2>&1 popd > /dev/null fi fi pushd ${LOG_DIR} > /dev/null git add build.log git commit -m "Build ${TIMESTAMP}" git push -u origin "${DIR}" popd > /dev/null } mkdir -p "${WORKSPACE_DIR}" if [ $# -gt 0 ] ; then for i in $@ ; do trigger "${JOB_DIR}/$i" 1 done else for i in ${JOB_DIR}/* ; do trigger "$i" done fi