|
| 1 | +#!/bin/bash |
| 2 | +set -exo pipefail |
| 3 | + |
| 4 | +ROOTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../../" && pwd )" |
| 5 | +SCRIPTDIR=${ROOTDIR}/scripts/image-mode |
| 6 | +IMGNAME=microshift |
| 7 | +USHIFT_VERSION=4.17 |
| 8 | +BUILD_ARCH=$(uname -m) |
| 9 | +OSVERSION=$(awk -F: '{print $5}' /etc/system-release-cpe) |
| 10 | +LVM_SYSROOT_SIZE_MIN=10240 |
| 11 | +LVM_SYSROOT_SIZE=${LVM_SYSROOT_SIZE_MIN} |
| 12 | +OCP_PULL_SECRET_FILE= |
| 13 | +AUTHORIZED_KEYS_FILE= |
| 14 | +AUTHORIZED_KEYS= |
| 15 | +USE_MIRROR_REPO= |
| 16 | + |
| 17 | +# shellcheck disable=SC2034 |
| 18 | +STARTTIME="$(date +%s)" |
| 19 | +BUILDDIR=${ROOTDIR}/_output/image-mode |
| 20 | + |
| 21 | +usage() { |
| 22 | + local error_message="$1" |
| 23 | + |
| 24 | + if [ -n "${error_message}" ]; then |
| 25 | + echo "ERROR: ${error_message}" |
| 26 | + echo |
| 27 | + fi |
| 28 | + |
| 29 | + echo "Usage: $(basename "$0") <-pull_secret_file path_to_file> [OPTION]..." |
| 30 | + echo "" |
| 31 | + echo " -pull_secret_file path_to_file" |
| 32 | + echo " Path to a file containing the OpenShift pull secret, which can be" |
| 33 | + echo " obtained from https://console.redhat.com/openshift/downloads#tool-pull-secret" |
| 34 | + echo "" |
| 35 | + echo "Optional arguments:" |
| 36 | + echo " -lvm_sysroot_size num_in_MB" |
| 37 | + echo " Size of the system root LVM partition. The remaining" |
| 38 | + echo " disk space will be allocated for data (default: ${LVM_SYSROOT_SIZE})" |
| 39 | + echo " -authorized_keys_file path_to_file" |
| 40 | + echo " Path to an SSH authorized_keys file to allow SSH access" |
| 41 | + echo " into the default 'redhat' account" |
| 42 | + echo " -use-mirror-repo <mirror_repo>" |
| 43 | + echo " Use mirror repo to get release candidate and engineering preview rpms" |
| 44 | + echo " like (https://mirror.openshift.com/pub/openshift-v4/x86_64/microshift/ocp-dev-preview/latest-4.18/el9/os/)" |
| 45 | + echo " -ushift-version <microshift-version>" |
| 46 | + echo " Version of microshift for image generation (default: ${USHIFT_VERSION}" |
| 47 | + exit 1 |
| 48 | +} |
| 49 | + |
| 50 | +title() { |
| 51 | + echo -e "\E[34m\n# $1\E[00m" |
| 52 | +} |
| 53 | + |
| 54 | +# Parse the command line |
| 55 | +while [ $# -gt 0 ] ; do |
| 56 | + case $1 in |
| 57 | + -pull_secret_file) |
| 58 | + shift |
| 59 | + OCP_PULL_SECRET_FILE="$1" |
| 60 | + [ -z "${OCP_PULL_SECRET_FILE}" ] && usage "Pull secret file not specified" |
| 61 | + [ ! -s "${OCP_PULL_SECRET_FILE}" ] && usage "Empty or missing pull secret file" |
| 62 | + shift |
| 63 | + ;; |
| 64 | + -lvm_sysroot_size) |
| 65 | + shift |
| 66 | + LVM_SYSROOT_SIZE="$1" |
| 67 | + [ -z "${LVM_SYSROOT_SIZE}" ] && usage "System root LVM partition size not specified" |
| 68 | + [ "${LVM_SYSROOT_SIZE}" -lt ${LVM_SYSROOT_SIZE_MIN} ] && usage "System root LVM partition size cannot be smaller than ${LVM_SYSROOT_SIZE_MIN}MB" |
| 69 | + shift |
| 70 | + ;; |
| 71 | + -authorized_keys_file) |
| 72 | + shift |
| 73 | + AUTHORIZED_KEYS_FILE="$1" |
| 74 | + [ -z "${AUTHORIZED_KEYS_FILE}" ] && usage "Authorized keys file not specified" |
| 75 | + shift |
| 76 | + ;; |
| 77 | + -use-mirror-repo) |
| 78 | + shift |
| 79 | + USE_MIRROR_REPO="$1" |
| 80 | + [ -z "${USE_MIRROR_REPO}" ] && usage "Mirror repo not specified" |
| 81 | + shift |
| 82 | + ;; |
| 83 | + -ushift-version) |
| 84 | + shift |
| 85 | + USHIFT_VERSION="$1" |
| 86 | + [ -z "${USHIFT_VERSION}" ] && usage "MicroShift version not specified" |
| 87 | + shift |
| 88 | + ;; |
| 89 | + *) |
| 90 | + usage |
| 91 | + ;; |
| 92 | + esac |
| 93 | +done |
| 94 | + |
| 95 | +if [ ! -r "${OCP_PULL_SECRET_FILE}" ] ; then |
| 96 | + echo "ERROR: pull_secret_file file does not exist or not readable: ${OCP_PULL_SECRET_FILE}" |
| 97 | + exit 1 |
| 98 | +fi |
| 99 | +if [ -n "${AUTHORIZED_KEYS_FILE}" ]; then |
| 100 | + if [ ! -e "${AUTHORIZED_KEYS_FILE}" ]; then |
| 101 | + echo "ERROR: authorized_keys_file does not exist: ${AUTHORIZED_KEYS_FILE}" |
| 102 | + exit 1 |
| 103 | + else |
| 104 | + AUTHORIZED_KEYS=$(cat "${AUTHORIZED_KEYS_FILE}") |
| 105 | + fi |
| 106 | +fi |
| 107 | + |
| 108 | +mkdir -p "${BUILDDIR}" |
| 109 | + |
| 110 | +title "Preparing kickstart config" |
| 111 | +# Create a kickstart file from a template, compacting pull secret contents if necessary |
| 112 | +cat < "${SCRIPTDIR}/config/config.toml.template" \ |
| 113 | + | sed "s;REPLACE_LVM_SYSROOT_SIZE;${LVM_SYSROOT_SIZE};g" \ |
| 114 | + | sed "s;REPLACE_OCP_PULL_SECRET_CONTENTS;$(cat < "${OCP_PULL_SECRET_FILE}" | jq -c);g" \ |
| 115 | + | sed "s^REPLACE_REDHAT_AUTHORIZED_KEYS_CONTENTS^${AUTHORIZED_KEYS}^g" \ |
| 116 | + > config.toml |
| 117 | + |
| 118 | +title "Building bootc image for microshift" |
| 119 | +sudo podman build --authfile ${OCP_PULL_SECRET_FILE} -t ${IMGNAME}:${USHIFT_VERSION} \ |
| 120 | + --build-arg USHIFT_VER=${USHIFT_VERSION} \ |
| 121 | + --env MIRROR_REPO=${USE_MIRROR_REPO} \ |
| 122 | + -f "${SCRIPTDIR}/config/Containerfile.bootc-rhel9" |
| 123 | + |
| 124 | +title "Creating ISO image" |
| 125 | +sudo podman run --authfile ${OCP_PULL_SECRET_FILE} --rm -it \ |
| 126 | + --privileged \ |
| 127 | + --security-opt label=type:unconfined_t \ |
| 128 | + -v /var/lib/containers/storage:/var/lib/containers/storage \ |
| 129 | + -v "${SCRIPTDIR}"/config.toml:/config.toml \ |
| 130 | + -v "${BUILDDIR}":/output \ |
| 131 | + registry.redhat.io/rhel9/bootc-image-builder:latest \ |
| 132 | + --local \ |
| 133 | + --type iso \ |
| 134 | + --config /config.toml \ |
| 135 | + ${IMAGE_NAME}:${IMAGE_VERSION} |
| 136 | + |
0 commit comments