You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
jenkins-debian-glue/puppet/apply.sh

128 lines
4.7 KiB

#!/bin/bash
start_seconds=$(sed -e 's/^\([0-9]*\).*/\1/' < /proc/uptime)
[ -n "$start_seconds" ] && SECONDS="$(( $(sed -e 's/^\([0-9]*\).*/\1/' < /proc/uptime) - start_seconds))" || SECONDS="unknown"
if [ -r /var/lib/jenkins/config.xml ] ; then
echo "NOTE: Configuration file /var/lib/jenkins/config.xml exists already."
if [ "$1" == "--force" ] ; then
echo "Continuing execution as requested via --force."
else
echo "Exiting to avoid possible data loss. To force execution, run '$0 --force'" >&2
exit 1
fi
fi
# workaround for puppet's facter, which looks at `uname -m` (reporting e.g. aarch64)
# while `dpkg --print-architecture` reports arm64
FACTER_JDG_DEBIAN_ARCH="$(dpkg --print-architecture)"
export FACTER_JDG_DEBIAN_ARCH
if [ -z "${FACTER_JDG_DEBIAN_ARCH:-}" ] ; then
echo "Error reporting Debian architecture (via 'dpkg --print-architecture')" >&2
exit 1
fi
if ! [ -r jenkins_debian_glue.pp ] ; then
wget https://raw.github.com/mika/jenkins-debian-glue/master/puppet/jenkins_debian_glue.pp
fi
if ! [ -r jenkins_debian_glue.pp ] ; then
echo "Error: can not find jenkins_debian_glue.pp." >&2
echo "Make sure to fetch e.g. https://raw.github.com/mika/jenkins-debian-glue/master/puppet/jenkins_debian_glue.pp" >&2
exit 1
fi
if ! type puppet &>/dev/null ; then
apt-get update
apt-get -y install puppet || exit 1
fi
# Amazon EC2 returns the internal IP by default, so ask about the public one
IP=$(facter ec2_public_ipv4 2>/dev/null) # curl http://169.254.169.254/latest/meta-data/public-ipv4
# 'facter ec2_public_ipv4' returns nothing on Debian's AMI :(
if [ -z "$IP" ] ; then
IP=$(wget --quiet --tries=3 --timeout=3 -O - http://169.254.169.254/latest/meta-data/public-ipv4 2>/dev/null)
fi
# try Google Compute Engine
if [ -z "$IP" ] ; then
IP=$(wget --quiet --tries=3 --timeout=3 -O - "http://metadata/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip" --header "X-Google-Metadata-Request: True" 2>/dev/null)
fi
# neither using EC2 nor GCE? use a fallback then
if [ -z "$IP" ] ; then
# shellcheck disable=SC2046
IP=$(ip addr show dev "$(route -n | awk '/^0\.0\.0\.0/{print $NF}')" | awk '/inet / {print $2}' | head -1 | sed "s;/.*;;")
fi
if [[ "$(hostname -f 2>/dev/null)" == "" ]] ; then
echo "Error: please make sure you have a valid FQDN configured in /etc/hosts" >&2
echo "NOTE: Something like adding the following snippet to /etc/hosts might help:
$IP $(hostname).example.org $(hostname)
"
exit 1
fi
if dpkg --compare-versions "$(dpkg-query -f "\${Version}\n" -W dpkg 2>/dev/null)" ge '1.17.11' 2>/dev/null ; then
package_check() {
local package="$1"
[ "$(dpkg-query -f "\${db:Status-Status} \${db:Status-Eflag}" -W "$package" 2>/dev/null)" = 'installed ok' ]
}
else # dpkg versions older than 1.17.11 (e.g. Debian/wheezy) don't support db:Status* flags, so fall back then
package_check() {
local package="$1"
dpkg --list "$package" 2>/dev/null | grep -q '^.i'
}
fi
package_installed() {
local packages="$*"
for package in $packages ; do
if ! package_check "$package" ; then
return 1
fi
done
}
if puppet apply jenkins_debian_glue.pp ; then
if ! package_installed jenkins jenkins-debian-glue; then
echo "While puppet reported a successful run, jenkins and/or jenkins-debian-glue aren't successfully installed. :(" >&2
echo "Please re-execute this script and if the problem persists please report this at" >&2
echo "https://github.com/mika/jenkins-debian-glue/issues" >&2
exit 1
fi
[ -n "$start_seconds" ] && SECONDS="$(( $(sed -e 's/^\([0-9]*\).*/\1/' < /proc/uptime) - start_seconds))" || SECONDS="unknown"
echo "jenkins-debian-glue deployment finished after ${SECONDS} seconds."
else
echo "Fatal error during puppet run. :(" >&2
exit 1
fi
echo "
NOTE: if you should notice failing Jenkins jobs, this might be related to
incomplete Jenkins plugin dependencies (see
https://github.com/jenkinsci/puppet-jenkins/issues/64 +
https://github.com/jenkinsci/puppet-jenkins/issues/12 for details why we
can't easily automate that yet).
Take care by following the Jenkins setup wizard, to unlock your Jenkins system
and also install the suggested plugins within the setup wizard, to do so visit
http://${IP}:8080
IMPORTANT: You also need to manually install the 'Copy Artifact' Jenkins plugin,
visit http://${IP}:8080/manage/pluginManager/available
If building the jenkins-debian-glue* Jenkins jobs should still fail,
ensure that the Jenkins server was restarted ('sudo systemctl restart jenkins'),
and also rebuild the jenkins-debian-glue* Jenkins jobs after taking care of
the plugin situation mentioned above, by running:
sudo puppet apply ./jenkins_debian_glue.pp
Enjoy your Jenkins setup."