7 for (( index
=${#CLEANUP[@]}-1 ; index
>= 0 ; index--
)) ;do
16 REASON
="${2:-Unknown reason}"
22 trap cleanup EXIT TERM INT
38 DISTROBUILDER_GIT_BRANCH
44 for var
in "${REQUIRED_VARIABLES[@]}" ; do
45 if [ ! -v "$var" ] ; then
47 echo "Missing required variable: '${var}'" >&2
50 if [[ ! "${MISSING_VARS}" == "0" ]] ; then
51 fail
1 "Missing required variables"
55 INSTANCE_START_TIMEOUT
="${INSTANCE_START_TIMEOUT:-30}"
60 apt-get
install -y lxd-client
61 mkdir
-p ~
/.config
/lxc
62 cp "${LXD_CLIENT_CERT}" ~
/.config
/lxc
/client.crt
63 cp "${LXD_CLIENT_KEY}" ~
/.config
/lxc
/client.key
65 "rm -f ${HOME}/.config/lxc/client.crt"
66 "rm -f ${HOME}/.config/lxc/client.key"
68 lxc remote add ci
--accept-certificate --auth-type tls
"${LXD_HOST}"
71 # Exit gracefully if the lxc images: provides the base image
72 IMAGE_NAME
="${OS}/${RELEASE}/${VARIANT}/${ARCH}"
73 TYPE_FILTER
='type=container'
74 if [[ "${IMAGE_TYPE}" == "vm" ]] ; then
75 TYPE_FILTER
='type=virtual-machine'
77 if [[ "$(lxc image list -f csv images:"${IMAGE_NAME}" -- "${TYPE_FILTER}" | wc -l)" != "0" ]] ; then
78 echo "Image '${IMAGE_NAME}' provided by 'images:' remote"
83 apt-get
install -y wget
84 wget
"https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" -O - |
tar -C /usr
/local -xzf -
85 export PATH
="${PATH}:/usr/local/go/bin"
87 # Install distrobuilder
88 apt-get
install -y debootstrap rsync gpg squashfs-tools git \
89 btrfs-progs dosfstools qemu-utils gdisk
91 git clone
--branch="${DISTROBUILDER_GIT_BRANCH}" "${DISTROBUILDER_GIT_URL}" distrobuilder
94 PATH
="${PATH}:${HOME}/go/bin"
98 git clone
--branch="${GIT_BRANCH}" "${GIT_URL}" ci
100 # Get the LXC CI repo
102 git clone
--branch="${LXC_CI_GIT_BRANCH}" "${LXC_CI_GIT_URL}" lxc-ci
105 "${WORKSPACE}/ci/automation/images"
106 "${WORKSPACE}/lxc-ci/images"
113 for IMAGE_DIR
in "${IMAGE_DIRS[@]}" ; do
114 for EXTENSION
in "${EXTENSIONS[@]}" ; do
115 if [ -f "${IMAGE_DIR}/${OS}-${RELEASE}.${EXTENSION}" ] ; then
116 IMAGE_FILE
="${IMAGE_DIR}/${OS}-${RELEASE}.${EXTENSION}"
120 for EXTENSION
in "${EXTENSIONS[@]}" ; do
121 if [ -f "${IMAGE_DIR}/${OS}.${EXTENSION}" ] ; then
122 IMAGE_FILE
="${IMAGE_DIR}/${OS}.${EXTENSION}"
128 if [[ "${IMAGE_FILE}" == "" ]] ; then
129 fail
1 "Unable to find image file for '${OS}' in ${IMAGE_DIRS[@]}"
136 if [[ "${IMAGE_TYPE}" == "vm" ]] ; then
137 DISTROBUILDER_ARGS
+=('--vm')
141 # This could be quite large, and /tmp may be a tmpfs backed
142 # by memory, so instead make it relative to the workspace directory
143 BUILD_DIR
=$
(mktemp
-d -p "${WORKSPACE}")
145 "rm -rf ${BUILD_DIR}"
147 DISTROBUILDER_ARGS
+=(
151 "image.architecture=${ARCH}"
153 "image.variant=${VARIANT}"
155 "image.release=${RELEASE}"
157 "image.serial=$(date -u +%Y%m%dT%H:%M:%S%z)"
161 ${DISTROBUILDER_ARGS[@]}
164 # As 'distrobuilder --import-into-incus=alias' doesn't work since it only
165 # connects to the local unix socket, and the remote instance cannot be specified
167 ROOTFS
="${BUILD_DIR}/rootfs.squashfs"
168 if [[ "${IMAGE_TYPE}" == "vm" ]] ; then
169 ROOTFS
="${BUILD_DIR}/disk.qcow2"
172 # Work-around for lxd not using qemu-system-i386: set the architecture to x86_64
173 # which will use qemu-system-x86_64 and still run 32bit userspace/kernels fine.
174 if [[ "${ARCH}" == "i386" ]] ; then
177 tar -xf "${BUILD_DIR}/incus.tar.xz"
178 sed -i 's/architecture: i386/architecture: x86_64/' metadata.yaml
179 tar -cf "${BUILD_DIR}/incus.tar.xz" .
/*
184 # When using `lxc image import` two images cannot have the same alias -
185 # only the last image imported will keep the alias. Therefore, the
186 # image type is appended as part of the alias.
187 IMAGE_NAME
="${IMAGE_NAME}/${IMAGE_TYPE}"
188 lxc image import
"${BUILD_DIR}/incus.tar.xz" "${ROOTFS}" --alias="${IMAGE_NAME}" ci
:
190 if [[ "${TEST}" == "true" ]] ; then
193 if INSTANCE_NAME
="$(lxc -q launch -e ${VM_ARG[@]} -p default -p "${LXD_INSTANCE_PROFILE}" "${IMAGE_NAME}")" ; then
194 INSTANCE_NAME="$
(echo "${INSTANCE_NAME}" | cut
-d':' -f2 |
tr -d ' ')"
196 "lxc stop
${INSTANCE_NAME}"
199 fail 1 "Failed to launch instance using image
'${IMAGE_NAME}'"
201 TIME_REMAINING="${INSTANCE_START_TIMEOUT}"
204 INSTANCE_STATUS="$
(lxc
exec "${INSTANCE_NAME}" hostname
)"
205 if [[ "${INSTANCE_STATUS}" == "${INSTANCE_NAME}" ]] ; then
209 TIME_REMAINING=$((TIME_REMAINING - 1))
210 if [ "${TIME_REMAINING}" -lt "0" ] ; then
211 fail 1 "Timed out waiting
for instance to become available via
'lxc exec'"