diff --git a/Dockerfile b/Dockerfile index f01507884..f914dfde4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -35,7 +35,7 @@ ENV PKGS_LIST=main-packages-list.txt ARG EXTRA_PKGS_LIST COPY ${PKGS_LIST} ${EXTRA_PKGS_LIST} /tmp/ -COPY prepare-image.sh /bin/ +COPY prepare-image.sh patch-image.sh /bin/ RUN prepare-image.sh && \ rm -f /bin/prepare-image.sh diff --git a/README.md b/README.md index a116b3a7c..0aa5b9146 100644 --- a/README.md +++ b/README.md @@ -43,3 +43,16 @@ The ironic configuration can be overridden by various environment variables. The - OS_CONDUCTOR__INSPECT_TIMEOUT=1800 - timeout (seconds) for waiting for node inspection - OS_CONDUCTOR__CLEAN_CALLBACK_TIMEOUT=1800 - timeout (seconds) to wait for a callback from the ramdisk doing the cleaning - OS_PXE__BOOT_RETRY_TIMEOUT=1200 - timeout (seconds) to enable boot retries. + +Applying Patches to the image +----------------------------- + +When building the image, it is possible to specify a patch of one or more +upstream projects to apply to the image, passing a file with the patch list +using the PATCH_LIST build argument. +At the moment, only projects hosted in opendev.org are supported. + +Each line of the file is in the form "project_dir refspec" where: +- project is the last part of the project url including the org, for example openstack/ironic +- refspec is the gerrit refspec of the patch we want to test, for example refs/changes/67/759567/1 + diff --git a/patch-image.sh b/patch-image.sh new file mode 100755 index 000000000..1766fc0aa --- /dev/null +++ b/patch-image.sh @@ -0,0 +1,29 @@ +#!/usr/bin/bash +set -ex + +patch_file="/tmp/${PATCH_LIST}" + +while IFS= read -r line +do + # each line is in the form "project_dir refsspec" where: + # - project is the last part of the project url including the org, + # for example openstack/ironic + # - refspec is the gerrit refspec of the patch we want to test, + # for example refs/changes/67/759567/1 + PROJECT=$(echo $line | cut -d " " -f1) + PROJ_NAME=$(echo $PROJECT | cut -d "/" -f2) + PROJ_URL="https://opendev.org/$PROJECT" + REFSPEC=$(echo $line | cut -d " " -f2) + + cd /tmp + git clone "$PROJ_URL" + cd "$PROJ_NAME" + git fetch "$PROJ_URL" "$REFSPEC" + git checkout FETCH_HEAD + + SKIP_GENERATE_AUTHORS=1 SKIP_WRITE_GIT_CHANGELOG=1 python3 setup.py sdist + pip3 install dist/*.tar.gz +done < "$patch_file" + +cd / + diff --git a/prepare-image.sh b/prepare-image.sh index e92fe158b..b1d70149a 100755 --- a/prepare-image.sh +++ b/prepare-image.sh @@ -13,3 +13,9 @@ if [[ ! -z ${EXTRA_PKGS_LIST} ]]; then fi dnf clean all rm -rf /var/cache/{yum,dnf}/* +if [[ ! -z ${PATCH_LIST} ]]; then + if [[ -s "/tmp/${PATCH_LIST}" ]]; then + /bin/patch-image.sh; + fi +fi +rm -f /bin/patch-image.sh