From 29d55cbf175947bf002ac5cd68b70899527859c8 Mon Sep 17 00:00:00 2001 From: Ian Wienand Date: Mon, 9 Dec 2019 10:34:07 +1100 Subject: [PATCH] build-container-image: support sibling copy Add support for "siblings:" to the build-container-image role. This is a port of change I079d823e7194e15b1b496aea0f53f70f6b563f02 from the build-docker-image role. Note that we found a couple of issues with this role, fixed with I9f3b0a1f71d20cf7511f224648dd2fa51a039015. However, build-container-image has merged before this fix, so thess fixes now follow this change. To avoid squashing this into something confusing this update incorporates those fixes. However testing is left to the follow-on change because the extant build-docker-image role would fail the corrected testing. They should be merged roughly together. One minor thing is the removal of an additional duplicated "tags:" entry from the variable documentation. Change-Id: I71e2f2ab29446bd113644ce8c75378b8d3ef8ba6 --- roles/build-container-image/common.rst | 11 +++-- roles/build-container-image/tasks/build.yaml | 50 ++++++++++++++++++++ roles/build-container-image/tasks/main.yaml | 20 ++------ 3 files changed, 63 insertions(+), 18 deletions(-) create mode 100644 roles/build-container-image/tasks/build.yaml diff --git a/roles/build-container-image/common.rst b/roles/build-container-image/common.rst index 3bbfedaaa..b9a3d0eba 100644 --- a/roles/build-container-image/common.rst +++ b/roles/build-container-image/common.rst @@ -133,10 +133,15 @@ role to install Docker or Podman before using these roles. A list of tags to be added to the image when promoted. - .. zuul:rolevar:: tags + .. zuul:rolevar:: siblings :type: list - :default: ['latest'] + :default: [] - A list of tags to be added to the image when promoted. + A list of sibling projects to be copied into + ``{{zuul_work_dir}}/.zuul-siblings``. This can be useful to + collect multiple projects to be installed within the same Docker + context. A ``-build-arg`` called ``ZUUL_SIBLINGS`` will be + added with each sibling project. Note that projects here must + be listed in ``required-projects``. .. _anchors: https://yaml.org/spec/1.2/spec.html#&%20anchor// diff --git a/roles/build-container-image/tasks/build.yaml b/roles/build-container-image/tasks/build.yaml new file mode 100644 index 000000000..b5e5d0bf1 --- /dev/null +++ b/roles/build-container-image/tasks/build.yaml @@ -0,0 +1,50 @@ +- name: Check sibling directory + stat: + path: '{{ zuul_work_dir }}/{{ item.context }}/.zuul-siblings' + register: _dot_zuul_siblings + +# This should have been cleaned up; multiple builds may specify +# different siblings to include so we need to start fresh. +- name: Check for clean build + assert: + that: not _dot_zuul_siblings.stat.exists + +- name: Create sibling source directory + file: + path: '{{ zuul_work_dir }}/{{ item.context }}/.zuul-siblings' + state: directory + mode: 0755 + when: item.siblings is defined + +- name: Copy sibling source directories + command: + cmd: 'cp --parents -r {{ sibling }} /home/zuul/{{ zuul_work_dir }}/{{ item.context }}/.zuul-siblings' + chdir: '~/src' + loop: '{{ item.siblings }}' + loop_control: + loop_var: sibling + when: item.siblings is defined + +- name: Build a container image + command: >- + {{ container_command }} build {{ item.path | default('.') }} {% if containerfile %}-f {{ containerfile }}{% endif %} + {% if item.target | default(false) -%} + --target {{ item.target }} + {% endif -%} + {% for build_arg in item.build_args | default([]) -%} + --build-arg {{ build_arg }} + {% endfor -%} + {% if items.siblings | default(false) -%} + --build-arg "ZUUL_SIBLINGS={{ item.siblings | join(' ') }}" + {% endif -%} + {% for tag in item.tags | default(['latest']) -%} + --tag {{ item.repository }}:change_{{ zuul.change }}_{{ tag }} + --tag {{ item.repository }}:{{ tag }} + {% endfor -%} + args: + chdir: "{{ zuul_work_dir }}/{{ item.context }}" + +- name: Cleanup sibling source directory + file: + path: '{{ zuul_work_dir }}/.zuul-siblings' + state: absent diff --git a/roles/build-container-image/tasks/main.yaml b/roles/build-container-image/tasks/main.yaml index c9296c447..42dfd716a 100644 --- a/roles/build-container-image/tasks/main.yaml +++ b/roles/build-container-image/tasks/main.yaml @@ -4,25 +4,15 @@ set_fact: buildset_registry: "{{ (lookup('file', zuul.executor.work_root + '/results.json') | from_json)['buildset_registry'] }}" ignore_errors: true + - name: Set container filename arg set_fact: containerfile: "{{ item.container_filename|default(container_filename|default('')) }}" -- name: Build a container image - command: >- - {{ container_command }} build {{ item.path | default('.') }} {% if containerfile %}-f {{ containerfile }}{% endif %} - {% if item.target | default(false) -%} - --target {{ item.target }} - {% endif -%} - {% for build_arg in item.build_args | default([]) -%} - --build-arg {{ build_arg }} - {% endfor -%} - {% for tag in item.tags | default(['latest']) -%} - --tag {{ item.repository }}:change_{{ zuul.change }}_{{ tag }} - --tag {{ item.repository }}:{{ tag }} - {% endfor -%} - args: - chdir: "{{ zuul_work_dir }}/{{ item.context }}" + +- name: Build container images + include_tasks: build.yaml loop: "{{ container_images }}" + # Docker, and therefore skopeo and podman, don't understand docker # push [1234:5678::]:5000/image/path:tag so we set up /etc/hosts with # a registry alias name to support ipv6 and 4.