127 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/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 -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
 | 
						|
} |