#!/usr/bin/env bash # ---------------- Settings repo=git@cloud21.cvtt.vpn:/works/git/cvtt2/research/pairs_trading.git dist_root=/home/cvttdist/software/cvtt2 dist_user=cvttdist dist_host="cloud21.cvtt.vpn" dist_ssh_port="22" dist_locations="cloud21.cvtt.vpn:22 hs01.cvtt.vpn:22" version_file="VERSION" prj=pairs_trading brnch=master interactive=N # ---------------- Settings # ---------------- cmdline usage() { echo "Usage: $0 [-b -i (interactive)" exit 1 } while getopts "b:i" opt; do case ${opt} in b ) brnch=$OPTARG ;; i ) interactive=Y ;; \? ) echo "Invalid option: -$OPTARG" >&2 usage ;; : ) echo "Option -$OPTARG requires an argument." >&2 usage ;; esac done # ---------------- cmdline confirm() { if [ "${interactive}" == "Y" ]; then echo "--------------------------------" echo -n "Press to continue" && read fi } if [ "${interactive}" == "Y" ]; then echo -n "Enter project [${prj}]: " read project if [ "${project}" == "" ] then project=${prj} fi else project=${prj} fi # repo=${git_repo_arr[${project}]} if [ -z ${repo} ]; then echo "ERROR: Project repository for ${project} not found" exit -1 fi echo "Project repo: ${repo}" if [ "${interactive}" == "Y" ]; then echo -n "Enter branch to build release from [${brnch}]: " read branch if [ "${branch}" == "" ] then branch=${brnch} fi else branch=${brnch} fi tmp_dir=$(mktemp -d) function cleanup { cd ${HOME} rm -rf ${tmp_dir} } trap cleanup EXIT prj_dir="${tmp_dir}/${prj}" cmd_arr=() Cmd="git clone ${repo} ${prj_dir}" cmd_arr+=("${Cmd}") Cmd="cd ${prj_dir}" cmd_arr+=("${Cmd}") if [ "${interactive}" == "Y" ]; then echo "------------------------------------" echo "The following commands will execute:" echo "------------------------------------" for cmd in "${cmd_arr[@]}" do echo ${cmd} done fi confirm for cmd in "${cmd_arr[@]}" do echo ${cmd} && eval ${cmd} done Cmd="git checkout ${branch}" echo ${Cmd} && eval ${Cmd} if [ "${?}" != "0" ]; then echo "ERROR: Branch ${branch} is not found" cd ${HOME} && rm -rf ${tmp_dir} exit -1 fi release_version=$(cat ${version_file} | awk -F',' '{print $1}') whats_new=$(cat ${version_file} | awk -F',' '{print $2}') echo "--------------------------------" echo "Version file: ${version_file}" echo "Release version: ${release_version}" confirm version_tag="v${release_version}" if [ "$(git tag -l "${version_tag}")" != "" ]; then version_tag="${version_tag}.$(date +%Y%m%d_%H%M)" fi version_comment="'${version_tag} ${project} ${branch} $(date +%Y-%m-%d)\n${whats_new}'" cmd_arr=() Cmd="git tag -a ${version_tag} -m ${version_comment}" cmd_arr+=("${Cmd}") Cmd="git push origin --tags" cmd_arr+=("${Cmd}") Cmd="rm -rf .git" cmd_arr+=("${Cmd}") SourceLoc=../${project} dist_path="${dist_root}/${project}/${release_version}" for dist_loc in ${dist_locations}; do dhp=(${dist_loc//:/ }) dist_host=${dhp[0]} dist_port=${dhp[1]} Cmd="rsync -avzh" Cmd="${Cmd} --rsync-path=\"mkdir -p ${dist_path}" Cmd="${Cmd} && rsync\" -e \"ssh -p ${dist_ssh_port}\"" Cmd="${Cmd} $SourceLoc ${dist_user}@${dist_host}:${dist_path}/" cmd_arr+=("${Cmd}") done if [ "${interactive}" == "Y" ]; then echo "------------------------------------" echo "The following commands will execute:" echo "------------------------------------" for cmd in "${cmd_arr[@]}" do echo ${cmd} done fi confirm for cmd in "${cmd_arr[@]}" do pwd && echo ${cmd} && eval ${cmd} done echo "$0 Done ${project} ${release_version}"