Last active
October 28, 2022 00:46
-
-
Save xbalaji/a51fcfe45b5d2cc27e0c8225c64f0af7 to your computer and use it in GitHub Desktop.
jenkins-utils-functions.sh
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# source this file and use the functions, download the jenkins-cli.jar first | |
export JENKINS_SERVER=localhost | |
export JENKINS_PORT=8080 | |
export JENKINS_USER='admin' | |
export JENKINS_PASS='admin' | |
export JENKINS_PROTO='http' | |
export JENKINS_JOBDIR="jenkins-jobs" | |
jenkins_urlhelp() { | |
echo "copy, change and paste for customization" | |
echo "export JENKINS_SERVER=${JENKINS_SERVER}" | |
echo "export JENKINS_PORT=${JENKINS_PORT}" | |
echo "export JENKINS_USER=${JENKINS_USER}" | |
echo "export JENKINS_PASS=${JENKINS_PASS}" | |
echo "export JENKINS_PROTO=${JENKINS_PROTO}" | |
echo "export JENKINS_JOBDIR=${JENKINS_JOBDIR}" | |
echo "export JENKINS_URL=\"http://\${JENKINS_SERVER}:\${JENKINS_PORT}\"" | |
} | |
jenkins_proto() { | |
echo $JENKINS_PROTO | |
} | |
jenkins_makeurl() { | |
echo "$(jenkins_proto)://${JENKINS_SERVER}:${JENKINS_PORT}" | |
} | |
jenkins_curlcreds() { | |
echo "-u ${JENKINS_USER}:${JENKINS_PASS}" | |
} | |
jenkins_get_clijar() { | |
JENKINS_URL=$(jenkins_makeurl) | |
echo "Jenkins URL: ${JENKINS_URL}" | |
wget ${JENKINS_URL}/jnlpJars/jenkins-cli.jar | |
} | |
jenkins_get_plugins() { | |
JENKINS_URL=$(jenkins_makeurl) | |
java -jar jenkins-cli.jar -s ${JENKINS_URL} groovy = <<<$(echo -e 'import jenkins.model.*\nJenkins.instance.pluginManager.plugins.each{plugin->println("${plugin.getShortName()}:${plugin.getVersion()}")}') | sort | |
} | |
jenkins_get_plugins2() { | |
JENKINS_URL=$(jenkins_makeurl) | |
java -jar jenkins-cli.jar -s ${JENKINS_URL} -webSocket list-plugins | cut -d " " -f1 | sort > jenkins-plugin-list.txt | |
} | |
jenkins_create_user() { | |
JENKINS_URL=$(jenkins_makeurl) | |
java -jar jenkins-cli.jar -s ${JENKINS_URL} groovy = <<<$(echo -e 'jenkins.model.Jenkins.instance.securityRealm.createAccount("'$1'","'$2'")') | |
} | |
# usage: | |
# jenkins_set_system_envvar VIP_JOB_REMOVE True | |
# jenkins_set_system_envvar VIP_JOB_REMOVE NotTrue | |
# jenkins_set_system_envvar VIP_JOB_REMOVE "" | |
jenkins_set_system_envvar() { | |
JENKINS_URL=$(jenkins_makeurl) | |
java -jar jenkins-cli.jar -auth "${JENKINS_USER}:${JENKINS_PASS}" -s ${JENKINS_URL} groovy = <<<$(echo -e 'import jenkins.model.Jenkins\nJenkins.instance.getGlobalNodeProperties().add(new hudson.slaves.EnvironmentVariablesNodeProperty())\ndef envVars = Jenkins.instance.getGlobalNodeProperties()[0].getEnvVars()\nenvVars.put("'$1'","'$2'")') | |
} | |
# usage: jenkins_get_system_envvar VIP_JOB_REMOVE | |
jenkins_get_system_envvar() { | |
JENKINS_URL=$(jenkins_makeurl) | |
java -jar jenkins-cli.jar -auth "${JENKINS_USER}:${JENKINS_PASS}" -s ${JENKINS_URL} groovy = <<<$(echo -e 'import jenkins.model.Jenkins\nJenkins.instance.getGlobalNodeProperties().add(new hudson.slaves.EnvironmentVariablesNodeProperty())\ndef envVars = Jenkins.instance.getGlobalNodeProperties()[0].getEnvVars()\nprintln("${envVars["'$1'"]}")') | |
} | |
jenkins_list_jobs2() { | |
JENKINS_URL=$(jenkins_makeurl) | |
JENKINS_JOBS=$(java -jar jenkins-cli.jar -s ${JENKINS_URL} -webSocket list-jobs) | |
count=1 | |
while IFS= read -r line | |
do | |
echo "jobnumber:${count}: ${line}" | |
count=$(expr $count + 1) | |
done <<< "${JENKINS_JOBS}" | |
} | |
jenkins_list_jobs() { | |
JENKINS_URL=$(jenkins_makeurl) | |
JENKINS_CRUMB=$(curl -skLS $(jenkins_curlcreds) --cookie-jar ./_jenkins_crumb_cookie "${JENKINS_URL}/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\":\",//crumb)") | |
curl -skLS $(jenkins_curlcreds) --cookie ./_jenkins_crumb_cookie -H ${JENKINS_CRUMB} -H "content-type:application/xml" "${JENKINS_URL}/api/json?pretty=true" | jq -r '.jobs[].name' | |
rm -f _jenkins_crumb_cookie | |
} | |
jenkins_save_job() { | |
[[ -z ${1} ]] && echo "no job name given, returning" && return 1 | |
JENKINS_URL=$(jenkins_makeurl) | |
java -jar jenkins-cli.jar -s ${JENKINS_URL} -webSocket get-job "${1}" < /dev/null > "./${1}.xml" | |
} | |
jenkins_save_jobs() { | |
JENKINS_URL=$(jenkins_makeurl) | |
JENKINS_JOBS=$(java -jar jenkins-cli.jar -s ${JENKINS_URL} -webSocket list-jobs) | |
count=1 | |
mkdir -p ${JENKINS_JOBDIR} | |
while IFS= read -r jobname | |
do | |
java -jar jenkins-cli.jar -s ${JENKINS_URL} -webSocket get-job "${jobname}" < /dev/null > "${JENKINS_JOBDIR}/${jobname}.xml" | |
count=$(expr $count + 1) | |
done <<< "${JENKINS_JOBS}" | |
} | |
jenkins_create_jobs() { | |
JENKINS_URL=$(jenkins_makeurl) | |
JENKINS_JOB_FILES=$(find ${JENKINS_JOBDIR} -maxdepth 1 -type f -name "*.xml" -print) | |
echo "${JENKINS_JOB_FILES}" | |
while IFS= read -r filename | |
do | |
jobname=$(basename "${filename%.*}") | |
echo "filename: ${filename}, jobname: ${jobname}" | |
java -jar jenkins-cli.jar -s ${JENKINS_URL} -webSocket create-job "${jobname}" < "${filename}" | |
done <<< "${JENKINS_JOB_FILES}" | |
} | |
jenkins_create_credentials() { | |
JENKINS_URL=$(jenkins_makeurl) | |
JENKINS_CRUMB=$(curl -skLS $(jenkins_curlcreds) --cookie-jar ./_jenkins_crumb_cookie "${JENKINS_URL}/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\":\",//crumb)") | |
cat > _jenkins_creds.xml <<EOF | |
<com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl> | |
<scope>GLOBAL</scope> | |
<id>github-access</id> | |
<description>Github access credentials</description> | |
<username>${1}</username> | |
<password>${2}</password> | |
</com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl> | |
EOF | |
curl -skLS $(jenkins_curlcreds) --cookie ./_jenkins_crumb_cookie -H ${JENKINS_CRUMB} -H "content-type:application/xml" "${JENKINS_URL}/credentials/store/system/domain/_/createCredentials" -d @_jenkins_creds.xml | |
rm -f _jenkins_creds.xml _jenkins_crumb_cookie | |
} | |
jenkins_get_job_xml() { | |
[[ -z ${1} ]] && echo "no job name given, returning" && return 1 | |
JENKINS_URL=$(jenkins_makeurl) | |
JENKINS_CRUMB=$(curl -skLS $(jenkins_curlcreds) --cookie-jar ./_jenkins_crumb_cookie "${JENKINS_URL}/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\":\",//crumb)") | |
curl -skLS $(jenkins_curlcreds) --cookie ./_jenkins_crumb_cookie -H ${JENKINS_CRUMB} "${JENKINS_URL}/job/${1}/api/xml" | |
rm -f _jenkins_crumb_cookie | |
} | |
jenkins_get_job() { | |
[[ -z ${1} ]] && echo "no job name given, returning" && return 1 | |
JENKINS_URL=$(jenkins_makeurl) | |
JENKINS_CRUMB=$(curl -skLS $(jenkins_curlcreds) --cookie-jar ./_jenkins_crumb_cookie "${JENKINS_URL}/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\":\",//crumb)") | |
curl -skLS $(jenkins_curlcreds) --cookie ./_jenkins_crumb_cookie -H ${JENKINS_CRUMB} "${JENKINS_URL}/job/${1}/api/json" | jq '.' | |
rm -f _jenkins_crumb_cookie | |
} | |
jenkins_get_job_params() { | |
[[ -z ${1} ]] && echo "no job name given, returning" && return 1 | |
jenkins_get_job ${1} | jq '.property[]|select(.parameterDefinitions)|.parameterDefinitions[].name' | \ | |
gawk 'BEGIN {print "parameter: "} {printf(" - name: %s\n value: \"${%s}\"\n", $0, gensub(/[^[:alnum:]]/, "", "g", $0))}' > "${1}-params.yml" | |
} | |
jenkins_internal_run_job() { | |
echo "jenkins_run_job: $1" | |
JENKINS_URL=$(jenkins_makeurl) | |
JENKINS_CRUMB=$(curl -skLS $(jenkins_curlcreds) --cookie-jar ./_jenkins_crumb_cookie "${JENKINS_URL}/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\":\",//crumb)") | |
curl -skLS $(jenkins_curlcreds) --cookie ./_jenkins_crumb_cookie -H ${JENKINS_CRUMB} "${JENKINS_URL}/job/${1}/build" | |
rm -f _jenkins_crumb_cookie | |
} | |
jenkins_internal_run_job_params() { | |
[[ -z ${1} ]] && echo "no job name given, returning" && return 1 | |
[[ -z ${2} ]] && echo "no parameter file given, returning" && return 2 | |
tmpYml2Json="${2%.*}.json" | |
yq '.' "${2}" > $tmpYml2Json | |
JENKINS_URL=$(jenkins_makeurl) | |
JENKINS_CRUMB=$(curl -skLS $(jenkins_curlcreds) --cookie-jar ./_jenkins_crumb_cookie "${JENKINS_URL}/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\":\",//crumb)") | |
curl -skLS $(jenkins_curlcreds) -XPOST --cookie ./_jenkins_crumb_cookie -H ${JENKINS_CRUMB} "${JENKINS_URL}/job/${1}/build" --data-urlencode json@"${tmpYml2Json}" | |
rm -f _jenkins_crumb_cookie $tmpYml2Json | |
unset tmpYml2Json JENKINS_URL JENKINS_CRUMB | |
} | |
jenkins_internal_run_job_usage() { | |
PRG_NAME=$(basename $BASH_SOURCE) | |
echo "${PRG_NAME} [-h][-n][-j <job>] [-p <params.json>]" | |
echo " -h: print this help information " | |
echo " -n: dry run, print what values will be used" | |
echo " -j: job name to run" | |
echo " -p: parameters for the job to run" | |
echo " -g: generate parameter, run job without parameters" | |
unset PRG_NAME | |
} | |
jenkins_run_job() { | |
OPTIND=1 | |
while getopts ":hngj:p:" opt "$@" | |
do | |
case "${opt}" in | |
h ) jenkins_internal_run_job_usage && return 0 ;; | |
g ) GEN_PARAMS=1;; | |
j ) JOB_NAME="${OPTARG}" ;; | |
p ) PARAMS_FILE="${OPTARG}" ;; | |
n ) DRY_RUN=1;; | |
* ) jenkins_internal_run_job_usage && return 0;; | |
esac | |
done | |
shift $((OPTIND -1)) | |
[[ ${JOB_NAME} && -z ${GEN_PARAMS} && -z ${PARAMS_FILE} ]] && PARAMS_FILE="${JOB_NAME}-params.json" | |
[[ ${JOB_NAME} && -z ${GEN_PARAMS} && ! -f ${PARAMS_FILE} ]] && echo "${PARAMS_FILE} not present" && return 2 | |
[[ ${DRY_RUN} ]] && echo "Dry run set: ${DRY_RUN}" | |
[[ ${DRY_RUN} ]] && echo && echo "*** --- parameters --- ***" | |
[[ ${DRY_RUN} && ${GEN_PARAMS} ]] && echo "Generate parameters set: ${GEN_PARAMS}" | |
[[ ${DRY_RUN} && ${JOB_NAME} ]] && echo "Jobname set: ${JOB_NAME}" | |
[[ ${DRY_RUN} && ${PARAMS_FILE} ]] && echo "Params file: ${PARAMS_FILE}" | |
[[ ${DRY_RUN} ]] && return 1 | |
# if there no parameter list the jobs | |
[[ -z ${JOB_NAME} ]] && jenkins_list_jobs | |
# job without parameter | |
[[ ${JOB_NAME} && ${GEN_PARAMS} ]] && jenkins_internal_run_job "${JOB_NAME}" | |
# job with parameter | |
[[ ${JOB_NAME} && -z ${GEN_PARAMS} ]] && jenkins_internal_run_job_params "${JOB_NAME}" "${PARAMS_FILE}" | |
unset GEN_PARAMS JOB_NAME PARAMS_FILE DRY_RUN | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment