image-builder:- add build-only validation mode and image selection (#13128)

This commit is contained in:
Srishti Jaiswal
2026-04-10 12:30:21 +05:30
committed by GitHub
parent 00a0479078
commit af2250d64e
4 changed files with 88 additions and 46 deletions

View File

@@ -1,2 +1,8 @@
deploy: deploy:
ansible-playbook -i hosts.ini -e docker_password=$(docker_password) cluster.yml ansible-playbook -i hosts.ini -e docker_password=$(docker_password) cluster.yml
validate:
ansible-playbook -i hosts.ini -e '{"kubevirt_images_push": false}' cluster.yml
validate-single:
ansible-playbook -i hosts.ini -e '{"kubevirt_images_push": false, "kubevirt_images_selected": ["$(image_name)"]}' cluster.yml

View File

@@ -55,3 +55,24 @@ make docker_password=<quay-robot-token>
3. Submit a PR with the `defaults/main.yml` change so CI can use the new image. 3. Submit a PR with the `defaults/main.yml` change so CI can use the new image.
See [#12379](https://github.com/kubernetes-sigs/kubespray/pull/12379) for an example. See [#12379](https://github.com/kubernetes-sigs/kubespray/pull/12379) for an example.
## CI Validation
### Build only
```bash
cd test-infra/image-builder/
make validate
```
### Build only for one image
```bash
cd test-infra/image-builder/
make validate-single image_name=ubuntu-2404
```
## Runtime Variables
- `kubevirt_images_push` (default: `true`): when `false`, skip docker login/push/logout.
- `kubevirt_images_selected` (default: `[]`): list of image keys to build. Empty list builds all images.

View File

@@ -4,6 +4,8 @@ images_dir: /images/base
docker_user: kubespray+buildvmimages docker_user: kubespray+buildvmimages
docker_host: quay.io docker_host: quay.io
registry: quay.io/kubespray registry: quay.io/kubespray
kubevirt_images_push: true
kubevirt_images_selected: []
images: images:
ubuntu-2004: ubuntu-2004:

View File

@@ -1,58 +1,71 @@
--- ---
- name: Create image directory - name: Build kubevirt images
file: vars:
state: directory kubevirt_images_to_build: "{{ images | dict2items if kubevirt_images_selected | length == 0 else ([images] | community.general.keep_keys(target=kubevirt_images_selected))[0] | dict2items }}"
path: "{{ images_dir }}" block:
mode: "0755" - name: Validate selected image names
assert:
that:
- kubevirt_images_selected | length == 0 or kubevirt_images_to_build | length > 0
fail_msg: "No matching images found in `images` for `kubevirt_images_selected={{ kubevirt_images_selected }}`"
- name: Download images files - name: Create image directory
get_url: file:
url: "{{ item.value.url }}" state: directory
dest: "{{ images_dir }}/{{ item.value.filename }}" path: "{{ images_dir }}"
checksum: "{{ item.value.checksum }}" mode: "0755"
mode: "0644"
loop: "{{ images | dict2items }}"
- name: Unxz compressed images - name: Download images files
command: unxz --force {{ images_dir }}/{{ item.value.filename }} get_url:
loop: "{{ images | dict2items }}" url: "{{ item.value.url }}"
when: dest: "{{ images_dir }}/{{ item.value.filename }}"
- item.value.filename.endswith('.xz') checksum: "{{ item.value.checksum }}"
mode: "0644"
loop: "{{ kubevirt_images_to_build }}"
- name: Convert images which is not in qcow2 format - name: Unxz compressed images
command: qemu-img convert -O qcow2 {{ images_dir }}/{{ item.value.filename.rstrip('.xz') }} {{ images_dir }}/{{ item.key }}.qcow2 command: unxz --force {{ images_dir }}/{{ item.value.filename }}
loop: "{{ images | dict2items }}" loop: "{{ kubevirt_images_to_build }}"
when: when:
- not (item.value.converted | bool) - item.value.filename.endswith('.xz')
- name: Make sure all images are ending with qcow2 - name: Convert images which is not in qcow2 format
command: cp {{ images_dir }}/{{ item.value.filename.rstrip('.xz') }} {{ images_dir }}/{{ item.key }}.qcow2 command: qemu-img convert -O qcow2 {{ images_dir }}/{{ item.value.filename.rstrip('.xz') }} {{ images_dir }}/{{ item.key }}.qcow2
loop: "{{ images | dict2items }}" loop: "{{ kubevirt_images_to_build }}"
when: when:
- item.value.converted | bool - not (item.value.converted | bool)
- name: Resize images - name: Make sure all images are ending with qcow2
command: qemu-img resize {{ images_dir }}/{{ item.key }}.qcow2 +8G command: cp {{ images_dir }}/{{ item.value.filename.rstrip('.xz') }} {{ images_dir }}/{{ item.key }}.qcow2
loop: "{{ images | dict2items }}" loop: "{{ kubevirt_images_to_build }}"
when:
- item.value.converted | bool
# STEP 2: Include the images inside a container - name: Resize images
- name: Template default Dockerfile command: qemu-img resize {{ images_dir }}/{{ item.key }}.qcow2 +8G
template: loop: "{{ kubevirt_images_to_build }}"
src: Dockerfile
dest: "{{ images_dir }}/Dockerfile"
mode: "0644"
- name: Create docker images for each OS # STEP 2: Include the images inside a container
command: docker build -t {{ registry }}/vm-{{ item.key }}:{{ item.value.tag }} --build-arg cloud_image="{{ item.key }}.qcow2" {{ images_dir }} - name: Template default Dockerfile
loop: "{{ images | dict2items }}" template:
src: Dockerfile
dest: "{{ images_dir }}/Dockerfile"
mode: "0644"
- name: Docker login - name: Create docker images for each OS
command: docker login -u="{{ docker_user }}" -p="{{ docker_password }}" "{{ docker_host }}" command: docker build -t {{ registry }}/vm-{{ item.key }}:{{ item.value.tag }} --build-arg cloud_image="{{ item.key }}.qcow2" {{ images_dir }}
loop: "{{ kubevirt_images_to_build }}"
- name: Docker push image - name: Docker login
command: docker push {{ registry }}/vm-{{ item.key }}:{{ item.value.tag }} command: docker login -u="{{ docker_user }}" -p="{{ docker_password }}" "{{ docker_host }}"
loop: "{{ images | dict2items }}" when: kubevirt_images_push
- name: Docker logout - name: Docker push image
command: docker logout -u="{{ docker_user }}" "{{ docker_host }}" command: docker push {{ registry }}/vm-{{ item.key }}:{{ item.value.tag }}
loop: "{{ kubevirt_images_to_build }}"
when: kubevirt_images_push
- name: Docker logout
command: docker logout -u="{{ docker_user }}" "{{ docker_host }}"
when: kubevirt_images_push