Split the arch building and pushing separately
When building multi-arch it's done in parallel which can result in the same layer being pushed at the same time, which is bad for the registries. Instead, build everything in paralle, then push each arch independently, then push all the arches again to cause the manifest to be written and pushed properly. Change-Id: I8036a9b4d4c515c20a05994741540b999e7cbcae
This commit is contained in:
parent
2c00634e73
commit
b211a26d0b
@ -1,36 +1,54 @@
|
||||
- name: Set up siblings
|
||||
include_tasks: siblings.yaml
|
||||
|
||||
- name: Build a docker image
|
||||
command: >-
|
||||
docker buildx build {{ zj_image.path | default('.') }} -f {{ zj_image.dockerfile | default(docker_dockerfile) }}
|
||||
--platform={{ zj_image.arch | join(',') }}
|
||||
{% if zj_image.target | default(false) -%}
|
||||
--target {{ zj_image.target }}
|
||||
{% endif -%}
|
||||
{% for build_arg in zj_image.build_args | default([]) -%}
|
||||
--build-arg {{ build_arg }}
|
||||
{% endfor -%}
|
||||
{% if zj_image.siblings | default(false) -%}
|
||||
--build-arg "ZUUL_SIBLINGS={{ zj_image.siblings | join(' ') }}"
|
||||
{% endif -%}
|
||||
{% for tag in zj_image.tags | default(['latest']) -%}
|
||||
{% if zuul.change | default(false) -%}
|
||||
--tag {{ buildset_registry_alias }}:{{ buildset_registry.port }}/{{ zj_image.repository }}:change_{{ zuul.change }}_{{ tag }}
|
||||
- name: Set base docker build command
|
||||
set_fact:
|
||||
docker_buildx_command: >-
|
||||
docker buildx build {{ zj_image.path | default('.') }} -f {{ zj_image.dockerfile | default(docker_dockerfile) }}
|
||||
{% if zj_image.target | default(false) -%}
|
||||
--target {{ zj_image.target }}
|
||||
{% endif -%}
|
||||
--tag {{ buildset_registry_alias }}:{{ buildset_registry.port }}/{{ zj_image.repository }}:{{ tag }}
|
||||
{% endfor -%}
|
||||
{% for label in zj_image.labels | default([]) -%}
|
||||
--label "{{ label }}"
|
||||
{% endfor %}
|
||||
--label "org.zuul-ci.change={{ zuul.change }}"
|
||||
--label "org.zuul-ci.change_url={{ zuul.change_url }}"
|
||||
--push
|
||||
{% for build_arg in zj_image.build_args | default([]) -%}
|
||||
--build-arg {{ build_arg }}
|
||||
{% endfor -%}
|
||||
{% if zj_image.siblings | default(false) -%}
|
||||
--build-arg "ZUUL_SIBLINGS={{ zj_image.siblings | join(' ') }}"
|
||||
{% endif -%}
|
||||
{% for tag in zj_image.tags | default(['latest']) -%}
|
||||
{% if zuul.change | default(false) -%}
|
||||
--tag {{ buildset_registry_alias }}:{{ buildset_registry.port }}/{{ zj_image.repository }}:change_{{ zuul.change }}_{{ tag }}
|
||||
{% endif -%}
|
||||
--tag {{ buildset_registry_alias }}:{{ buildset_registry.port }}/{{ zj_image.repository }}:{{ tag }}
|
||||
{% endfor -%}
|
||||
{% for label in zj_image.labels | default([]) -%}
|
||||
--label "{{ label }}"
|
||||
{% endfor %}
|
||||
--label "org.zuul-ci.change={{ zuul.change }}"
|
||||
--label "org.zuul-ci.change_url={{ zuul.change_url }}"
|
||||
|
||||
- name: Build images for all arches
|
||||
command: "{{ docker_buildx_command }} --platform={{ zj_image.arch | join(',') }}"
|
||||
args:
|
||||
chdir: "{{ zuul_work_dir }}/{{ zj_image.context }}"
|
||||
environment:
|
||||
DOCKER_CLI_EXPERIMENTAL: enabled
|
||||
|
||||
- name: Push arch-specific layers one at a time
|
||||
command: "{{ docker_buildx_command }} --platform={{ zj_arch }} --push"
|
||||
args:
|
||||
chdir: "{{ zuul_work_dir }}/{{ zj_image.context }}"
|
||||
environment:
|
||||
DOCKER_CLI_EXPERIMENTAL: enabled
|
||||
loop: '{{ zj_image.arch }}'
|
||||
loop_control:
|
||||
loop_var: zj_arch
|
||||
|
||||
- name: Push final to buildset registry
|
||||
command: "{{ docker_buildx_command }} --platform={{ zj_image.arch | join(',') }} --push"
|
||||
args:
|
||||
chdir: "{{ zuul_work_dir }}/{{ zj_image.context }}"
|
||||
environment:
|
||||
DOCKER_CLI_EXPERIMENTAL: enabled
|
||||
retries: 3
|
||||
|
||||
- name: Pull images from buildset registry
|
||||
command: >-
|
||||
|
Loading…
x
Reference in New Issue
Block a user