diff --git a/test-infra/image-builder/Makefile b/test-infra/image-builder/Makefile index 82dba6428..4e02388ff 100644 --- a/test-infra/image-builder/Makefile +++ b/test-infra/image-builder/Makefile @@ -1,2 +1,8 @@ deploy: 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 diff --git a/test-infra/image-builder/README.md b/test-infra/image-builder/README.md index 94d3ba027..c45c992f3 100644 --- a/test-infra/image-builder/README.md +++ b/test-infra/image-builder/README.md @@ -55,3 +55,24 @@ make docker_password= 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. + +## 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. diff --git a/test-infra/image-builder/roles/kubevirt-images/defaults/main.yml b/test-infra/image-builder/roles/kubevirt-images/defaults/main.yml index e4db344c9..3231f91c9 100644 --- a/test-infra/image-builder/roles/kubevirt-images/defaults/main.yml +++ b/test-infra/image-builder/roles/kubevirt-images/defaults/main.yml @@ -4,6 +4,8 @@ images_dir: /images/base docker_user: kubespray+buildvmimages docker_host: quay.io registry: quay.io/kubespray +kubevirt_images_push: true +kubevirt_images_selected: [] images: ubuntu-2004: diff --git a/test-infra/image-builder/roles/kubevirt-images/tasks/main.yml b/test-infra/image-builder/roles/kubevirt-images/tasks/main.yml index c54be15c6..22fe1da35 100644 --- a/test-infra/image-builder/roles/kubevirt-images/tasks/main.yml +++ b/test-infra/image-builder/roles/kubevirt-images/tasks/main.yml @@ -1,58 +1,71 @@ --- -- name: Create image directory - file: - state: directory - path: "{{ images_dir }}" - mode: "0755" +- name: Build kubevirt images + vars: + kubevirt_images_to_build: "{{ images | dict2items if kubevirt_images_selected | length == 0 else ([images] | community.general.keep_keys(target=kubevirt_images_selected))[0] | dict2items }}" + block: + - 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 - get_url: - url: "{{ item.value.url }}" - dest: "{{ images_dir }}/{{ item.value.filename }}" - checksum: "{{ item.value.checksum }}" - mode: "0644" - loop: "{{ images | dict2items }}" + - name: Create image directory + file: + state: directory + path: "{{ images_dir }}" + mode: "0755" -- name: Unxz compressed images - command: unxz --force {{ images_dir }}/{{ item.value.filename }} - loop: "{{ images | dict2items }}" - when: - - item.value.filename.endswith('.xz') + - name: Download images files + get_url: + url: "{{ item.value.url }}" + dest: "{{ images_dir }}/{{ item.value.filename }}" + checksum: "{{ item.value.checksum }}" + mode: "0644" + loop: "{{ kubevirt_images_to_build }}" -- name: Convert images which is not in qcow2 format - command: qemu-img convert -O qcow2 {{ images_dir }}/{{ item.value.filename.rstrip('.xz') }} {{ images_dir }}/{{ item.key }}.qcow2 - loop: "{{ images | dict2items }}" - when: - - not (item.value.converted | bool) + - name: Unxz compressed images + command: unxz --force {{ images_dir }}/{{ item.value.filename }} + loop: "{{ kubevirt_images_to_build }}" + when: + - item.value.filename.endswith('.xz') -- name: Make sure all images are ending with qcow2 - command: cp {{ images_dir }}/{{ item.value.filename.rstrip('.xz') }} {{ images_dir }}/{{ item.key }}.qcow2 - loop: "{{ images | dict2items }}" - when: - - item.value.converted | bool + - name: Convert images which is not in qcow2 format + command: qemu-img convert -O qcow2 {{ images_dir }}/{{ item.value.filename.rstrip('.xz') }} {{ images_dir }}/{{ item.key }}.qcow2 + loop: "{{ kubevirt_images_to_build }}" + when: + - not (item.value.converted | bool) -- name: Resize images - command: qemu-img resize {{ images_dir }}/{{ item.key }}.qcow2 +8G - loop: "{{ images | dict2items }}" + - name: Make sure all images are ending with qcow2 + command: cp {{ images_dir }}/{{ item.value.filename.rstrip('.xz') }} {{ images_dir }}/{{ item.key }}.qcow2 + loop: "{{ kubevirt_images_to_build }}" + when: + - item.value.converted | bool -# STEP 2: Include the images inside a container -- name: Template default Dockerfile - template: - src: Dockerfile - dest: "{{ images_dir }}/Dockerfile" - mode: "0644" + - name: Resize images + command: qemu-img resize {{ images_dir }}/{{ item.key }}.qcow2 +8G + loop: "{{ kubevirt_images_to_build }}" -- name: Create docker images for each OS - command: docker build -t {{ registry }}/vm-{{ item.key }}:{{ item.value.tag }} --build-arg cloud_image="{{ item.key }}.qcow2" {{ images_dir }} - loop: "{{ images | dict2items }}" + # STEP 2: Include the images inside a container + - name: Template default Dockerfile + template: + src: Dockerfile + dest: "{{ images_dir }}/Dockerfile" + mode: "0644" -- name: Docker login - command: docker login -u="{{ docker_user }}" -p="{{ docker_password }}" "{{ docker_host }}" + - name: Create docker images for each OS + 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 - command: docker push {{ registry }}/vm-{{ item.key }}:{{ item.value.tag }} - loop: "{{ images | dict2items }}" + - name: Docker login + command: docker login -u="{{ docker_user }}" -p="{{ docker_password }}" "{{ docker_host }}" + when: kubevirt_images_push -- name: Docker logout - command: docker logout -u="{{ docker_user }}" "{{ docker_host }}" + - name: Docker push image + 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