Skip to content
Snippets Groups Projects
Commit 142274fe authored by al.schwinn's avatar al.schwinn
Browse files

Simplify Release Script (Issue #54)

parent 81017cfd
No related branches found
No related tags found
No related merge requests found
......@@ -2,44 +2,25 @@
####################################################################################################################################
# Usage examples:
# first you need to source this script, so that you can use it's methods:
# $ source releaseSilecs.sh
# release version v1.0.0 using the default pathes.
# $ ./releaseSilecs.sh 1.0.0
#
### release ####
# release a new version v1.0.0 using the default pathes. A git branch and tag will be created and pushed
# $ release_global 1.0.0 /home/bel/schwinn/lnx/git
#
# A local release will not create any branches and/or tags
# $ release_local 1.0.0 /home/bel/schwinn/lnx/git
#
### patch ###
# patch two packages of an existing version 1.2.3, resulting of a installation of 1.2.4 using the default pathes. A git branch and tag will be created and pushed
# $ patch_global silecs-codegen 1.2.3 /home/bel/schwinn/lnx/git
# $ patch_global silecs-model 1.2.3 /home/bel/schwinn/lnx/git
#
# A local patch will not create any branches and/or tags
# $ patch_local silecs-model 1.2.3 /home/bel/schwinn/lnx/git
#
### release plugin ###
# release a new version of the silecs-eclipse plugin
# $ plugin_release /home/bel/schwinn/lnx/git-silecs-plugin /common/usr/cscofe/silecs
# release version v1.0.0 using a custom path
# $ ./releaseSilecs.sh 1.0.0 /home/bel/schwinn/lnx/git
#
####################################################################################################################################
# List of silecs packages which can be released or patched
PACKAGES="silecs-codegen silecs-model snap7 silecs-communication-cpp silecs-diagnostic-cpp silecs-cli-client"
# branch to release
RELEASE_BRANCH=gsi
# name of git remote repo
UPSTREAM=origin
# silecs-diagnostic-cpp does not build any more on acc8 .. see https://gitlab.com/al.schwinn/silecs/-/issues/55
#PACKAGES="silecs-codegen silecs-model snap7 silecs-communication-cpp silecs-diagnostic-cpp silecs-cli-client"
PACKAGES="silecs-codegen silecs-model snap7 silecs-communication-cpp silecs-cli-client"
# release locations
#GLOBAL_RELEASE_DIR=${HOME}/tmp/silecs-global
GLOBAL_RELEASE_DIR=/common/usr/cscofe/silecs
LOCAL_RELEASE_DIR=${HOME}/tmp/silecs
SCRIPT=$(readlink -f "$0")
SCRIPTPATH=$(dirname "$SCRIPT") # path where this script is located in
WORKSPACE=$(dirname "$SCRIPTPATH")
# Used in makefile for silecs-communication
exportVersionInfo()
......@@ -53,81 +34,6 @@ exportVersionInfo()
export PATCH=${PATCH}
}
validateBranch()
{
REQUIRED_BRANCH=$1
CURRENT_BRANCH=`git symbolic-ref --short -q HEAD`
if [ "$CURRENT_BRANCH" != "$REQUIRED_BRANCH" ]; then
echo "Error: Release only can be done if branch '${REQUIRED_BRANCH}' is checked out."
return 1
fi
git fetch
REMOTE_SHA=`git rev-parse origin/${REQUIRED_BRANCH}`
LOCAL_SHA=`git rev-parse HEAD`
if [[ -z $(git status -s) ]]
then
echo "workspace is in sync with local repo"
else
echo "workspace is dirty, please commit changes before running this"
return 1
fi
if [ $REMOTE_SHA != $LOCAL_SHA ]; then
echo "Error: local repo differs from remote repo ! Please first push/pull to get a consistant state!"
return 1
fi
}
createAndPushBranch()
{
BRANCH_NAME=$1
git rev-parse --verify ${BRANCH_NAME}
if [ "$?" = "0" ]; then
echo "Error: The branch '${BRANCH_NAME}' already exists locally."
echo "Creating branch cancelled."
return 1
fi
# check if already exists
EXISTS=`git ls-remote --heads ${UPSTREAM} ${BRANCH_NAME} | wc -l`
if [ "$EXISTS" != "0" ]; then
echo "Error: The branch '${BRANCH_NAME}' already exists on ${UPSTREAM}."
echo "Creating branch cancelled."
return 1
fi
# create new and push
git checkout -b ${BRANCH_NAME}
git push ${UPSTREAM} ${BRANCH_NAME}
}
createAndPushTag()
{
TAG_NAME=$1
if [ $(git tag -l "${TAG_NAME}") ]; then
echo "Error: The tag '${TAG_NAME}' already exists locally."
echo "Creating tag cancelled."
return 1
fi
EXISTS=`git ls-remote ${UPSTREAM} refs/tags/${TAG_NAME} | wc -l`
echo $EXISTS
if [ "$EXISTS" != "0" ]; then
echo "Error: The tag '${TAG_NAME}' already exists on ${UPSTREAM}."
echo "Creating branch cancelled."
return 1
fi
# create new and push
git tag ${TAG_NAME}
git push ${UPSTREAM} ${TAG_NAME}
}
# Check that folder exists, print proper error if not
checkFolderExists()
{
......@@ -141,188 +47,32 @@ checkFolderExists()
# releases all silecs-packages to release-dir
release_local()
{
release $1 $2 ${LOCAL_RELEASE_DIR}
}
release_global()
{
release $1 $2 ${GLOBAL_RELEASE_DIR}
}
VERSION=$1
release()
{
VERSION=$1
WORKSPACE=$2
RELEASE_DIR_BASE=$3
exportVersionInfo ${VERSION}
checkFolderExists ${WORKSPACE}
if [ $RELEASE_DIR_BASE = $GLOBAL_RELEASE_DIR ]; then
validateBranch ${RELEASE_BRANCH}
if [ "$?" -eq "1" ]; then
echo "Installation cancelled."
return 1
fi
fi
for PACKAGE in $PACKAGES; do
INSTALL_DIR=${RELEASE_DIR_BASE}/${PACKAGE}/${VERSION}
if [ -d ${INSTALL_DIR} ]; then
echo "Error: Silecs version ${VERSION} is already installed in ${INSTALL_DIR}. Exiting now."
return 1
else
checkFolderExists ${WORKSPACE}/${PACKAGE}
echo "installing ${INSTALL_DIR} from ${WORKSPACE}/${PACKAGE}"
${WORKSPACE}/${PACKAGE}/install.sh ${INSTALL_DIR}
if [ "$?" -eq "1" ]; then
echo "Installation cancelled."
return 1
fi
fi
done
if [ $RELEASE_DIR_BASE = $GLOBAL_RELEASE_DIR ]; then
RELEASE_BRANCH_VERSION=`replace_tiny_version_with_x ${VERSION}`
RELEASE_BRANCH_NAME="gsi-$RELEASE_BRANCH_VERSION"
createAndPushBranch ${RELEASE_BRANCH_NAME}
if [ "$?" -eq "1" ]; then
echo "Creation of branch cancelled."
return 1
fi
RELEASE_TAG="gsi-$VERSION"
createAndPushTag ${RELEASE_TAG}
fi
return 0
}
if ["$2" ]
then
RELEASE_DIR_BASE=$2
else
RELEASE_DIR_BASE=$GLOBAL_RELEASE_DIR
fi
patch_local()
{
patch $1 $2 $3 ${LOCAL_RELEASE_DIR}
}
patch_global()
{
patch $1 $2 $3 ${GLOBAL_RELEASE_DIR}
}
exportVersionInfo ${VERSION}
plugin_release()
{
(
set -e
WORKSPACE=$1
RELEASE_DIR_BASE=$2
PACKAGE=silecs-eclipse-plugin-gsi-update-site
INSTALL_DIR=${RELEASE_DIR_BASE}/${PACKAGE}
for PACKAGE in $PACKAGES; do
INSTALL_DIR=${RELEASE_DIR_BASE}/${PACKAGE}/${VERSION}
if [ -d ${INSTALL_DIR} ]; then
echo "Warning: Silecs version ${VERSION} is already installed in ${INSTALL_DIR} ... skipping."
else
checkFolderExists ${WORKSPACE}/${PACKAGE}
echo "installing ${INSTALL_DIR} from ${WORKSPACE}/${PACKAGE}"
${WORKSPACE}/${PACKAGE}/install.sh ${INSTALL_DIR}
return 0
)
}
increment_version ()
{
declare -a part=( ${1//\./ } )
declare new
declare -i carry=1
for (( CNTR=${#part[@]}-1; CNTR>=0; CNTR-=1 )); do
len=${#part[CNTR]}
new=$((part[CNTR]+carry))
[ ${#new} -gt $len ] && carry=1 || carry=0
[ $CNTR -gt 0 ] && part[CNTR]=${new: -len} || part[CNTR]=${new}
done
new="${part[*]}"
echo -e "${new// /.}"
}
replace_tiny_version_with_x ()
{
echo -e "${1%.*}.x"
}
patch_local()
{
patch $1 $2 $3 ${LOCAL_RELEASE_DIR}
}
patch_global()
{
patch $1 $2 $3 ${GLOBAL_RELEASE_DIR}
}
# releases a specific package to release-dir. For all other packages symlinks to the base-version are generated
patch()
{
PACKAGE_TO_PATCH=$1
BASE_VERSION=$2
WORKSPACE=$3
RELEASE_DIR_BASE=$4
checkFolderExists ${WORKSPACE}
NEW_VERSION=`increment_version $BASE_VERSION`
echo "New version will be: '$NEW_VERSION'"
exportVersionInfo ${NEW_VERSION}
BASE_BRANCH_VERSION=`replace_tiny_version_with_x $BASE_VERSION`
BASE_BRANCH="gsi-$BASE_BRANCH_VERSION"
if [ $RELEASE_DIR_BASE = $GLOBAL_RELEASE_DIR ]; then
validateBranch ${BASE_BRANCH}
if [ "$?" -eq "1" ]; then
echo "Installation cancelled."
return 1
fi
fi
for PACKAGE in $PACKAGES; do
INSTALL_DIR=${RELEASE_DIR_BASE}/${PACKAGE}/${NEW_VERSION}
BASE_DIR=${RELEASE_DIR_BASE}/${PACKAGE}/${BASE_VERSION}
checkFolderExists ${BASE_DIR}
checkFolderExists ${INSTALL_DIR}
if [ "$PACKAGE" == "$PACKAGE_TO_PATCH" ]; then
if [ -d ${INSTALL_DIR} ]; then
if [ -L ${INSTALL_DIR} ]; then
checkFolderExists ${WORKSPACE}/${PACKAGE}
# Replace Sym-Link with patch-version ... needed if more than one package is patched for the same version
unlink ${INSTALL_DIR}
checkFolderExists ${WORKSPACE}/${PACKAGE}
${WORKSPACE}/${PACKAGE}/install.sh ${INSTALL_DIR}
if [ "$?" -eq "1" ]; then
echo "Installation cancelled."
return 1
fi
else
echo "Error: Silecs version ${NEW_VERSION} of package ${PACKAGE} is already installed in ${INSTALL_DIR}. Exiting now."
return 1
fi
else
checkFolderExists ${WORKSPACE}/${PACKAGE}
echo "installing ${INSTALL_DIR} from ${WORKSPACE}/${PACKAGE}"
${WORKSPACE}/${PACKAGE}/install.sh ${INSTALL_DIR}
fi
else
if [ ! -d ${INSTALL_DIR} ]; then
# no patched version for this package available --> link to base-version
echo "Symbolic link to base version '${BASE_VERSION}' created for package '${PACKAGE}' of version '${NEW_VERSION}'"
ln -s ${BASE_VERSION} ${INSTALL_DIR}
fi
if [ "$?" -eq "1" ]; then
echo "Installation cancelled."
exit 1
fi
done
echo "All packages patched successfully"
if [ $RELEASE_DIR_BASE = $GLOBAL_RELEASE_DIR ]; then
echo "Attempt to create and push git tag"
TAG_NAME="gsi-$NEW_VERSION"
createAndPushTag ${TAG_NAME}
fi
return 0
}
done
exit 0
echo "releaseSilecs.sh sourced successfully"
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment