#!/bin/bash # Initialize script variables SOURCE_SPECS=() SOURCE_SPECS_ISO=() REMASTER_SPECS=() REMASTER_SPECS_ISO=() REMASTER_TAR_SPECS=() REMASTER_TAR_SPECS_TAR=() # ISO TAG is instead used as part of the images push # to our mirror. It is always "DAILY" but it gets a special # meaning for monthly releases. ISO_TAG="DAILY" OLD_ISO_TAG="" # used to remove OLD ISO images the local dir DISTRO_NAME="Sabayon_Linux" ISO_DIR="daily" CHANGELOG_DATES="" DAILY_TMPDIR= LOG_FILE= PULL_SKIP=0 EMAIL_SKIP=0 EXPORT_SKIP=0 # We set our own stuff, do not inherit from env unset PORTDIR PORTAGE_TMPDIR # Path to molecules.git dir SABAYON_MOLECULE_HOME="${SABAYON_MOLECULE_HOME:-/sabayon}" export SABAYON_MOLECULE_HOME # setup default language, cron might not do that export LC_ALL="en_US.UTF-8" export LANG="en_US.UTF-8" export LANGUAGE="en_US.UTF-8" # Set variable for equo command export ETP_NONINTERACTIVE=1 # Use /var/cache/molecule instead of /var/tmp # Because systemd may decide to reap it. # Molecule supports MOLECULE_TMPDIR export MOLECULE_TMPDIR="${MOLECULE_TMPDIR:-/var/cache/molecule}" # Sabayon Server Stuff SABAYON_SERVER="${SABAYON_SERVER:-entropy@pkg.sabayon.org}" SABAYON_SERVER_DIR="${SABAYON_SERVER_DIR:-/sabayon/rsync}" SABAYON_RSYNC_SERVER="${SABAYON_RSYNC_SERVER:-rsync.sabayon.org}" SABAYON_DOCKER_SRC_IMAGE=${SABAYON_DOCKER_SRC_IMAGE:-sabayon/spinbase-amd64:latest} SABAYON_UNDOCKER_OUTPUTDIR=${SABAYON_UNDOCKER_OUTPUTDIR:-${SABAYON_MOLECULE_HOME}/sources/amd64-docker-spinbase} # Custom options SABAYON_KERNEL_VERSION=${SABAYON_KERNEL_VERSION:-4.14} export SABAYON_KERNEL_VERSION build_info () { echo " DO_PUSH = ${DO_PUSH} DO_PUSHONLY = ${DO_PUSHONLY} DO_SLEEPNIGHT = ${DO_SLEEPNIGHT} EMAIL_SKIP = ${EMAIL_SKIP} PULL_SKIP = ${PULL_SKIP} EXPORT_SKIP = ${EXPORT_SKIP} SKIP_DEV = ${SKIP_DEV} SKIP_DOCKER_RMI = ${SKIP_DOCKER_RMI} ONLY_DEV = ${ONLY_DEV} LOG_FILE = ${LOG_FILE} LIST_IMAGES = ${LIST_IMAGES[@]} SABAYON_KERNEL_VERSION = ${SABAYON_KERNEL_VERSION} SABAYON_SERVER = ${SABAYON_SERVER} SABAYON_SERVER_DIR = ${SABAYON_SERVER_DIR} SABAYON_RSYNC_SERVER = ${SABAYON_RSYNC_SERVER} SABAYON_DOCKER_SRC_IMAGE = ${SABAYON_DOCKER_SRC_IMAGE} SABAYON_UNDOCKER_OUTPUTDIR = ${SABAYON_UNDOCKER_OUTPUTDIR} SABAYON_EXTRA_PKGS = ${SABAYON_EXTRA_PKGS} MOLECULE_TMPDIR = ${MOLECULE_TMPDIR} SABAYON_ENMAN_REPOS = ${SABAYON_ENMAN_REPOS} " } get_iso_name () { local image=$1 if [ ${image} == "spinbase" ] ; then echo "SpinBase" elif [ ${image} == "gnome" ] ; then echo "GNOME" elif [ ${image} == "kde" ] ; then echo "KDE" elif [ ${image} == "mate" ] ; then echo "MATE" elif [ ${image} == "xfce" ] ; then echo "Xfce" elif [ ${image} == "minimal" ] ; then echo "Minimal" elif [ ${image} == "server" ] ; then echo "Server" elif [ ${image} == "lxqt" ] ; then echo "LXQt" fi } prepare_specs_tasks () { local isoname="" local image="" for i in ${!LIST_IMAGES[@]}; do image=${LIST_IMAGES[$i]} if [ ${image} == "tarball" ] ; then REMASTER_TAR_SPECS+=( "sabayon-amd64-spinbase-tarball-template.spec" ) REMASTER_TAR_SPECS_TAR+=( "${DISTRO_NAME}_${ISO_TAG}_amd64_tarball.tar.gz" ) elif [ ${image} == "spinbase" ] ; then isoname=$(get_iso_name ${LIST_IMAGES[$i]}) if [ ${ONLY_DEV} -eq 0 ] ; then SOURCE_SPECS+=( "sabayon-amd64-${LIST_IMAGES[$i]}.spec" ) SOURCE_SPECS_ISO+=( "${DISTRO_NAME}_${ISO_TAG}_amd64_${isoname}.iso" ) fi if [ ${SKIP_DEV} -eq 0 ] ; then SOURCE_SPECS+=( "sabayon-amd64-${LIST_IMAGES[$i]}-dev.spec" ) SOURCE_SPECS_ISO+=( "${DISTRO_NAME}_${ISO_TAG}_amd64_${isoname}-dev.iso" ) fi else isoname=$(get_iso_name ${LIST_IMAGES[$i]}) if [ ${ONLY_DEV} -eq 0 ] ; then REMASTER_SPECS+=( "sabayon-amd64-${LIST_IMAGES[$i]}.spec" ) REMASTER_SPECS_ISO+=( "${DISTRO_NAME}_${ISO_TAG}_amd64_${isoname}.iso" ) fi if [ ${SKIP_DEV} -eq 0 ] ; then REMASTER_SPECS+=( "sabayon-amd64-${LIST_IMAGES[$i]}-dev.spec" ) REMASTER_SPECS_ISO+=( "${DISTRO_NAME}_${ISO_TAG}_amd64_${isoname}-dev.iso" ) fi fi done } prepare_env () { local daily_release="$(date -u +%Y%m%d)" if [ ${CUSTOM_IMAGES} -eq 0 ] ; then if [ "${ACTION}" == "dailybase" ] ; then LIST_IMAGES+=( "spinbase" ) else LIST_IMAGES+=( "spinbase" "gnome" "kde" "mate" "xfce" "minimal" "server" "lxqt" "tarball" ) fi fi ############################################################# # ACTION: weekly / daily ############################################################# if [ "${ACTION}" = "weekly" ] || [ "${ACTION}" = "daily" ]; then SABAYON_RELEASE=${daily_release} export BUILDING_DAILY=1 prepare_specs_tasks # Weekly molecules if [ "${ACTION}" = "weekly" ]; then REMASTER_SPECS+=( "sabayon-amd64-xfceforensic.spec" ) REMASTER_SPECS_ISO+=( "${DISTRO_NAME}_${ISO_TAG}_amd64_ForensicsXfce.iso" ) fi ############################################################# # ACTION: dailybase ############################################################# elif [ "${ACTION}" = "dailybase" ] ; then SABAYON_RELEASE=${daily_release} export BUILDING_DAILY=1 local i=0 isoname=$(get_iso_name ${LIST_IMAGES[$i]}) if [ ${ONLY_DEV} -eq 0 ] ; then SOURCE_SPECS+=( "sabayon-amd64-${LIST_IMAGES[$i]}.spec" ) SOURCE_SPECS_ISO+=( "${DISTRO_NAME}_${ISO_TAG}_amd64_${isoname}.iso" ) fi if [ ${SKIP_DEV} -eq 0 ] ; then SOURCE_SPECS+=( "sabayon-amd64-${LIST_IMAGES[$i]}-dev.spec" ) SOURCE_SPECS_ISO+=( "${DISTRO_NAME}_${ISO_TAG}_amd64_${isoname}-dev.iso" ) fi ############################################################# # ACTION: monthly / release ############################################################# elif [ "${ACTION}" = "monthly" ] || [ "${ACTION}" = "release" ]; then if [ "${ACTION}" = "monthly" ] && [ -z "${SABAYON_RELEASE}" ]; then # always one month ahead SABAYON_RELEASE=$(/bin/date -u --date="$(/bin/date -u +%Y-%m-%d) +1 month" "+%y.%m") fi if [ -z "${SABAYON_RELEASE}" ]; then # release action must set this echo "SABAYON_RELEASE is not set, wtf?" >&2 exit 1 fi # Rewrite ISO_TAG to SABAYON_RELEASE ISO_TAG="${SABAYON_RELEASE}" if [ "${ACTION}" = "monthly" ]; then OLD_ISO_TAG=$(date -u --date="last month" +%y.%m) if [ -z "${OLD_ISO_TAG}" ]; then echo "Cannot set OLD_ISO_TAG, wtf?" >&2 exit 1 fi fi ISO_DIR="monthly" _previous_month=$(date -d "- 1 month" "+%Y-%m-%d") _current_month=$(date +%Y-%m-%d) CHANGELOG_DATES="${_previous_month} ${_current_month}" # Force skipping of dev ISO for monthly/release ISO. SKIP_DEV=1 prepare_specs_tasks fi # molecules are referencing ISO_TAG in their source_iso parameter export ISO_TAG # to make ISO remaster spec files working (pre_iso_script) and # make molecules grab a proper release version export SABAYON_RELEASE if [ -z "${LOG_FILE}" ] ; then # Create log dir if it does not exist mkdir -p /var/log/molecule || exit 1 LOG_FILE="/var/log/molecule/autobuild-${SABAYON_RELEASE}-pid-${$}-rnd-${RANDOM}.log" fi mkdir -p "${MOLECULE_TMPDIR}" || exit 1 mkdir -p ${SABAYON_MOLECULE_HOME}/iso || exit 1 } sleepnight() { if [ ${DO_SLEEPNIGHT} -eq 1 ]; then target_h=22 # 22pm current_h=$(date +%H) current_h=${current_h/0} # remove leading 0 delta_h=$(( target_h - current_h )) if [ ${current_h} -ge 0 ] && [ ${current_h} -le 6 ]; then # If it's past midnight and no later than 7am # just push echo "Just pusing out now" elif [ ${delta_h} -gt 0 ]; then delta_s=$(( delta_h * 3600 )) echo "Sleeping for ${delta_h} hours..." sleep ${delta_s} || exit 1 elif [ ${delta_h} -lt 0 ]; then # between 22 and 24, run! echo "I'm after 22pm, running" else echo "No need to sleep" fi fi } cleanup_on_exit() { if [ -n "${DAILY_TMPDIR}" ] && [ -d "${DAILY_TMPDIR}" ]; then #rm -rf "${DAILY_TMPDIR}" # don't care about races DAILY_TMPDIR="" fi } safe_run() { local done=0 local count="${1}" shift for ((i=0; i < ${count}; i++)); do "${@}" && { done=1; break; } if [ ${i} -le 3 ]; then sleep 10 || return 1 elif [ ${i} -le 6 ]; then sleep 600 || return 1 else sleep 1800 || return 1 fi done if [ "${done}" = "0" ]; then return 1 fi return 0 } remove_from_mirrors() { local path="${1}" local server=${SABAYON_SERVER} local ssh_dir=${SABAYON_SERVER_DIR} local ssh_path="${server}:${ssh_dir}" if [ -z "${path}" ]; then echo "remove_from_mirrors: no arguments passed" >&2 return 1 fi safe_run 10 ssh "${server}" \ rm -f "${ssh_dir}/${SABAYON_RSYNC_SERVER}/iso/${ISO_DIR}/${path}" } move_to_mirrors() { local do_push="${SABAYON_MOLECULE_HOME}"/DO_PUSH local server=${SABAYON_SERVER} local ssh_dir=${SABAYON_SERVER_DIR} local ssh_path="${server}:${ssh_dir}" if [ ${DO_PUSH} -eq 1 ] || [ -f "${do_push}" ]; then sleepnight rm -f "${do_push}" ( flock --timeout $((24 * 3600)) -x 9 if [ "${?}" != "0" ]; then echo "Timed out during move_to_mirrors lock contention" >&2 exit 1 fi safe_run 10 rsync -av --partial --bwlimit=8192 \ "${SABAYON_MOLECULE_HOME}"/iso_rsync/*"${ISO_TAG}"* \ "${ssh_path}/${SABAYON_RSYNC_SERVER}/iso/${ISO_DIR}" \ || exit 1 if [ "${ACTION}" = "monthly" ]; then mkdir -p "${SABAYON_MOLECULE_HOME}/iso_rsync/${ISO_DIR}" || exit 1 echo "${ISO_TAG}" > "${SABAYON_MOLECULE_HOME}/iso_rsync/${ISO_DIR}/LATEST_IS" || exit 1 safe_run 10 rsync -av --partial \ "${SABAYON_MOLECULE_HOME}/iso_rsync/${ISO_DIR}/LATEST_IS" \ "${ssh_path}/${SABAYON_RSYNC_SERVER}/iso/${ISO_DIR}/" \ || exit 1 fi if [ -n "${CHANGELOG_DATES}" ]; then safe_run 10 rsync -av --partial \ "${CHANGELOG_DIR}"/ \ "${ssh_path}/${SABAYON_RSYNC_SERVER}/iso/${ISO_DIR}/ChangeLogs/" fi safe_run 10 rsync -av --partial \ "${SABAYON_MOLECULE_HOME}"/scripts/gen_html \ "${ssh_path}"/iso_html_generator \ || exit 1 safe_run 10 ssh "${server}" \ "${ssh_dir}"/iso_html_generator/gen_html/gen.sh \ || exit 1 ) 9> /tmp/.iso_build.sh.move_to_mirrors.lock || return 1 return 0 fi } docker_clean() { # Best effort - cleaning orphaned containers docker ps -a -q | xargs -n 1 -I {} sudo docker rm {} # Best effort - cleaning orphaned images local images=$(docker images | grep '' | tr -s ' ' | cut -d ' ' -f 3) if [ -n "${images}" ]; then docker rmi ${images} fi } update_docker_companion() { local HOST_ARCH="amd64" if [[ ! `which docker-companion 2>/dev/null` ]] ; then [ `which ./docker-companion 2>/dev/null` ] || { echo >&2 "Fetching docker-companion for you..." curl -s https://api.github.com/repos/mudler/docker-companion/releases/latest \ | grep "browser_download_url.*${HOST_ARCH}" \ | cut -d : -f 2,3 \ | tr -d \" \ | wget -i - -N -O docker-companion chmod +x docker-companion } fi } export_docker_rootfs () { local docker_image=${1-${SABAYON_DOCKER_SRC_IMAGE}} local undocker_output_directory=${2-${SABAYON_UNDOCKER_OUTPUTDIR}} local opts="" if [[ -z "${PULL_SKIP}" || "${PULL_SKIP}" == "0" ]] ; then opts="--pull" fi echo "Checking if Docker is available, otherwise restarting it" systemctl show --property ActiveState docker | grep -q inactive && systemctl start docker echo "Building Spinbase with Docker image: "${docker_image} # Cleaning previous generation if [ -z "${undocker_output_directory}" ] || [ -z "${SABAYON_MOLECULE_HOME}" ]; then echo "SABAYON_MOLECULE_HOME or undocker_output_directory not set, this is bad" return 1 fi rm -rf "${undocker_output_directory}" local targetdir=${undocker_output_directory} echo "Exporting the Docker image ${docker_image} in: " ${targetdir} # Unpack the image [ `which docker-companion 2> /dev/null` ] \ && docker-companion ${opts} unpack --squash "${docker_image}" ${targetdir} \ || ./docker-companion ${opts} unpack --squash "${docker_image}" ${targetdir} if [ $? -ne 0 ] ; then return 1 fi if [ ! -e "${undocker_output_directory}/dev/urandom" ]; then echo "/dev/urandom not present on unpacked chroot. creating it " mknod -m 444 "${undocker_output_directory}"/dev/urandom c 1 9 || return 1 fi if [ ${SKIP_DOCKER_RMI} -eq 0 ] ; then docker_clean fi return 0 } build_sabayon() { DAILY_TMPDIR=$(mktemp -d --suffix=.iso_build.sh --tmpdir=/tmp) echo "DAILY_TMPDIR = ${DAILY_TMPDIR}" [[ -z "${DAILY_TMPDIR}" ]] && return 1 DAILY_TMPDIR_REMASTER="${DAILY_TMPDIR}/remaster" mkdir "${DAILY_TMPDIR_REMASTER}" || return 1 if [ ${EXPORT_SKIP} -eq 0 ] ; then export_docker_rootfs || return 1 fi local scripts_dir="${SABAYON_MOLECULE_HOME}/scripts" local inner_chroot="${scripts_dir}/inner_source_chroot_update.sh" local source_specs=() for i in ${!SOURCE_SPECS[@]}; do src="${SABAYON_MOLECULE_HOME}/molecules/${SOURCE_SPECS[i]}" dst="${DAILY_TMPDIR}/${SOURCE_SPECS[i]}" cp "${src}" "${dst}" -p || return 1 echo >> "${dst}" echo "inner_source_chroot_script: ${inner_chroot}" >> "${dst}" # tweak iso image name sed -i "s/destination_iso_image_name:.*/destination_iso_image_name: ${SOURCE_SPECS_ISO[i]}/" \ "${dst}" || return 1 echo -n "${dst}: iso: ${SOURCE_SPECS_ISO[i]} " echo "release: ${SABAYON_RELEASE}" source_specs+=( "${dst}" ) done local remaster_specs=() for i in ${!REMASTER_SPECS[@]}; do src="${SABAYON_MOLECULE_HOME}/molecules/${REMASTER_SPECS[i]}" dst="${DAILY_TMPDIR_REMASTER}/${REMASTER_SPECS[i]}" cp "${src}" "${dst}" -p || return 1 # tweak iso image name sed -i "s/destination_iso_image_name:.*/destination_iso_image_name: ${REMASTER_SPECS_ISO[i]}/" \ "${dst}" || return 1 echo -n "${dst}: iso: ${REMASTER_SPECS_ISO[i]} " echo "release: ${SABAYON_RELEASE}" remaster_specs+=( "${dst}" ) done for i in ${!REMASTER_TAR_SPECS[@]}; do src="${SABAYON_MOLECULE_HOME}/molecules/${REMASTER_TAR_SPECS[i]}" dst="${DAILY_TMPDIR_REMASTER}/${REMASTER_TAR_SPECS[i]}" cp "${src}" "${dst}" -p || return 1 # tweak tar name sed -i "s/tar_name:.*/tar_name: ${REMASTER_TAR_SPECS_TAR[i]}/" "${dst}" || return 1 echo -n "${dst}: tar: ${REMASTER_TAR_SPECS_TAR[i]} " echo "release: ${SABAYON_RELEASE}" remaster_specs+=( "${dst}" ) done local done_images=0 local done_iso=0 local done_something=0 if [ ${#source_specs[@]} != 0 ]; then ( flock --timeout $((24 * 3600)) -x 9 if [ "${?}" != "0" ]; then echo "Timed out during source_specs lock contention" >&2 exit 1 fi molecule --nocolor "${source_specs[@]}" || exit 1 ) 9> /tmp/.iso_build.sh.source_specs.lock || return 1 done_something=1 done_iso=1 fi if [ ${#remaster_specs[@]} != 0 ]; then molecule --nocolor "${remaster_specs[@]}" || return 1 done_something=1 done_iso=1 fi # package phases keep loading dbus, let's kill pids back ps ax | grep -- "/usr/bin/dbus-daemon --fork .* --session" | awk '{ print $1 }' | xargs kill 2> /dev/null if [ "${done_something}" = "1" ]; then if [ ${MAKE_TORRENTS} -eq 1 ]; then flock -x /tmp/.iso_build.sh.make_torrents.lock \ "${SABAYON_MOLECULE_HOME}"/scripts/make_torrents.sh || return 1 fi if [ "${done_iso}" = "1" ]; then cp -p "${SABAYON_MOLECULE_HOME}"/iso/*"${ISO_TAG}"* \ "${SABAYON_MOLECULE_HOME}"/iso_rsync/ || return 1 fi date > "${SABAYON_MOLECULE_HOME}"/iso_rsync/RELEASE_DATE_"${ISO_TAG}" # remove old ISO images? if [ -n "${OLD_ISO_TAG}" ]; then echo "Removing old ISO images tagged ${OLD_ISO_TAG} locally" rm -rf "${SABAYON_MOLECULE_HOME}"/{iso,iso_rsync}/"${DISTRO_NAME}"*"${OLD_ISO_TAG}"* echo "Removing old ISO images tagged ${OLD_ISO_TAG} remotely" remove_from_mirrors "${DISTRO_NAME}*${OLD_ISO_TAG}*" remove_from_mirrors "RELEASE_DATE_${OLD_ISO_TAG}" fi fi if [ -n "${CHANGELOG_DATES}" ]; then flock -x /tmp/.iso_build.sh.make_git_logs.lock \ "${SABAYON_MOLECULE_HOME}"/scripts/make_git_logs.sh \ "${CHANGELOG_DIR}" ${CHANGELOG_DATES} fi return 0 } mail_failure() { local out=${1} local log_file=${2} local log_cont= # get the last 64 lines of the file if [ -f "${log_file}" ]; then log_cont=$(tail -n 64 "${log_file}" 2> /dev/null) fi echo "Hello there, iso_build.sh execution failed (miserably) with exit status: ${out}. Log file is at: ${log_file} Last log lines: [... snip ...] ${log_cont} [... snip ...] Thanks, Sun" | mail -s "${ACTION} images build script failure" root } mail_success() { echo "Hello there, New ${ACTION} images tagged as ${ISO_TAG} have been built and pushed to mirrors. http://www.sabayon.org/latest (node/306) will be updated in 24 hours automatically. " | mail -s "Action required: ${ACTION} ${ISO_TAG} images built" root } main () { parse_args () { help_message() { local script=$0 echo " Sabayon ISO Image Build Script. $0 [action] [opts] Valid actions: daily, weekly, monthly, dailybase, release. Available options: -h|--help This message. --push Enable push to Sabayon Server --pull-skip Skip pull of docker image --stdout Print debug message to stdout --sleepnight Execute build after 22pm and sleep until that hour. --pushonly Push only images --torrents Make torrent files. --changelogsdir [DIR] Set changelog directory. Default is \${SABAYON_MOLECULE_HOME}/\${ACTION}-git-logs. --skip-dev Skip build of development images (with limbo repository). --skip-export For development avoid export of docker image if it is already present. --skip-docker-rmi Skip clean of orphaned Docker images. --skip-email Skip sent of mail. --only-dev Build only development images. --logfile [PATH] Customize logfile path. --image [NAME] Build only a specific image. (This option can be used multiple time). Valid value are: * spinbase * gnome * kde * mate * minimal * xfce * lxqt Environment variables to customize: SABAYON_SERVER Default to ${SABAYON_SERVER} SABAYON_SERVER_DIR Default to ${SABAYON_SERVER_DIR} SABAYON_RSYNC_SERVER Default to ${SABAYON_RSYNC_SERVER} SABAYON_DOCKER_SRC_IMAGE Default to ${SABAYON_DOCKER_SRC_IMAGE} SABAYON_UNDOCKER_OUTPUTDIR Default to ${SABAYON_UNDOCKER_OUTPUTDIR}. MOLECULE_TMPDIR Default to ${MOLECULE_TMPDIR} SABAYON_MOLECULE_HOME Default to ${SABAYON_MOLECULE_HOME} SABAYON_KERNEL_VERSION Set kernel slot to install on image. Default is ${SABAYON_KERNEL_VERSION} SABAYON_EXTRA_PKGS Define additional packages to install on spinbase rootfs. SABAYON_UNMASK_PKGS Define additional packages to unmask. SABAYON_ENMAN_REPOS Define additional enman repository to install on spinbase rootfs. " return 0 } local short_opts="h" local long_opts="help push stdout sleepnight pushonly torrents changelogsdir:" long_opts="${long_opts} skip-dev image: logfile: pull-skip skip-email skip-export" long_opts="${long_opts} only-dev skip-docker-rmi" local action=$1 local valid_actions=( "daily" "weekly" "monthly" "dailybase" "release" ) local valid_images=( "spinbase" "gnome" "kde" "mate" "minimal" "xfce" "lxqt" ) if [ $# -eq 0 ] ; then help_message exit 1 fi ACTION="${1}" ACTION_VALID= for act in "${valid_actions[@]}"; do if [ "${act}" = "${ACTION}" ]; then ACTION_VALID=1 break fi done if [ -z "${ACTION_VALID}" ]; then echo "invalid action: ${ACTION}" >&2 exit 1 fi shift $(set -- $(getopt -u -q -a -o "$short_opts" -l "$long_opts" -- "$@")) MAKE_TORRENTS=0 DO_PUSH=0 DO_STDOUT=0 DO_SLEEPNIGHT=0 DO_PUSHONLY=0 SKIP_DEV=0 SKIP_DOCKER_RMI=0 ONLY_DEV=0 IMAGE_VALID=0 CUSTOM_IMAGES=0 LIST_IMAGES=() CHANGELOG_DIR="${SABAYON_MOLECULE_HOME}/${ACTION}-git-logs" while [ $# -gt 0 ] ; do case "$1" in -h|--help) help_message exit 1 ;; --push) DO_PUSH=1 ;; --stdout) DO_STDOUT=1 ;; --sleepnight) DO_SLEEPNIGHT=1 ;; --pushonly) DO_PUSHONLY=1 DO_PUSH=1 ;; --torrents) MAKE_TORRENTS=1 ;; --changelogsdir) CHANGELOG_DIR=$2 shift ;; --skip-dev) SKIP_DEV=1 ;; --only-dev) ONLY_DEV=1 ;; --skip-email) EMAIL_SKIP=1 ;; --skip-export) EXPORT_SKIP=1 ;; --pull-skip) PULL_SKIP=1 ;; --skip-docker-rmi) SKIP_DOCKER_RMI=1 ;; --logfile) LOG_FILE=$2 # TODO: I can create directory if doesn't exist shift ;; --image) for im in "${valid_images[@]}"; do if [ "${img}" = "$2" ]; then IMAGE_VALID=1 break fi done if [ -z "${IMAGE_VALID}" ]; then echo "invalid image: $2" >&2 exit 1 fi CUSTOM_IMAGES=1 LIST_IMAGES+=( $2 ) shift ;; --) ;; *) echo "Invalid parameter $1." exit 1 ;; esac shift done if [[ ${ONLY_DEV} -eq 1 && ${SKIP_DEV} -eq 1 ]] ; then echo "ERROR: Used both options --only-dev and --skip-dev at same time." exit 1 fi unset -f help_msg export ACTION DO_PUSH DO_STDOUT DO_SLEEPNIGHT DO_PUSHONLY MAKE_TORRENTS export CHANGELOG_DIR CUSTOM_IMAGES LIST_IMAGES ONLY_DEV SKIP_DEV SKIP_DOCKER_RMI return 0 } parse_args "$@" if [ "$(id -u)" != "0" ]; then echo "This script must be run as root" 1>&2 exit 1 fi unset -f parse_args prepare_env mkdir -p "${CHANGELOG_DIR}" || exit 1 build_info trap "cleanup_on_exit" EXIT INT TERM update_docker_companion echo "READY for build..." local out=0 if [ ${DO_STDOUT} -eq 1 ]; then if [ ${DO_PUSHONLY} -eq 0 ]; then build_sabayon out=${?} fi if [ "${out}" = "0" ]; then move_to_mirrors out=${?} fi else if [ ${DO_PUSHONLY} -eq 0 ]; then build_sabayon &> "${LOG_FILE}" out=${?} fi if [ "${out}" = "0" ]; then move_to_mirrors &>> "${LOG_FILE}" out=${?} fi if [ ${EMAIL_SKIP} -eq 0 ] ; then if [ "${out}" != "0" ]; then # mail root mail_failure "${out}" "${LOG_FILE}" else if [ "${ACTION}" = "monthly" ] || [ "${ACTION}" = "release" ]; then mail_success fi fi fi fi echo "EXIT_STATUS: ${out}" exit ${out} } main "$@"