#!/bin/ksh # 2021-04-07 Olaf Bohlen <olbohlen@eenfach.de> # 2021-11-30 Till Wegmueller <toasterson@gmail.com> # instead of putting all this into the Jenkinsfile I decided to put the actual code in this script set -ex # global config HTTPCONF="/etc/apache2/2.4/conf.d/pkgdepotd.conf" # just run prepare once to initially set up the environment # this must be run as root prepare() { echo "jenkinshelper: preparing..." pkg install web/server/apache-24 mkdir -p /etc/apache2/2.4/conf.d && chown root:sys /etc/apache2/2.4/conf.d grep "#ProxyPassMatch /default/(.*)\$ http://127.0.0.1:10000/\$1 nocanon max=200" "${HTTPCONF}" >/dev/null 2>&1 if [ $? -gt 0 ]; then echo "jenkinshelper: Initializing a new apache config at ${HTTPCONF}" echo "#ProxyPassMatch /default/(.*)\$ http://127.0.0.1:10000/\$1 nocanon max=200" >"${HTTPCONF}" else echo "jenkinshelper: Preserving an existing ${HTTPCONF}" fi cat >/etc/apache2/2.4/conf.d/00-proxy.conf <<EOF LoadModule proxy_module libexec/mod_proxy.so LoadModule proxy_connect_module libexec/mod_proxy_connect.so LoadModule proxy_ftp_module libexec/mod_proxy_ftp.so LoadModule proxy_http_module libexec/mod_proxy_http.so LoadModule proxy_ajp_module libexec/mod_proxy_ajp.so ProxyRequests Off ProxyVia Off ProxyPreserveHost on RequestHeader unset Origin AllowEncodedSlashes NoDecode EOF chown root:builders "${HTTPCONF}" chmod 664 "${HTTPCONF}" svcadm enable svc:/network/http:apache24 } # setup oi-userland stage_setup() { if [ ! -f /etc/apache2/2.4/conf.d/00-proxy.conf ]; then echo "jenkinshelper: aborting, please run \"jenkinshelper -p\" initially as root on this jenkins instance once" exit 1 fi echo "jenkinshelper: running gmake setup" gmake setup } # scan the git log for changed components # we try to be smart and assume that all updates will always touch # the components Makefile also (to update COMPONENT_REVISION, etc) stage_build_changed() { worst=0 for f in $(git diff --name-only HEAD..origin/oi/hipster | grep Makefile; exit 0); do echo "jenkinshelper: building for ${f%/*}..." curpwd=$(pwd) cd "${f%/*}" && gmake clean && gmake PARALLEL_JOBS=$(psrinfo -t -c) publish rc=$? cd "${curpwd}" echo "jenkinshelper: done with ${f%/*} return code ${rc}" if [ rc -ne 0 ] ; then worst=$rc fi done return $worst } # prepare the pkg.depotd server instance, if an instance already # exists for this branch, we will use that - otherwise create a # fresh one stage_prepare_pkgdepotd() { # we need the platform for the path to the repo platform=$(uname -p) # check if we already have this branch set up as a pkg.depotd: if ! svcs "pkg/server:${BRANCH_NAME}" >/dev/null 2>&1; then # get highest port from ${HTTPCONF} to figure out the next free one nextport=$(($(nawk -F '[/:]' '{ print $7 }' <"${HTTPCONF}" | sort -n | tail -1) + 1)) # set-up a new pkg/server instance svccfg -s pkg/server <<EOF add ${BRANCH_NAME} select ${BRANCH_NAME} addpg pkg application setprop pkg/port=${nextport} setprop pkg/readonly=true setprop pkg/pkg_root=/ setprop pkg/inst_root=${WORKSPACE}/${platform}/repo setprop pkg/proxy_base=${JENKINS_URL%:[0-9]*/}/${BRANCH_NAME}/ end EOF # enable the new pkg/server instance svcadm enable pkg/server:${BRANCH_NAME} # add the new proxy rule to our apache config echo "ProxyPassMatch /${BRANCH_NAME}/(.*)\$ http://127.0.0.1:${nextport}/\$1 nocanon max=200" >>"${HTTPCONF}" fi # we need to refresh the repo: pkgrepo refresh -s ${WORKSPACE}/${platform}/repo # also restarting pkg.depotd does not hurt svcadm restart pkg/server:${BRANCH_NAME} # graceful restart apache to reload config svcadm refresh svc:/network/http:apache24 } # cleanup the pkg.depotd server instance stage_cleanup_pr() { # we need the platform for the path to the repo platform=$(uname -p) if ! "svcs pkg/server:${BRANCH_NAME}" >/dev/null 2>&1; then # disable the instance svcadm disable pkg/server:${BRANCH_NAME} # svcadm is a async operation thus sleep here sleep 1 # remove instance from SMF svccfg delete pkg/server:${BRANCH_NAME} # Remove apache port sed "/^ProxyPassMatch /${BRANCH_NAME}/d" # graceful restart apache to reload config svcadm refresh svc:/network/http:apache24 fi } usage() { cat <<EOF Usage: jenkinshelper.ksh [ -h | -p | -s <stage> ] -h show this help -p run only ONCE to initialize your environment -s followed by the stage to run, currently: setup, build_changed, prepare_pkgdepotd EOF exit 0 } ## MAIN ## # call this script with the stage as an argument to -s while getopts s:hp argv; do case ${argv} in s) stage="stage_${OPTARG}" ;; p) stage="prepare" ;; h) usage ;; esac done shift $(expr ${OPTIND} - 1) # run requested stage rt=0 ${stage} || rt=$? # we are done exit ${rt}