Script to automaticaly install plugins in Jenkins.
Below a script to automaticaly install plugins in Jenkins.
#!/bin/bash
#
readonly PROGNAME=$(basename $0)
readonly PROGDIR=$(readlink -m $(dirname $0))
readonly ARGS="$@"
#
# Get up to date JSON file of stable plugins
#
get_update_center() {
echo "Fetching JSON from update center"
# fetch up to date update center
$CURL_CMD http://updates.jenkins-ci.org/stable/update-center.json -o $PLUGIN_TEMPDIR/update-center.json
# cleanup json
sed -i 's|updateCenter.post(||g' $PLUGIN_TEMPDIR/update-center.json
sed -i 's|);||g' $PLUGIN_TEMPDIR/update-center.json
}
#
# Fetch and install plugin
#
fetch_plugin()
{
local DEP_LOOP
local DEPENDENCIES
local DEPENDENCY
local URL
local VERSION
local SFILENAME
local FFILENAME
local PPLUGIN
local OPTIONALP
local FPLUGIN=$1
if [ ! -z "$EXCLUDED_PLUGINS" ]; then
for PPLUGIN in $EXCLUDED_PLUGINS
do
if [ "$FPLUGIN" = "$PPLUGIN" ]; then
echo "$FPLUGIN is already provided, exiting"
return
fi
done
fi
URL=`cat $PLUGIN_TEMPDIR/update-center.json | python -c "import sys, json; print json.load(sys.stdin)[\"plugins\"][\"$FPLUGIN\"][\"url\"]"`
VERSION=`cat $PLUGIN_TEMPDIR/update-center.json | python -c "import sys, json; print json.load(sys.stdin)[\"plugins\"][\"$FPLUGIN\"][\"version\"]"`
SFILENAME=`basename $URL | sed -e "s|.hpi|.jpi|g"`
FFILENAME=`basename $URL | sed -e "s|.hpi|-$VERSION.jpi|g"`
INCLUDEDPLUGINS="$INCLUDEDPLUGINS$FPLUGIN:$VERSION\n"
if [ ! -f $PLUGIN_TEMPDIR/$FFILENAME ]; then
echo "Downloading $FPLUGIN"
$CURL_CMD $URL -o $PLUGIN_TEMPDIR/$FFILENAME
fi
cp $PLUGIN_TEMPDIR/$FFILENAME $PLUGINS_DIR/$SFILENAME
DEPENDENCIES=`cat $PLUGIN_TEMPDIR/update-center.json | python -c "import sys, json; print json.load(sys.stdin)[\"plugins\"][\"$FPLUGIN\"][\"dependencies\"]"`
if [ "$DEPENDENCIES" != "[]" ]; then
for DEP_LOOP in 0 1 2 3 4 5 6 7 8 9 10; do
DEPENDENCY=`cat $PLUGIN_TEMPDIR/update-center.json | python -c "import sys, json; print json.load(sys.stdin)[\"plugins\"][\"$FPLUGIN\"][\"dependencies\"][$DEP_LOOP][\"name\"]" 2>/dev/null || true`
# No more dependency, exit loop
if [ "$DEPENDENCY" = "" ]; then
break;
fi
OPTIONALP=`cat $PLUGIN_TEMPDIR/update-center.json | python -c "import sys, json; print json.load(sys.stdin)[\"plugins\"][\"$FPLUGIN\"][\"dependencies\"][$DEP_LOOP][\"optional\"]" 2>/dev/null|| true`
# Don't fetch optional dependencies
if [ "$OPTIONALP" = "True" ]; then
echo "$DEPENDENCY plugin is optional, it won't be included"
continue;
fi
fetch_plugin $DEPENDENCY
done
fi
}
usage() {
cat <<- EOF
usage: $PROGNAME options
Install or update Jenkins Plugins.
OPTIONS:
-p --plugins file containing plugins list
-x --xplugins file containing excluded plugins list
-d --plugindir directory where to deploy plugins (.jpi)
Examples:
Run:
$PROGNAME --plugins okplugins --excludedplugins nokplugins --plugindir /var/lib/myjenkins/plugins
EOF
exit 1
}
#
# Parse command line
#
cmdline() {
# got this idea from here:
# http://kirk.webfinish.com/2009/10/bash-shell-script-to-use-getopts-with-gnu-style-long-positional-parameters/
local arg=
for arg
do
local delim=""
case "$arg" in
#translate --gnu-long-options to -g (short options)
--plugins) args="${args}-p ";;
--xplugins) args="${args}-e ";;
--plugindir) args="${args}-d ";;
--help) args="${args}-h ";;
--verbose) args="${args}-v ";;
--debug) args="${args}-x ";;
#pass through anything else
*) [[ "${arg:0:1}" == "-" ]] || delim="\""
args="${args}${delim}${arg}${delim} ";;
esac
done
#Reset the positional parameters to the short options
eval set -- $args
while getopts "hvxp:e:d:" OPTION
do
case $OPTION in
v)
readonly VERBOSE=1
;;
x)
readonly DEBUG='-x'
set -x
;;
h)
usage
exit 0
;;
p)
readonly PLUGINS_FILE=$OPTARG
;;
e)
readonly EXCLUDED_PLUGINS_FILE=$OPTARG
;;
d)
readonly PLUGINS_DIR=$OPTARG
;;
esac
done
if [ -z "$PLUGINS_FILE" ]; then
echo "You must provide plugin file"
usage
fi
if [ -z "$PLUGINS_DIR" ]; then
echo "You must provide plugin directory"
usage
fi
readonly PLUGINS=`cat $PLUGINS_FILE`
if [ ! -z "$EXCLUDED_PLUGINS_FILE" ]; then
readonly EXCLUDED_PLUGINS=`cat $EXCLUDED_PLUGINS_FILE`
fi
if [ "$VERBOSE" = "1" ]; then
CURL_CMD="curl -L"
else
CURL_CMD="curl -L --silent"
fi
if [ "$DEBUG" = "-x" ]; then
CURL_CMD="$CURL_CMD -v"
fi
}
main() {
cmdline $ARGS
readonly PLUGIN_TEMPDIR=`mktemp -d /tmp/batchjpi.XXXXXXX`
get_update_center
for PLUGIN in $PLUGINS
do
echo "Fetching plugin $PLUGIN and dependencies"
fetch_plugin $PLUGIN
done
rm -rf $PLUGIN_TEMPDIR
}
main
Create a plugins.txt
...
jdk-tool
script-security
command-launcher
cloudbees-folder
bouncycastle-api
structs
...