Make versionsLT support versions with qualifier (#307)
Extracted functions to jenkins-support; included in both jenkins.sh and
install-plugin.sh.
Added a separate test file to test versionLT function
diff --git a/jenkins-support b/jenkins-support
new file mode 100755
index 0000000..6174b86
--- /dev/null
+++ b/jenkins-support
@@ -0,0 +1,127 @@
+#!/bin/bash -e
+
+# compare if version1 < version2
+versionLT() {
+ local v1; v1=$(echo $1 | cut -d '-' -f 1 )
+ local q1; q1=$(echo $1 | cut -s -d '-' -f 2- )
+ local v2; v2=$(echo $2 | cut -d '-' -f 1 )
+ local q2; q2=$(echo $2 | cut -s -d '-' -f 2- )
+ if [ "$v1" = "$v2" ]; then
+ if [ "$q1" = "$q2" ]; then
+ return 1
+ else
+ if [ -z "$q1" ]; then
+ return 1
+ else
+ if [ -z "$q2" ]; then
+ return 0
+ else
+ [ "$q1" = "`echo -e "$q1\n$q2" | sort -V | head -n1`" ]
+ fi
+ fi
+ fi
+ else
+ [ "$v1" = "`echo -e "$v1\n$v2" | sort -V | head -n1`" ]
+ fi
+}
+
+# returns a plugin version from a plugin archive
+get_plugin_version() {
+ local archive; archive=$1
+ local version; version=$(unzip -p $archive META-INF/MANIFEST.MF | grep "^Plugin-Version: " | sed -e 's#^Plugin-Version: ##')
+ version=${version%%[[:space:]]}
+ echo $version
+}
+
+# Copy files from /usr/share/jenkins/ref into $JENKINS_HOME
+# So the initial JENKINS-HOME is set with expected content.
+# Don't override, as this is just a reference setup, and use from UI
+# can then change this, upgrade plugins, etc.
+copy_reference_file() {
+ f="${1%/}"
+ b="${f%.override}"
+ rel="${b:23}"
+ version_marker="${rel}.version_from_image"
+ dir=$(dirname "${b}")
+ local action;
+ local reason;
+ local container_version;
+ local image_version;
+ local marker_version;
+ local log; log=false
+ if [[ ${rel} == plugins/*.jpi ]]; then
+ container_version=$(get_plugin_version $JENKINS_HOME/${rel})
+ image_version=$(get_plugin_version ${f})
+ if [[ -e $JENKINS_HOME/${version_marker} ]]; then
+ marker_version=$(cat $JENKINS_HOME/${version_marker})
+ if versionLT $marker_version $container_version; then
+ action="SKIPPED"
+ reason="Installed version ($container_version) has been manually upgraded from initial version ($marker_version)"
+ log=true
+ else
+ if [[ "$image_version" == "$container_version" ]]; then
+ action="SKIPPED"
+ reason="Version from image is the same as the installed version $image_version"
+ else
+ if versionLT $image_version $container_version; then
+ action="SKIPPED"
+ log=true
+ reason="Image version ($image_version) is older than installed version ($container_version)"
+ else
+ action="UPGRADED"
+ log=true
+ reason="Image version ($image_version) is newer than installed version ($container_version)"
+ fi
+ fi
+ fi
+ else
+ if [[ -n "$TRY_UPGRADE_IF_NO_MARKER" ]]; then
+ if [[ "$image_version" == "$container_version" ]]; then
+ action="SKIPPED"
+ reason="Version from image is the same as the installed version $image_version (no marker found)"
+ # Add marker for next time
+ echo $image_version > $JENKINS_HOME/${version_marker}
+ else
+ if versionLT $image_version $container_version; then
+ action="SKIPPED"
+ log=true
+ reason="Image version ($image_version) is older than installed version ($container_version) (no marker found)"
+ else
+ action="UPGRADED"
+ log=true
+ reason="Image version ($image_version) is newer than installed version ($container_version) (no marker found)"
+ fi
+ fi
+ fi
+ fi
+ if [[ ! -e $JENKINS_HOME/${rel} || "$action" == "UPGRADED" || $f = *.override ]]; then
+ action=${action:-"INSTALLED"}
+ log=true
+ mkdir -p "$JENKINS_HOME/${dir:23}"
+ cp -r "${f}" "$JENKINS_HOME/${rel}";
+ # pin plugins on initial copy
+ touch "$JENKINS_HOME/${rel}.pinned"
+ echo $image_version > $JENKINS_HOME/${version_marker}
+ reason=${reason:-$image_version}
+ else
+ action=${action:-"SKIPPED"}
+ fi
+ else
+ if [[ ! -e $JENKINS_HOME/${rel} || $f = *.override ]]
+ then
+ action="INSTALLED"
+ log=true
+ mkdir -p "$JENKINS_HOME/${dir:23}"
+ cp -r "${f}" "$JENKINS_HOME/${rel}";
+ else
+ action="SKIPPED"
+ fi
+ fi
+ if [[ -n "$VERBOSE" || "$log" == "true" ]]; then
+ if [ -z "$reason" ]; then
+ echo "$action $rel" >> "$COPY_REFERENCE_FILE_LOG"
+ else
+ echo "$action $rel : $reason" >> "$COPY_REFERENCE_FILE_LOG"
+ fi
+ fi
+}
\ No newline at end of file