#!/bin/bash -eu # 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 -pr "${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 -pr "${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 }