Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@chuxau
Forked from micw/install_jenkins_plugin.sh
Last active January 21, 2022 09:21
Show Gist options
  • Star 21 You must be signed in to star a gist
  • Fork 19 You must be signed in to fork a gist
  • Save chuxau/6bc42f0f271704cd4e91 to your computer and use it in GitHub Desktop.
Save chuxau/6bc42f0f271704cd4e91 to your computer and use it in GitHub Desktop.
#!/bin/bash
set -e
UPDATES_URL="http://updates.jenkins-ci.org/download/plugins/"
if [ $# -lt 2 ]; then
echo "USAGE: $0 plugin-list-file destination-directory"
exit 1
fi
plugin_list=$1
plugin_dir=$2
#file_owner=jenkins.jenkins
mkdir -p $plugin_dir
installPlugin() {
if [ -f ${plugin_dir}/${1}.hpi -o -f ${plugin_dir}/${1}.jpi ]; then
if [ "$2" == "1" ]; then
return 1
fi
echo "Skipped: $1 (already installed)"
return 0
else
echo "Installing: $1"
curl -L --silent --output ${plugin_dir}/${1}.hpi ${UPDATES_URL}/${1}/${2}/${1}.hpi
return 0
fi
}
while IFS="|" read plugin version
do
#escape comments
if [[ $plugin =~ ^# ]]; then
continue
fi
#install the plugin
installPlugin $plugin $version
done < $plugin_list
changed=1
maxloops=100
while [ "$changed" == "1" ]; do
echo "Check for missing dependecies ..."
if [ $maxloops -lt 1 ] ; then
echo "Max loop count reached - probably a bug in this script: $0"
exit 1
fi
((maxloops--))
changed=0
for f in ${plugin_dir}/*.hpi ; do
# get a list of only non-optional dependencies
deps=$( unzip -p ${f} META-INF/MANIFEST.MF|tr -d '\r' | sed -e ':a;N;$!ba;s/\n //g' | grep -e 'Plugin-Dependencies' | awk '{print $2}' | tr "," "\n" | grep -v 'resolution:=optional')
#if deps were found, install them .. then set changed, so we re-loop all over all xpi's
if [[ ! -z $deps ]]; then
echo $deps | tr ' ' '\n' |
while IFS=: read plugin version; do
installPlugin $plugin $version
done
changed=1
fi
done
done
#echo "fixing permissions"
#chown ${file_owner} ${plugin_dir} -R
echo "all done"
@Nuxij
Copy link

Nuxij commented Nov 5, 2016

Thank you for including the UPDATES_URL instead of leaving it to be populated by the environment!

@vitaminmoo
Copy link

Note that the set -e breaks dep resolution in the event that a plugin without deps ends up first in the plugins directory because the unzip pipe fails. You can either turn off set -e, or add ||true to the end of the unzip pipeline.

@dgeissl
Copy link

dgeissl commented Jun 9, 2017

just as a hint, if you want to use that on windows (or write the listing there) make sure the file containing the plugins has unix style line endings otherwise you will get wired errors from curl that the url contains incorrect characters (the carriage return screws the url string).

@dmacsuibhne
Copy link

For me it seems that the last line in the plugin list file is ignored, the workaround is simply to end your plugin list file with a blank line.

@oldendick
Copy link

On my mac, with BSD sed, I had to change the sed command to this:

sed -e ':a' -e 'N' -e '$!ba' -e 's/\n //g'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment