diff --git a/roles/build-containers/files/build-report.py b/roles/build-containers/files/build-report.py new file mode 100644 index 000000000..5787c4ea9 --- /dev/null +++ b/roles/build-containers/files/build-report.py @@ -0,0 +1,63 @@ +# Copyright 2020 Red Hat Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import glob +import pytest +import subprocess + + +def _get_build_log(image): + """ + Retrieve the inidividual log filename for a given image + e.g. ./logs/container-builds/**/-build.log + """ + # compose the log filename + log = f"{ image }-build.log" + # glob search in ./logs/container-builds/**/-build.log + logfile = f"./{ pytest.logs_dir }/{ pytest.build_dir }/**/{ log }" + for f in glob.glob(logfile, recursive=True): + # return only first match + return f + # log not found, return glob string + return logfile + + +def test_container_is_built(image): + """ + Test if container image is built + """ + # image in skip list, skip the build check + if image in pytest.excluded_containers: + pytest.skip("container image excluded: {}".format(image)) + + # [TEST 1]: check if image exists + cmd = ['buildah', 'images', image] + proc = subprocess.run( + cmd, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE + ) + # buildah images should return 0 and image should be in stdout + assert image in proc.stdout and proc.returncode == 0, proc.stderr + print(proc.stdout) + + # [TEST 2]: check if build log has errors + try: + # read log file + with open(_get_build_log(image), 'r') as build_log: + log = build_log.read() + # test if any error is found in the log + assert 'Error:' not in log, f"Image failed to build: { image }" + except IOError as err: + print(f"Warning: Build log not found: { err }") + + # [TEST N+1]: additional tests can be added here diff --git a/roles/build-containers/files/conftest.py b/roles/build-containers/files/conftest.py new file mode 100644 index 000000000..e4ab5d6b1 --- /dev/null +++ b/roles/build-containers/files/conftest.py @@ -0,0 +1,93 @@ +# Copyright 2020 Red Hat Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import glob +import pytest +from py.xml import html + +BUILD_DIR = 'container-builds' +LOGS_DIR = 'logs' +EXCLUDE_CONTAINERS = 'containers-excluded.log' + + +def _get_build_link(funcargs): + """ + Retrieves the link of the build log for a given container + """ + # compose logfile to glob search + log = f"{ funcargs.get('image') }-build.log" + logfile = f"./{ LOGS_DIR }/{ BUILD_DIR }/**/{ log }" + for f in glob.glob(logfile, recursive=True): + # remove parent 'logs/' dir from the path + # link will be like ./container-builds/**/-build.log + link = "./" + "/".join(f.split("/")[2:]) + # return first log file as href link + return html.a(log, href=link) + # log file not found + return "" + + +def _get_excluded_containers_list(): + """ + Retrieves the list of excluded images to skip the build + """ + try: + with open(EXCLUDE_CONTAINERS) as f: + excluded_containers_list = [line.strip() for line in f] + except IOError: + excluded_containers_list = [] + return excluded_containers_list + + +def pytest_addoption(parser): + parser.addoption( + "--image", + action="append", + default=[], + help="list of container images to pass to test functions", + ) + + +def pytest_generate_tests(metafunc): + if "image" in metafunc.fixturenames: + metafunc.parametrize("image", metafunc.config.getoption("image")) + + +def pytest_configure(): + # these vars are visible from build-report.py functions + pytest.excluded_containers = _get_excluded_containers_list() + pytest.build_dir = BUILD_DIR + pytest.logs_dir = LOGS_DIR + + +@pytest.mark.optionalhook +def pytest_html_results_table_header(cells): + # this replaces the default 'Links' column in position #3 + cells.insert(3, html.th('Build Log')) + cells.pop() + + +@pytest.mark.optionalhook +def pytest_html_results_table_row(report, cells): + if hasattr(report, 'build_log'): + # report.logs has the link of each build log + cells.insert(3, html.td(report.build_log)) + + +@pytest.mark.hookwrapper +def pytest_runtest_makereport(item, call): + outcome = yield + report = outcome.get_result() + # get the link for a given image build log + report.build_log = _get_build_link(item.funcargs) diff --git a/roles/build-containers/tasks/build-report.yaml b/roles/build-containers/tasks/build-report.yaml new file mode 100644 index 000000000..20cb649ec --- /dev/null +++ b/roles/build-containers/tasks/build-report.yaml @@ -0,0 +1,94 @@ +- name: Container build report + block: + + - name: Move container-builds dir to workspace/logs + shell: "mv /tmp/container-* ./logs/" + become: true + args: + chdir: "{{ workspace }}" + ignore_errors: yes + + - name: Set ci_branch for building containers check jobs + include_tasks: set_ci_branch.yml + + - name: Set branch + set_fact: + branch: "{{ osp_branch | default(ci_branch) }}" + + - name: fetch tripleo_containers.yaml into ansible controller + fetch: + src: "{{ openstack_git_root }}/{% if zuul_internal is defined %}openstack-{% endif %}tripleo-common/container-images/tripleo_containers.yaml" + dest: "{{ zuul.executor.work_root }}/" + flat: yes + + - name: Load list of containers expected to build + include_vars: + file: "{{ zuul.executor.work_root }}/tripleo_containers.yaml" + + - name: build list of expected images w/ prefix + set_fact: + expected_images: "{{ expected_images|default([]) + [item['imagename'].split(':')[0].split('/')[2]] }}" + when: item['image_source'] == "tripleo" + with_items: "{{ container_images }}" + + - name: remove prefix from expected containers list + vars: + prefix: "{{ container_name_prefix }}-" + set_fact: + expected_containers: "{{ expected_containers|default([]) + [item | replace(prefix, '')] }}" + with_items: "{{ expected_images }}" + + - name: Get list of excluded containers + shell: | + set -eux + echo {{ item }} >> {{ workspace }}/containers-excluded.log + with_items: "{{ exclude_containers[branch] }}" + when: exclude_containers is defined and branch in exclude_containers + + - name: Write containers-expected.log + lineinfile: + line: "{{ item }}" + path: "{{ workspace }}/containers-expected.log" + create: yes + state: present + with_items: "{{ expected_containers }}" + + - name: Get actual built containers + shell: | + set -eux + {{ container_cli | default('buildah') }} images | grep {{ container_name_prefix }} \ + | tee {{ workspace }}/containers-built.log + become: true + + - name: Copy build-report files + copy: + src: "files/{{ item }}" + dest: "{{ workspace }}" + with_items: + - build-report.py + - conftest.py + + - name: construct images args + set_fact: + images_args: "{{ images_args | default('') + ' --image ' + item }}" + with_items: "{{ expected_containers }}" + + - name: Install pytest + pip: + name: "{{ item }}" + virtualenv: "{{ workspace }}/venv_build" + virtualenv_python: "{{ virtualenv_python[ansible_distribution_major_version|int] }}" + with_items: + - pytest + - pytest-html + + - name: Execute build-report + shell: | + source "venv_build/bin/activate" + {{ virtualenv_python[ansible_distribution_major_version|int] }} -m pytest \ + --html=report.html --self-contained-html {{ images_args }} build-report.py + args: + chdir: "{{ workspace }}" + become: true + + ignore_errors: yes diff --git a/roles/build-containers/tasks/main.yaml b/roles/build-containers/tasks/main.yaml index 7c7b6c0c4..1326ef429 100644 --- a/roles/build-containers/tasks/main.yaml +++ b/roles/build-containers/tasks/main.yaml @@ -128,6 +128,7 @@ - name: Set container cli set_fact: container_cli: "{% if use_buildah|bool %}buildah{% else %}docker{% endif %}" + cacheable: yes - name: Set config-file set_fact: @@ -200,37 +201,48 @@ that: - authfile_exist.stat.exists | bool -- name: Generate building script +- name: Generate kolla building script template: - src: templates/build.sh.j2 + src: templates/kolla-build.sh.j2 dest: "{{ workspace }}/build_containers.sh" mode: 0777 force: yes + when: use_kolla | default(true) + +- name: Generate tripleo building script + template: + src: templates/tripleo-build.sh.j2 + dest: "{{ workspace }}/build_containers.sh" + mode: 0777 + force: yes + when: not use_kolla | default(true) - name: "Run image build as ansible user > {{ workspace }}/build.log" args: chdir: '{{ workspace }}' - shell: set -o pipefail && bash build_containers.sh 2>&1 {{ timestamper_cmd }} > {{ workspace }}/build.log + shell: set -o pipefail && bash build_containers.sh 2>&1 {{ timestamper_cmd }} > {{ workspace }}/logs/build.log when: - ansible_distribution|lower != "redhat" - name: "Run image build as root > {{ workspace }}/build.log" args: chdir: '{{ workspace }}' - shell: set -o pipefail && bash build_containers.sh 2>&1 {{ timestamper_cmd }} > {{ workspace }}/build.log - become: true + shell: set -o pipefail && bash build_containers.sh 2>&1 {{ timestamper_cmd }} > {{ workspace }}/logs/build.log when: - - ansible_distribution|lower == "redhat" + - ansible_distribution|lower == "redhat" + become: true -- name: Retrieve list of built x86_64 images, retag, and push +- name: Retrieve built images + shell: "{{ container_cli }} images | grep {{ container_name_prefix }} | awk '{ print $1 }'" + register: built_images + become: true + +- name: Retag and push x86_64 images when: - ansible_architecture == "x86_64" - push_containers | bool - not push_containers_podman | default(false) | bool block: - - name: Retrieve built images - command: "awk '{ print $1 }' {{ workspace }}/containers-successfully-built.log" - register: built_images - name: Disable HTTPS and certificates to access registry (buildah) set_fact: container_cli_opt: '--tls-verify=false' @@ -243,13 +255,6 @@ with_items: "{{ built_images.stdout_lines }}" become: true -- name: Retrieve built images - command: "awk '{ print $1 }' {{ workspace }}/containers-successfully-built.log" - register: built_images - become: true - when: - - job.provider_job|default(false)|bool - - name: Run registry when: - job.provider_job|default(false)|bool diff --git a/roles/build-containers/tasks/post.yaml b/roles/build-containers/tasks/post.yaml index 4f4084117..3a2521c8d 100644 --- a/roles/build-containers/tasks/post.yaml +++ b/roles/build-containers/tasks/post.yaml @@ -1,4 +1,8 @@ --- +- name: Build report + include: build-report.yaml + when: not use_kolla | default(false) + - name: Grab job artifacts become: true args: @@ -11,14 +15,13 @@ mkdir -p {{ workspace }}/etc/ansible mkdir -p {{ workspace }}/etc/docker mkdir -p {{ workspace }}/etc/httpd - mkdir -p {{ workspace }}/logs/buildah-builds mv *.conf {{ workspace }}/conf/ - mv {{ openstack_git_root }}/tripleo-common/container-images/overcloud_containers.yaml {{ workspace }}/conf/ + mv {{ openstack_git_root }}/{% if zuul_internal is defined %}openstack-{% endif %}tripleo-common/container-images/*_containers.yaml {{ workspace }}/conf/ mv *.log {{ workspace }}/logs/ + mv *.html {{ workspace }}/logs/ mv *.sh {{ workspace }}/logs/ - mv /tmp/kolla-* {{ workspace }}/logs/buildah-builds/ || true - mv /tmp/container-* {{ workspace }}/logs/buildah-builds/ || true + mv /tmp/kolla-* {{ workspace }}/logs/ || true rsync -var --no-links /var/log/ {{ workspace }}/logs/system/ || true rsync -var --no-links /etc/ansible/ {{ workspace }}/etc/ansible/ || true rsync -var --no-links /etc/docker/ {{ workspace }}/etc/docker/ || true diff --git a/roles/build-containers/templates/build.sh.j2 b/roles/build-containers/templates/build.sh.j2 deleted file mode 100644 index cfe04b130..000000000 --- a/roles/build-containers/templates/build.sh.j2 +++ /dev/null @@ -1,176 +0,0 @@ -#!/bin/bash -eux -{% if buildcontainers_venv is defined and buildcontainers_venv %} -source {{ workspace }}/venv_build/bin/activate -pip install -U decorator -TRIPLEO_COMMON_PATH="{{ openstack_git_root }}/{% if zuul_internal is defined %}openstack-{% endif %}tripleo-common" -{% else %} -TRIPLEO_COMMON_PATH="/usr/share/openstack-tripleo-common" -{% endif %} -TRIPLEO_CI_PATH="{{ ansible_user_dir }}/src/opendev.org/openstack/tripleo-ci" - -### list containers to build -{% if use_kolla | default(true) %} -openstack overcloud container image build {{ container_config }}\ - --kolla-config-file {{ workspace }}/kolla-build.conf \ - {% if ci_branch not in ['queens', 'rocky'] and ci_branch in exclude_containers %} - {% for item in exclude_containers[ci_branch] %} - --exclude {{ item }} \ - {% endfor %} - {% endif %} - {% if ci_branch not in ['queens', 'rocky', 'stein'] %} - --work-dir /tmp/container-builds \ - {% endif %} - --list-images > containers-to-build-full.log 2>&1 -egrep "^- " containers-to-build-full.log | awk '{ print $2 }' > containers-expected-to-build.log - -### build -openstack overcloud container image build {{ container_config }}\ - {% if ci_branch not in ['queens', 'rocky'] and ci_branch in exclude_containers %} - {% for item in exclude_containers[ci_branch] %} - --exclude {{ item }} \ - {% endfor %} - {% endif %} - {% if use_buildah is defined and use_buildah %} - --use-buildah \ - {% endif %} - {% if ci_branch not in ['queens', 'rocky', 'stein'] %} - --work-dir /tmp/container-builds \ - {% endif %} - {% if build_timeout is defined %} - --build-timeout {{ build_timeout }} \ - {% endif %} - --kolla-config-file {{ workspace }}/kolla-build.conf -{% else %} -### build -export TRIPLEO_CI_USR_PATH="${VIRTUAL_ENV:-/usr}" -export TRIPLEO_ANSIBLE_WORKPATH="${TRIPLEO_CI_USR_PATH}/share/ansible" -export ANSIBLE_ACTION_PLUGINS="${TRIPLEO_ANSIBLE_WORKPATH}/plugins/action" -export ANSIBLE_CALLBACK_PLUGINS="${TRIPLEO_ANSIBLE_WORKPATH}/plugins/callback" -export ANSIBLE_FILTER_PLUGINS="${TRIPLEO_ANSIBLE_WORKPATH}/plugins/filter" -export ANSIBLE_LIBRARY="${TRIPLEO_ANSIBLE_WORKPATH}/plugins/modules" -export ANSIBLE_MODULE_UTILS="${TRIPLEO_ANSIBLE_WORKPATH}/plugins/module_utils" -export ANSIBLE_ROLES_PATH="${TRIPLEO_ANSIBLE_WORKPATH}/roles" -export ROLE_REPOS="tripleo-common ansible/roles" - -echo "print exported variables" -set | grep -i TRIPLEO -set | grep -i ANSIBLE - -echo "list files in ansible role path, ${TRIPLEO_ANSIBLE_WORKPATH}/roles" -ls -la "${TRIPLEO_ANSIBLE_WORKPATH}/roles" - - -# Ensure that the roles from tripleo-common and tripleo-ansible installed -# from the venv are available in the roles path -# The tripleo-common role path can be found here: -# https://opendev.org/openstack/tripleo-common/src/branch/master/tripleo_common/actions/ansible.py -for ROLE_REPO in $ROLE_REPOS; do - if [[ "${TRIPLEO_CI_USR_PATH}" != '/usr' && -d "${TRIPLEO_CI_USR_PATH}/share/${ROLE_REPO}" ]]; then - # Check if the target directory exists and is not a symlink - if [[ -d "/usr/share/${ROLE_REPO}" && ! -L "/usr/share/${ROLE_REPO}" ]]; then - echo "Creating a backup of /usr/share/${ROLE_REPO}.bak" - sudo mv /usr/share/${ROLE_REPO} /usr/share/${ROLE_REPO}.bak - fi - # Link our venv'd ${ROLE_REPO} files into the root path. - echo -e "Linking ${TRIPLEO_CI_USR_PATH}/share/${ROLE_REPO} to /usr/share/${ROLE_REPO}" - sudo ln -sf ${TRIPLEO_CI_USR_PATH}/share/${ROLE_REPO} /usr/share/${ROLE_REPO} - fi -done - -openstack tripleo container image build \ -{% if push_containers|bool %} - --push \ -{% endif %} -{% if buildcontainers_authfile_path is defined %} - --authfile {{ buildcontainers_authfile_path }} \ -{% endif %} -{% if distro is defined %} - --distro {{ distro }} \ -{% endif %} -{% if registry_namespace is defined %} - --namespace {{ registry_namespace }} \ -{% endif%} -{% if push_registry is defined %} - --registry {{ push_registry }} \ -{% endif %} -{% if rhel_modules is defined %} - --rhel-modules {{ rhel_modules | join(",") }} \ -{% endif %} -{% set branch = osp_branch|default(ci_branch) %} -{% if branch in exclude_containers %} -{% for item in exclude_containers[branch] %} - --exclude {{ item }} \ -{% endfor %} -{% endif %} - --tag {{ version_hash }}{{ arch_tag | default('') }} \ - --base {{ containers_base_image | default('ubi8') }} \ - --prefix {{ container_name_prefix }} \ - --config-file {{ openstack_git_root }}/{% if zuul_internal is defined %}openstack-{% endif %}tripleo-common/container-images/tripleo_containers.yaml \ - --config-path {{ openstack_git_root }}/{% if zuul_internal is defined %}openstack-{% endif %}tripleo-common/container-images \ - --work-dir /tmp/container-builds \ -{% if build_timeout is defined %} - --build-timeout {{ build_timeout }} \ -{% endif %} - --debug 2> containers-build-errors.log -{% endif %} -RETCODE=$? - -{% if use_kolla | default(true) %} -### actual built containers -sudo {{ container_cli }} images | grep {{ registry_namespace }}/{{ kolla_base }}-binary > containers-successfully-built.log -### grep errors in all build logs -sudo egrep "^Error:|No match" /tmp/kolla-*/docker -R > containers-build-errors.log 2>&1 || true -sudo egrep "^Error:|No match" /tmp/container-builds/*/docker -R >> containers-build-errors.log 2>&1 || true -### not built (failed) -for i in `cat containers-expected-to-build.log`; do - grep "$i" containers-successfully-built.log || echo "$i" >> containers-failed-to-build.log -done - -{% else %} -### actual built containers -sudo {{ container_cli }} images | grep '{{ registry_namespace }}/{{ container_name_prefix }}' > containers-successfully-built.log -(python3 || python) <> containers-consolidated-builds.log - printf "\n===========================================================\n" >> containers-consolidated-builds.log - sudo cat $l >> containers-consolidated-builds.log - printf "\n......................................................[EOF]" >> containers-consolidated-builds.log -done - -EXPECTED=$( wc -l containers-expected-to-build.log | awk '{ print $1 }' ) -BUILT=$( wc -l containers-successfully-built.log | awk '{ print $1 }' ) - -printf "\n\n" -printf "\n============= SUMMARY ===============" -printf "\nExpected................... $EXPECTED" -printf "\nBuilt...................... $BUILT" -printf "\n=====================================" -printf "\n\n" -printf "\nReturn code: [ $RETCODE ]" -printf "\n\n" - -if [ -s "build-errors.log" ]; then - printf "\nWarning: Errors found during container builds. See build-errors.log." -fi - -if [ $RETCODE -eq 0 ]; then - printf "\nSUCCESS: Congratulations! All containers have been built :)" - exit 0 -else - printf "\nFAILURE: I'm sorry. One or more containers failed to build :(" - exit 1 -fi diff --git a/roles/build-containers/templates/kolla-build.sh.j2 b/roles/build-containers/templates/kolla-build.sh.j2 new file mode 100644 index 000000000..d6fd9c2dc --- /dev/null +++ b/roles/build-containers/templates/kolla-build.sh.j2 @@ -0,0 +1,31 @@ +#!/bin/bash -eux +{% if buildcontainers_venv is defined and buildcontainers_venv %} +source {{ workspace }}/venv_build/bin/activate +pip install -U decorator +TRIPLEO_COMMON_PATH="{{ openstack_git_root }}/{% if zuul_internal is defined %}openstack-{% endif %}tripleo-common" +{% else %} +TRIPLEO_COMMON_PATH="/usr/share/openstack-tripleo-common" +{% endif %} +TRIPLEO_CI_PATH="{{ ansible_user_dir }}/src/opendev.org/openstack/tripleo-ci" + +### build +openstack overcloud container image build {{ container_config }}\ + {% if ci_branch not in ['queens', 'rocky'] and ci_branch in exclude_containers %} + {% for item in exclude_containers[ci_branch] %} + --exclude {{ item }} \ + {% endfor %} + {% endif %} + {% if use_buildah is defined and use_buildah %} + --use-buildah \ + {% endif %} + {% if ci_branch not in ['queens', 'rocky', 'stein'] %} + --work-dir /tmp/container-builds \ + {% endif %} + {% if build_timeout is defined %} + --build-timeout {{ build_timeout }} \ + {% endif %} + --kolla-config-file {{ workspace }}/kolla-build.conf + +### grep errors in all build logs +sudo egrep "^Error:|No match" /tmp/kolla-*/docker -R > containers-build-errors.log 2>&1 || true +sudo egrep "^Error:|No match" /tmp/container-builds/*/docker -R >> containers-build-errors.log 2>&1 || true diff --git a/roles/build-containers/templates/tripleo-build.sh.j2 b/roles/build-containers/templates/tripleo-build.sh.j2 new file mode 100644 index 000000000..59fa8291e --- /dev/null +++ b/roles/build-containers/templates/tripleo-build.sh.j2 @@ -0,0 +1,81 @@ +#!/bin/bash -eux + +{% if buildcontainers_venv is defined and buildcontainers_venv %} +source {{ workspace }}/venv_build/bin/activate +pip install -U decorator +TRIPLEO_COMMON_PATH="{{ openstack_git_root }}/{% if zuul_internal is defined %}openstack-{% endif %}tripleo-common" +{% else %} +TRIPLEO_COMMON_PATH="/usr/share/openstack-tripleo-common" +{% endif %} +TRIPLEO_CI_PATH="{{ ansible_user_dir }}/src/opendev.org/openstack/tripleo-ci" + +export TRIPLEO_CI_USR_PATH="${VIRTUAL_ENV:-/usr}" +export TRIPLEO_ANSIBLE_WORKPATH="${TRIPLEO_CI_USR_PATH}/share/ansible" +export ANSIBLE_ACTION_PLUGINS="${TRIPLEO_ANSIBLE_WORKPATH}/plugins/action" +export ANSIBLE_CALLBACK_PLUGINS="${TRIPLEO_ANSIBLE_WORKPATH}/plugins/callback" +export ANSIBLE_FILTER_PLUGINS="${TRIPLEO_ANSIBLE_WORKPATH}/plugins/filter" +export ANSIBLE_LIBRARY="${TRIPLEO_ANSIBLE_WORKPATH}/plugins/modules" +export ANSIBLE_MODULE_UTILS="${TRIPLEO_ANSIBLE_WORKPATH}/plugins/module_utils" +export ANSIBLE_ROLES_PATH="${TRIPLEO_ANSIBLE_WORKPATH}/roles" +export ROLE_REPOS="tripleo-common ansible/roles" + +echo "print exported variables" +set | grep -i TRIPLEO +set | grep -i ANSIBLE + +echo "list files in ansible role path, ${TRIPLEO_ANSIBLE_WORKPATH}/roles" +ls -la "${TRIPLEO_ANSIBLE_WORKPATH}/roles" + +# Ensure that the roles from tripleo-common and tripleo-ansible installed +# from the venv are available in the roles path +# The tripleo-common role path can be found here: +# https://opendev.org/openstack/tripleo-common/src/branch/master/tripleo_common/actions/ansible.py +for ROLE_REPO in $ROLE_REPOS; do + if [[ "${TRIPLEO_CI_USR_PATH}" != '/usr' && -d "${TRIPLEO_CI_USR_PATH}/share/${ROLE_REPO}" ]]; then + # Check if the target directory exists and is not a symlink + if [[ -d "/usr/share/${ROLE_REPO}" && ! -L "/usr/share/${ROLE_REPO}" ]]; then + echo "Creating a backup of /usr/share/${ROLE_REPO}.bak" + sudo mv /usr/share/${ROLE_REPO} /usr/share/${ROLE_REPO}.bak + fi + # Link our venv'd ${ROLE_REPO} files into the root path. + echo -e "Linking ${TRIPLEO_CI_USR_PATH}/share/${ROLE_REPO} to /usr/share/${ROLE_REPO}" + sudo ln -sf ${TRIPLEO_CI_USR_PATH}/share/${ROLE_REPO} /usr/share/${ROLE_REPO} + fi +done + +### build +openstack tripleo container image build \ +{% if push_containers|bool %} + --push \ +{% endif %} +{% if buildcontainers_authfile_path is defined %} + --authfile {{ buildcontainers_authfile_path }} \ +{% endif %} +{% if distro is defined %} + --distro {{ distro }} \ +{% endif %} +{% if registry_namespace is defined %} + --namespace {{ registry_namespace }} \ +{% endif%} +{% if push_registry is defined %} + --registry {{ push_registry }} \ +{% endif %} +{% if rhel_modules is defined %} + --rhel-modules {{ rhel_modules | join(",") }} \ +{% endif %} +{% set branch = osp_branch|default(ci_branch) %} +{% if branch in exclude_containers %} +{% for item in exclude_containers[branch] %} + --exclude {{ item }} \ +{% endfor %} +{% endif %} + --tag {{ version_hash }}{{ arch_tag | default('') }}\ + --base {{ containers_base_image | default('ubi8') }} \ + --prefix {{ container_name_prefix }} \ + --config-file {{ openstack_git_root }}/{% if zuul_internal is defined %}openstack-{% endif %}tripleo-common/container-images/tripleo_containers.yaml \ + --config-path {{ openstack_git_root }}/{% if zuul_internal is defined %}openstack-{% endif %}tripleo-common/container-images \ + --work-dir /tmp/container-builds \ +{% if build_timeout is defined %} + --build-timeout {{ build_timeout }} \ +{% endif %} + --debug diff --git a/tox.ini b/tox.ini index 7790c01c4..8a5c3a426 100644 --- a/tox.ini +++ b/tox.ini @@ -19,7 +19,7 @@ setenv = PYTHONWARNINGS=ignore:DEPRECATION::pip._internal.cli.base_command PIP_DISABLE_PIP_VERSION_CHECK=1 TEST_PARAMS=--cov=emit_releases_file -k "not molecule" - molecule: TEST_PARAMS=-ra -k molecule + molecule: TEST_PARAMS=-ra -k molecule --ignore=roles/build-containers/files passenv = ANSIBLE_* CURL_CA_BUNDLE