|
94 | 94 | exclude_list = [] |
95 | 95 | end |
96 | 96 |
|
| 97 | +# Force the use of the provision_service provisioner, if the --provision-service argument is present |
| 98 | +if ARGV.include?('--provision-service') |
| 99 | + provision_service_occurrences = ARGV.count { |arg| arg == '--provision-service' } |
| 100 | + raise 'the --provision-service argument should be present just one time in the command' unless provision_service_occurrences <= 1 |
| 101 | + |
| 102 | + # NOTE: that the below are the only available images for the provision service |
| 103 | + updated_platforms = { |
| 104 | + 'AlmaLinux-8' => 'almalinux-cloud/almalinux-8', |
| 105 | + 'CentOS-7' => 'centos-7', |
| 106 | + 'CentOS-8' => 'centos-stream-8', |
| 107 | + 'Rocky-8' => 'rocky-linux-cloud/rocky-linux-8', |
| 108 | + 'Debian-10' => 'debian-10', |
| 109 | + 'Debian-11' => 'debian-11', |
| 110 | + 'Ubuntu-20.04' => 'ubuntu-2004-lts', |
| 111 | + 'Ubuntu-22.04' => 'ubuntu-2204-lts' |
| 112 | + } |
| 113 | + |
| 114 | + updated_list = IMAGE_TABLE.dup.clone |
| 115 | + updated_list.merge!(updated_platforms) |
| 116 | + |
| 117 | + IMAGE_TABLE = updated_list.freeze |
| 118 | + DOCKER_PLATFORMS = {}.freeze |
| 119 | +end |
| 120 | + |
97 | 121 | metadata_path = ENV['TEST_MATRIX_FROM_METADATA'] || 'metadata.json' |
98 | 122 | metadata = JSON.parse(File.read(metadata_path)) |
99 | | -# Set platforms based on declared operating system support |
100 | | -metadata['operatingsystem_support'].sort_by { |a| a['operatingsystem'] }.each do |sup| |
101 | | - os = sup['operatingsystem'] |
102 | | - sup['operatingsystemrelease'].sort_by(&:to_i).each do |ver| |
103 | | - image_key = "#{os}-#{ver}" |
104 | | - |
105 | | - if IMAGE_TABLE.key?(image_key) && !exclude_list.include?(image_key.downcase) |
106 | | - matrix[:platforms] << { |
107 | | - label: image_key, |
108 | | - provider: 'provision::provision_service', |
109 | | - image: IMAGE_TABLE[image_key] |
110 | | - } |
111 | | - elsif DOCKER_PLATFORMS.key?(image_key) && !exclude_list.include?(image_key.downcase) |
112 | | - matrix[:platforms] << { |
113 | | - label: image_key, |
114 | | - provider: 'provision::docker', |
115 | | - image: DOCKER_PLATFORMS[image_key] |
116 | | - } |
| 123 | + |
| 124 | +# Allow the user to pass a file containing a custom matrix |
| 125 | +if ARGV.include?('--custom-matrix') |
| 126 | + custom_matrix_occurrences = ARGV.count { |arg| arg == '--custom-matrix' } |
| 127 | + raise '--custom-matrix argument should be present just one time in the command' unless custom_matrix_occurrences <= 1 |
| 128 | + |
| 129 | + file_path = ARGV[ARGV.find_index('--custom-matrix') + 1] |
| 130 | + raise 'no file path specified' if file_path.nil? |
| 131 | + |
| 132 | + begin |
| 133 | + custom_matrix = JSON.parse(File.read(file_path)) |
| 134 | + rescue StandardError => e |
| 135 | + case e |
| 136 | + when JSON::ParserError |
| 137 | + raise 'the matrix must be an array of valid JSON objects' |
| 138 | + when Errno::ENOENT |
| 139 | + raise "File not found: #{e.message}" |
117 | 140 | else |
118 | | - puts "::warning::#{image_key} was excluded from testing" if exclude_list.include?(image_key.downcase) |
119 | | - puts "::warning::Cannot find image for #{image_key}" unless exclude_list.include?(image_key.downcase) |
| 141 | + raise "An unknown exception occurred: #{e.message}" |
| 142 | + end |
| 143 | + end |
| 144 | + custom_matrix.each do |platform| |
| 145 | + matrix[:platforms] << platform |
| 146 | + end |
| 147 | +else |
| 148 | + # Set platforms based on declared operating system support |
| 149 | + metadata['operatingsystem_support'].sort_by { |a| a['operatingsystem'] }.each do |sup| |
| 150 | + os = sup['operatingsystem'] |
| 151 | + sup['operatingsystemrelease'].sort_by(&:to_i).each do |ver| |
| 152 | + image_key = "#{os}-#{ver}" |
| 153 | + |
| 154 | + if IMAGE_TABLE.key?(image_key) && !exclude_list.include?(image_key.downcase) |
| 155 | + matrix[:platforms] << { |
| 156 | + label: image_key, |
| 157 | + provider: 'provision_service', |
| 158 | + image: IMAGE_TABLE[image_key] |
| 159 | + } |
| 160 | + elsif DOCKER_PLATFORMS.key?(image_key) && !exclude_list.include?(image_key.downcase) |
| 161 | + matrix[:platforms] << { |
| 162 | + label: image_key, |
| 163 | + provider: 'docker', |
| 164 | + image: DOCKER_PLATFORMS[image_key] |
| 165 | + } |
| 166 | + else |
| 167 | + puts "::warning::#{image_key} was excluded from testing" if exclude_list.include?(image_key.downcase) |
| 168 | + puts "::warning::Cannot find image for #{image_key}" unless exclude_list.include?(image_key.downcase) |
| 169 | + end |
120 | 170 | end |
121 | 171 | end |
122 | 172 | end |
|
155 | 205 |
|
156 | 206 | # Set to defaults (all collections) if no matches are found |
157 | 207 | matrix[:collection] = COLLECTION_TABLE.map { |collection| "puppet#{collection[:puppet_maj_version]}-nightly" } if matrix[:collection].empty? |
158 | | - |
159 | 208 | # Just to make sure there aren't any duplicates |
160 | | -matrix[:platforms] = matrix[:platforms].uniq.sort_by { |a| a[:label] } |
| 209 | +matrix[:platforms] = matrix[:platforms].uniq.sort_by { |a| a[:label] } unless ARGV.include?('--custom-matrix') |
161 | 210 | matrix[:collection] = matrix[:collection].uniq.sort |
162 | 211 |
|
163 | 212 | set_output('matrix', JSON.generate(matrix)) |
|
0 commit comments