Skip to content

Instantly share code, notes, and snippets.

@micw
Last active August 11, 2023 06:14
Show Gist options
  • Save micw/e80d739c6099078ce0f3 to your computer and use it in GitHub Desktop.
Save micw/e80d739c6099078ce0f3 to your computer and use it in GitHub Desktop.
Script to install one or more jenkins plugins including dependencies while jenkins is offline
#!/bin/bash
set -e
if [ $# -eq 0 ]; then
echo "USAGE: $0 plugin1 plugin2 ..."
exit 1
fi
plugin_dir=/var/lib/jenkins/plugins
file_owner=jenkins.jenkins
mkdir -p /var/lib/jenkins/plugins
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 https://updates.jenkins-ci.org/latest/${1}.hpi
return 0
fi
}
for plugin in $*
do
installPlugin "$plugin"
done
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
# without optionals
#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" | awk -F ':' '{ print $1 }' | tr '\n' ' ' )
# with optionals
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' | awk -F ':' '{ print $1 }' | tr '\n' ' ' )
for plugin in $deps; do
installPlugin "$plugin" 1 && changed=1
done
done
done
echo "fixing permissions"
chown ${file_owner} ${plugin_dir} -R
echo "all done"
@blontic
Copy link

blontic commented Nov 6, 2018

if you are using a file that contains the name of a plugin on each line you can use this command with the above script
./install_jenkins_plugin.sh $(echo $(cat plugins.txt))

@FilBot3
Copy link

FilBot3 commented Dec 27, 2018

@noroutine

For whoever searches for this, make sure you try jenkins rest api first

	curl -X POST \
		--data "<jenkins><install plugin='${name}@latest' /></jenkins>" \
		--header 'Content-Type: text/xml' \
		http://localhost:8080/pluginManager/installNecessaryPlugins

You should update your example to include the Crumb Issuer Header as well.

@wrossmann
Copy link

Jenkins' docker build has a script for this: https://github.com/jenkinsci/docker/blob/master/install-plugins.sh

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