From 3e405fd08d2dbe81980663ca60e26f4a4ceeaf8f Mon Sep 17 00:00:00 2001
From: Rafael Guterres Jeffman <rjeffman@redhat.com>
Date: Thu, 31 Oct 2024 09:23:30 -0300
Subject: [PATCH] upstream CI: Use Azure 'loops' to create stages

This patch modify the pipelines to create stages using the 'each'
expression on Azure pipelines, so that the configuration and the list of
distributions can be set using variables.

Testing CentOS 8 Stream and Galaxy collections still need to be handled
in a separate group, although, the pipeline configuration becomes easily
changed, specially when updating Ansible versions.
---
 infra/azure/azure-pipelines.yml           |  60 ++++----
 infra/azure/build-containers.yml          |  45 ++----
 infra/azure/nightly.yml                   | 173 ++++++++--------------
 infra/azure/pr-pipeline.yml               |  66 +++------
 infra/azure/templates/build_container.yml |   4 +-
 5 files changed, 119 insertions(+), 229 deletions(-)

diff --git a/infra/azure/azure-pipelines.yml b/infra/azure/azure-pipelines.yml
index 7456b62..8b915b4 100644
--- a/infra/azure/azure-pipelines.yml
+++ b/infra/azure/azure-pipelines.yml
@@ -5,72 +5,64 @@ trigger:
 pool:
   vmImage: 'ubuntu-20.04'
 
-stages:
+variables:
+  ansible_version: "-core >=2.16,<2.17"
+  ansible_latest: "-core"
+  ansible_minimum: "-core <2.16"
+  distros: "fedora-latest,c9s,fedora-rawhide"
 
-# Fedora
+stages:
 
-- stage: Fedora_Ansible_Latest
+- stage: fedora_latest_ansible_latest
   dependsOn: []
   jobs:
   - template: templates/group_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
       distro: fedora-latest
-      ansible_version: "-core"
+      ansible_version: ${{ variables.ansible_latest }}
       skip_git_test: true
 
-# Fedora
-
-- stage: Fedora_Ansible_min_supported
+- stage: fedora_latest_ansible_2_15
   dependsOn: []
   jobs:
   - template: templates/group_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
       distro: fedora-latest
-      ansible_version: "-core <2.16"
+      ansible_version: ${{ variables.ansbile_minimum }}
       skip_git_test: true
 
-# Fedora
+# Supported distros
 
-- stage: Fedora_Latest
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: fedora-latest
-      skip_git_test: true
-      ansible_version: "-core >=2.16,<2.17"
+- ${{ each distro in split(variables.distros, ',') }}:
+  - stage: ${{ replace(distro, '-', '_') }}_ansible_2_16
+    dependsOn: []
+    jobs:
+    - template: templates/group_tests.yml
+      parameters:
+        build_number: $(Build.BuildNumber)
+        distro: ${{ distro }}
+        ansible_version: ${{ variables.ansible_version }}
+        skip_git_test: true
+        test_galaxy: false
 
 # Galaxy on Fedora
 
-- stage: Galaxy_Fedora_Latest
+- stage: galaxy_fedora_latest_ansible_2_16
   dependsOn: []
   jobs:
   - template: templates/group_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
       distro: fedora-latest
-      ansible_version: "-core >=2.16,<2.17"
+      ansible_version: ${{ variables.ansible_version }}
       skip_git_test: true
       test_galaxy: true
 
-# CentOS 9 Stream
-
-- stage: CentOS_9_Stream
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: c9s
-      ansible_version: "-core >=2.16,<2.17"
-      skip_git_test: true
-
-# CentOS 8 Stream
+# CentOS 8 Stream, latest supported Ansible version.
 
-- stage: CentOS_8_Stream
+- stage: c8s_ansible_2_16
   dependsOn: []
   jobs:
   - template: templates/group_tests.yml
diff --git a/infra/azure/build-containers.yml b/infra/azure/build-containers.yml
index a98b2e1..8f6b57d 100644
--- a/infra/azure/build-containers.yml
+++ b/infra/azure/build-containers.yml
@@ -1,5 +1,4 @@
 ---
-
 schedules:
 - cron: "0 0 * * 0"
   displayName: Weekly Sunday midnight build
@@ -13,46 +12,24 @@ trigger: none
 pool:
   vmImage: 'ubuntu-24.04'
 
+variables: { distros: "fedora-latest,fedora-rawhide,c9s" }
+
 stages:
 
+- ${{ each distro in split(variables.distros, ',') }}:
+  - stage: build_${{ join('_', split(distro, '-')) }}
+    dependsOn: []
+    jobs:
+    - template: templates/build_container.yml
+      parameters:
+        distro: ${{ distro }}
+
+# Special case for CentOS 8 Stream
 - stage: CentOS_8_Stream
   dependsOn: []
   jobs:
   - template: templates/build_container.yml
     parameters:
-      job_name_suffix: C8S
       distro: c8s
       # ansible-core 2.17+ cannot be used to deploy on CentOS 8 Stream.
       ansible_core_version: "<2.17"
-
-- stage: CentOS_9_Stream
-  dependsOn: []
-  jobs:
-  - template: templates/build_container.yml
-    parameters:
-      job_name_suffix: C9S
-      distro: c9s
-
-- stage: CentOS_10_Stream
-  dependsOn: []
-  jobs:
-  - template: templates/build_container.yml
-    parameters:
-      job_name_suffix: C10S
-      distro: c10s
-
-- stage: Fedora_Latest
-  dependsOn: []
-  jobs:
-  - template: templates/build_container.yml
-    parameters:
-      job_name_suffix: FedoraLatest
-      distro: fedora-latest
-
-- stage: Fedora_Rawhide
-  dependsOn: []
-  jobs:
-  - template: templates/build_container.yml
-    parameters:
-      job_name_suffix: FedoraRawhide
-      distro: fedora-rawhide
diff --git a/infra/azure/nightly.yml b/infra/azure/nightly.yml
index 671571a..ded5877 100644
--- a/infra/azure/nightly.yml
+++ b/infra/azure/nightly.yml
@@ -12,115 +12,68 @@ trigger: none
 pool:
   vmImage: 'ubuntu-20.04'
 
-stages:
-
-# Fedora
-
-- stage: fedora_latest_Ansible_Core_2_15
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: fedora-latest
-      ansible_version: "-core >=2.15,<2.16"
-      skip_git_test: true
-
-- stage: fedora_latest_Ansible_Core_2_16
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: fedora-latest
-      ansible_version: ""
-      skip_git_test: true
-
-- stage: fedora_latest_Ansible_Core_2_17
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: fedora-latest
-      ansible_version: "-core >=2.17"
-      skip_git_test: true
-
-# Galaxy on Fedora
-
-- stage: Galaxy_fedora_latest_Ansible_Core_2_17
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: fedora-latest
-      ansible_version: "-core >=2.17,<2.18"
-      skip_git_test: true
-      test_galaxy: true
-
-# Fedora Rawhide
+variables:
+  # We need to have two sets, as c8s is not supported by all ansible versions
+  recent_distros: "fedora-latest,fedora-rawhide,c9s"
+  distros: "fedora-latest,fedora-rawhide,c9s,c8s"
+  ansible_latest: "-core"
+  ansible_minimum: "-core <2.16"
+  ansible_version: "-core >=2.16,<2.17"
 
-- stage: fedora_rawhide_Ansible_Core_2_17
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: fedora-rawhide
-      ansible_version: "-core >=2.17,<2.18"
-      skip_git_test: true
-
-# CentoOS 9 Stream
-
-- stage: c9s_Ansible_Core_2_15
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: c9s
-      ansible_version: "-core >=2.15,<2.16"
-      skip_git_test: true
-
-- stage: c9s_Ansible_Core_2_16
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: c9s
-      ansible_version: "-core >=2.16,<2.17"
-      skip_git_test: true
-
-- stage: c9s_Ansible_Core_2_17
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: c9s
-      ansible_version: "-core >=2.17,<2.18"
-      skip_git_test: true
-
-# CentOS 8 Stream only works up to ansible-core 2.16.z
-
-- stage: c8s_Ansible_Core_2_15
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: c8s
-      ansible_version: "-core >=2.15,<2.16"
-      skip_git_test: true
+stages:
 
-- stage: c8s_Ansible_Core_2_16
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: c8s
-      ansible_version: "-core >=2.16,<2.17"
-      skip_git_test: true
+# Minimum ansible
+
+- ${{ each distro in split(variables.distros, ',') }}:
+  - stage: ${{ replace(distro, '-', '_') }}_ansible_2_15
+    dependsOn: []
+    jobs:
+    - template: templates/group_tests.yml
+      parameters:
+        build_number: $(Build.BuildNumber)
+        distro: fedora-latest
+        ansible_version: ${{ variables.ansible_minimum }}
+        skip_git_test: true
+        test_galaxy: false
+
+# Latest ansible
+
+- ${{ each distro in split(variables.recent_distros, ',') }}:
+  - stage: ${{ replace(distro, '-', '_') }}_ansible_latest
+    dependsOn: []
+    jobs:
+    - template: templates/group_tests.yml
+      parameters:
+        build_number: $(Build.BuildNumber)
+        distro: ${{ distro }}
+        ansible_version: ${{ variables.ansible_latest }}
+        skip_git_test: true
+        test_galaxy: false
+
+# Selected ansible-core version
+
+- ${{ each distro in split(variables.distros, ',') }}:
+  - stage: ${{ replace(distro, '-', '_') }}_ansible_2_16
+    dependsOn: []
+    jobs:
+    - template: templates/group_tests.yml
+      parameters:
+        build_number: $(Build.BuildNumber)
+        distro: ${{ distro }}
+        ansible_version: ${{ variables.ansible_version }}
+        skip_git_test: true
+        test_galaxy: false
+
+# Galaxy collection with selected ansible-core version
+
+- ${{ each distro in split(variables.distros, ',') }}:
+  - stage: galaxy_${{ replace(distro, '-', '_') }}_asible_2_16
+    dependsOn: []
+    jobs:
+    - template: templates/group_tests.yml
+      parameters:
+        build_number: $(Build.BuildNumber)
+        distro: ${{ distro }}
+        ansible_version: ${{ variables.ansible_version }}
+        skip_git_test: true
+        test_galaxy: true
diff --git a/infra/azure/pr-pipeline.yml b/infra/azure/pr-pipeline.yml
index bc6e083..ea89f32 100644
--- a/infra/azure/pr-pipeline.yml
+++ b/infra/azure/pr-pipeline.yml
@@ -5,65 +5,35 @@ trigger:
 pool:
   vmImage: 'ubuntu-20.04'
 
+variables:
+  distros: "fedora-latest,c9s,c8s,fedora-rawhide"
+  ansible_version: "-core >=2.15,<2.16"
+
 stages:
 
-# Fedora
+# Test with repository in all distros
 
-- stage: Fedora_Latest
-  dependsOn: []
-  jobs:
-  - template: templates/run_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: fedora-latest
-      ansible_version: "-core >=2.15,<2.16"
-      skip_git_test: false
+- ${{ each distro in split(variables.distros, ',') }}:
+  - stage: ${{ replace(distro, '-', '_') }}_ansible_2_16
+    dependsOn: []
+    jobs:
+    - template: templates/run_tests.yml
+      parameters:
+        build_number: $(Build.BuildNumber)
+        distro: ${{ distro }}
+        ansible_version: ${{ variables.ansible_version }}
+        skip_git_test: false
+        test_galaxy: false
 
 # Galaxy on Fedora
 
-- stage: Galaxy_Fedora_Latest
+- stage: galaxy_fedora_latest_ansible_2_16
   dependsOn: []
   jobs:
   - template: templates/run_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
       distro: fedora-latest
-      ansible_version: "-core >=2.15,<2.16"
+      ansible_version: ${{ variables.ansible_version }}
       skip_git_test: false
       test_galaxy: true
-
-# CentOS 9 Stream
-
-- stage: CentOS_9_Stream
-  dependsOn: []
-  jobs:
-  - template: templates/run_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: c9s
-      ansible_version: "-core >=2.15,<2.16"
-      skip_git_test: false
-
-# CentOS 8 Stream
-
-- stage: CentOS_8_Stream
-  dependsOn: []
-  jobs:
-  - template: templates/run_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: c8s
-      ansible_version: "-core >=2.15,<2.16"
-      skip_git_test: false
-
-# Rawhide
-
-- stage: Fedora_Rawhide
-  dependsOn: []
-  jobs:
-  - template: templates/run_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: fedora-rawhide
-      ansible_version: "-core >=2.15,<2.16"
-      skip_git_test: false
diff --git a/infra/azure/templates/build_container.yml b/infra/azure/templates/build_container.yml
index 4fa0b46..e3c2bde 100644
--- a/infra/azure/templates/build_container.yml
+++ b/infra/azure/templates/build_container.yml
@@ -1,7 +1,5 @@
 ---
 parameters:
-  - name: job_name_suffix
-    type: string
   - name: distro
     type: string
   - name: python_version
@@ -11,7 +9,7 @@ parameters:
     default: ""
 
 jobs:
-- job: BuildTestImage${{ parameters.job_name_suffix }}
+- job: BuildTestImage_${{ join('_', split(parameters.distro, '-')) }}
   displayName: Build ${{ parameters.distro }} test container
   steps:
   - task: UsePythonVersion@0
-- 
GitLab