fix(environment): co-upgrade soname closure when installing installer tools

This commit is contained in:
2026-05-25 03:54:12 +02:00
parent e0ecf628cd
commit 0185797af9
2 changed files with 51 additions and 17 deletions

View File

@@ -9,6 +9,14 @@ environment_pacman_lock_timeout: 120
environment_pacman_retries: 4 environment_pacman_retries: 4
environment_pacman_retry_delay: 15 environment_pacman_retry_delay: 15
# Libraries the installer tools pull whose soname may have bumped past the ISO.
# Each library's installed reverse-dependencies are upgraded together with the
# tools so a current install onto an older ISO stays a consistent transaction
# instead of a partial upgrade. Extend if a future transition breaks the install.
environment_partial_upgrade_libs:
- nettle
- leancrypto
# PCI vendor IDs -> vendor codes used by hardware detection. # PCI vendor IDs -> vendor codes used by hardware detection.
# Only vendors that drive distinct firmware/driver packages are mapped. # Only vendors that drive distinct firmware/driver packages are mapped.
environment_pci_vendor_map: environment_pci_vendor_map:

View File

@@ -14,24 +14,52 @@
timeout: "{{ environment_pacman_lock_timeout }}" timeout: "{{ environment_pacman_lock_timeout }}"
changed_when: false changed_when: false
- name: Setup Pacman - name: Resolve installer tools for the target OS
when: not (custom_iso | bool)
ansible.builtin.set_fact:
environment_installer_tools: >-
{{
['glibc']
+ (['lua', 'dnf'] if os in ['almalinux', 'fedora', 'rhel', 'rocky'] else [])
+ (['debootstrap'] if os in ['debian', 'ubuntu', 'ubuntu-lts'] else [])
+ (['debian-archive-keyring'] if os == 'debian' else [])
+ (['ubuntu-keyring'] if os in ['ubuntu', 'ubuntu-lts'] else [])
}}
- name: Query reverse-dependencies of transition-sensitive libraries
when: when:
- not (custom_iso | bool) - not (custom_iso | bool)
- item.os is not defined or os in item.os - environment_partial_upgrade_libs | length > 0
ansible.builtin.command: "pacman -Qi {{ item }}"
loop: "{{ environment_partial_upgrade_libs }}"
register: environment_revdep_query
changed_when: false
failed_when: false
# Co-upgrade each transition library with its installed reverse-deps so a soname
# bump moves the whole closure in one transaction, not a partial upgrade.
- name: Setup Pacman
when: not (custom_iso | bool)
vars:
environment_pacman_closure: >-
{{
(
environment_installer_tools
+ (environment_revdep_query.results | default([])
| selectattr('rc', 'equalto', 0) | map(attribute='item') | list)
+ (environment_revdep_query.results | default([])
| selectattr('rc', 'equalto', 0) | map(attribute='stdout')
| map('regex_search', 'Required By\s*:\s*(.+)', '\1')
| map('first') | map('split') | flatten)
)
| reject('equalto', 'None') | unique
}}
community.general.pacman: community.general.pacman:
update_cache: true update_cache: true
force: true name: "{{ environment_pacman_closure }}"
name: "{{ item.name }}"
state: latest state: latest
loop: register: environment_tool_install
- { name: glibc } until: environment_tool_install is succeeded
- { name: lua, os: [almalinux, fedora, rhel, rocky] }
- { name: dnf, os: [almalinux, fedora, rhel, rocky] }
- { name: debootstrap, os: [debian, ubuntu, ubuntu-lts] }
- { name: debian-archive-keyring, os: [debian] }
- { name: ubuntu-keyring, os: [ubuntu, ubuntu-lts] }
loop_control:
label: "{{ item.name }}"
retries: "{{ environment_pacman_retries }}" retries: "{{ environment_pacman_retries }}"
delay: "{{ environment_pacman_retry_delay }}" delay: "{{ environment_pacman_retry_delay }}"
@@ -76,10 +104,8 @@
opts: "ro,loop" opts: "ro,loop"
state: mounted state: mounted
# Security note: RPM Sequoia signature policy is relaxed to allow # RPM Sequoia signature policy is relaxed because the Arch ISO host does not
# bootstrapping RHEL-family distros from the Arch ISO, where the # trust target-distro GPG keys; the target's own rpm re-verifies after reboot.
# host rpm/dnf does not trust target distro GPG keys. Package
# integrity is verified by the target system's own rpm after reboot.
- name: Create RPM macros directory - name: Create RPM macros directory
when: is_rhel | bool when: is_rhel | bool
ansible.builtin.file: ansible.builtin.file: