concourse/pipelines/windows-image-build.jsonnet (937 lines of code) (raw):

// Imports. local arle = import '../templates/arle.libsonnet'; local common = import '../templates/common.libsonnet'; local daisy = import '../templates/daisy.libsonnet'; local gcp_secret_manager = import '../templates/gcp-secret-manager.libsonnet'; local client_envs = ['testing', 'internal', 'client']; local server_envs = ['testing', 'internal', 'prod', 'byol']; local sql_envs = ['testing', 'prod']; local prerelease_envs = ['testing']; local windows_install_media_envs = ['testing', 'prod']; local underscore(input) = std.strReplace(input, '-', '_'); // Templates. local imagetestn1 = common.imagetesttask { filter: '^(cvm|livemigrate|suspendresume|loadbalancer|guestagent|hostnamevalidation|imageboot|licensevalidation|network|security|hotattach|lssd|disk|shapevalidation|packageupgrade|packagevalidation|ssh|winrm|metadata|sql|windowscontainers)$', extra_args: [ '-x86_shape=n1-standard-4', '-timeout=60m', '-shapevalidation_test_filter=^(([A-Z][0-3])|(N4))' ], }; local imagetestc3 = common.imagetesttask { filter: '^(livemigrate|suspendresume|imageboot|network|hotattach|lssd|disk)$', extra_args: [ '-x86_shape=c3-standard-4', '-timeout=60m' ], }; local imgbuildjob = { local job = self, image:: error 'must set image in imgbuildjob', workflow:: error 'must set workflow in imgbuildjob', iso_secret:: error 'must set iso_secret in imgbuildjob', updates_secret:: error 'must set updates_secret in imgbuildjob', daily:: true, daily_task:: if self.daily then [ { get: 'daily-time', trigger: true, }, ] else [], // Start of job. name: 'build-' + job.image, on_success: { task: 'publish-success-metric', config: common.publishresulttask { pipeline: 'windows-image-build', job: job.name, result_state: 'success', start_timestamp: '((.:start-timestamp-ms))', }, }, on_failure: { task: 'publish-failure-metric', config: common.publishresulttask { pipeline: 'windows-image-build', job: job.name, result_state: 'failure', start_timestamp: '((.:start-timestamp-ms))', }, }, plan: job.daily_task + [ { get: 'compute-image-tools' }, { get: 'guest-test-infra' }, { task: 'generate-timestamp', file: 'guest-test-infra/concourse/tasks/generate-timestamp.yaml', }, { load_var: 'start-timestamp-ms', file: 'timestamp/timestamp-ms', }, { task: 'generate-id', file: 'guest-test-infra/concourse/tasks/generate-id.yaml', }, { load_var: 'id', file: 'generate-id/id', }, { task: 'generate-build-id', file: 'guest-test-infra/concourse/tasks/generate-build-id.yaml', vars: { prefix: job.image, id: '((.:id))'}, }, { put: job.image + '-gcs', params: { file: 'build-id-dir/%s*' % job.image }, get_params: { skip_download: 'true' }, }, { load_var: 'gcs-url', file: '%s-gcs/url' % job.image, }, { task: 'generate-build-id-sbom', file: 'guest-test-infra/concourse/tasks/generate-build-id-sbom.yaml', vars: { prefix: job.image, id: '((.:id))'}, }, { put: job.image + '-sbom', params: { file: 'build-id-dir-sbom/%s*' % job.image, }, get_params: { skip_download: 'true', }, }, { load_var: 'sbom-destination', file: '%s-sbom/url' % job.image, }, { task: 'generate-build-id-shasum', file: 'guest-test-infra/concourse/tasks/generate-build-id-shasum.yaml', vars: { prefix: job.image, id: '((.:id))'}, }, { put: job.image + '-shasum', params: { file: 'build-id-dir-shasum/%s*' % job.image, }, get_params: { skip_download: 'true', }, }, { load_var: 'sha256-txt', file: '%s-shasum/url' % job.image, }, { task: 'generate-build-date', file: 'guest-test-infra/concourse/tasks/generate-version.yaml', }, { load_var: 'build-date', file: 'publish-version/version', }, { task: 'get-secret-iso', config: gcp_secret_manager.getsecrettask { secret_name: job.iso_secret }, }, { load_var: 'windows-iso', file: 'gcp-secret-manager/' + job.iso_secret, }, { task: 'get-secret-updates', config: gcp_secret_manager.getsecrettask { secret_name: job.updates_secret }, }, { load_var: 'windows-updates', file: 'gcp-secret-manager/' + job.updates_secret, }, { task: 'get-secret-pwsh', config: gcp_secret_manager.getsecrettask { secret_name: 'windows_gcs_pwsh' }, }, // We download and then load each of the 3 following secrets; they could be merged. { load_var: 'windows-gcs-pwsh', file: 'gcp-secret-manager/windows_gcs_pwsh', }, { task: 'get-secret-cloud-sdk', config: gcp_secret_manager.getsecrettask { secret_name: 'windows_gcs_cloud_sdk' }, }, { load_var: 'windows-cloud-sdk', file: 'gcp-secret-manager/windows_gcs_cloud_sdk', }, { task: 'get-secret-dotnet48', config: gcp_secret_manager.getsecrettask { secret_name: 'windows_gcs_dotnet48' }, }, { load_var: 'windows-gcs-dotnet48', file: 'gcp-secret-manager/windows_gcs_dotnet48', }, { task: 'get-secret-sbom-util', config: gcp_secret_manager.getsecrettask { secret_name: 'sbom-util-secret' }, }, { load_var: 'sbom-util-secret', file: 'gcp-secret-manager/sbom-util-secret', }, { task: 'daisy-build', config: daisy.daisyimagetask { gcs_url: '((.:gcs-url))', sbom_destination: '((.:sbom-destination))', shasum_destination: '((.:sha256-txt))', workflow: job.workflow, vars+: [ 'cloudsdk=((.:windows-cloud-sdk))', 'dotnet48=((.:windows-gcs-dotnet48))', 'media=((.:windows-iso))', 'pwsh=((.:windows-gcs-pwsh))', 'updates=((.:windows-updates))', 'google_cloud_repo=stable', 'sbom_util_gcs_root=((.:sbom-util-secret))', ], }, }, ], }; local sqlimgbuildjob = { local job = self, image:: error 'must set image in sqlimgbuildjob', base_image:: error 'must set base_image in sqlimgbuildjob', workflow:: error 'must set workflow in sqlimgbuildjob', sql_version:: error 'must set sql_version in sqlbuildjob', ssms_version:: error 'must set ssms_version in sqlbuildjob', // Start of job. name: 'build-' + job.image, on_success: { task: 'publish-success-metric', config: common.publishresulttask { pipeline: 'windows-image-build', job: job.name, result_state: 'success', start_timestamp: '((.:start-timestamp-ms))', }, }, on_failure: { task: 'publish-failure-metric', config: common.publishresulttask { pipeline: 'windows-image-build', job: job.name, result_state: 'failure', start_timestamp: '((.:start-timestamp-ms))', }, }, plan: [ { get: 'compute-image-tools' }, { get: 'guest-test-infra' }, { task: 'generate-timestamp', file: 'guest-test-infra/concourse/tasks/generate-timestamp.yaml', }, { load_var: 'start-timestamp-ms', file: 'timestamp/timestamp-ms', }, { get: '%s-gcs' % job.base_image, params: { skip_download: 'true' }, passed: ['publish-to-testing-' + job.base_image], trigger: true, }, { task: 'generate-id', file: 'guest-test-infra/concourse/tasks/generate-id.yaml', }, { load_var: 'id', file: 'generate-id/id', }, { task: 'generate-build-id', file: 'guest-test-infra/concourse/tasks/generate-build-id.yaml', vars: { prefix: job.image, id: '((.:id))' }, }, { put: job.image + '-gcs', params: { file: 'build-id-dir/%s*' % job.image }, }, { load_var: 'gcs-url', file: '%s-gcs/url' % job.image, }, { task: 'generate-build-id-sbom', file: 'guest-test-infra/concourse/tasks/generate-build-id-sbom.yaml', vars: { prefix: job.image, id: '((.:id))'}, }, { put: job.image + '-sbom', params: { file: 'build-id-dir-sbom/%s*' % job.image, }, get_params: { skip_download: 'true', }, }, { load_var: 'sbom-destination', file: '%s-sbom/url' % job.image, }, { task: 'generate-build-id-shasum', file: 'guest-test-infra/concourse/tasks/generate-build-id-shasum.yaml', vars: { prefix: job.image, id: '((.:id))'}, }, { put: job.image + '-shasum', params: { file: 'build-id-dir-shasum/%s*' % job.image, }, get_params: { skip_download: 'true', }, }, { load_var: 'sha256-txt', file: '%s-shasum/url' % job.image, }, { task: 'generate-build-date', file: 'guest-test-infra/concourse/tasks/generate-version.yaml', }, { load_var: 'build-date', file: 'publish-version/version', }, { task: 'get-secret-sql-server-media', config: gcp_secret_manager.getsecrettask { secret_name: job.sql_version }, }, { load_var: 'sql-server-media', file: 'gcp-secret-manager/' + job.sql_version, }, { task: 'get-secret-ssms-version', config: gcp_secret_manager.getsecrettask { secret_name: job.ssms_version }, }, { load_var: 'ssms-version', file: 'gcp-secret-manager/' + job.ssms_version, }, { task: 'get-secret-sbom-util', config: gcp_secret_manager.getsecrettask { secret_name: 'sbom-util-secret' }, }, { load_var: 'sbom-util-secret', file: 'gcp-secret-manager/sbom-util-secret', }, { task: 'daisy-build', config: daisy.daisyimagetask { gcs_url: '((.:gcs-url))', sbom_destination: '((.:sbom-destination))', shasum_destination: '((.:sha256-txt))', workflow: job.workflow, vars+: [ 'source_image_project=bct-prod-images', 'sql_server_media=((.:sql-server-media))', 'ssms_exe=((.:ssms-version))', 'timeout=4h', 'sbom_util_gcs_root=((.:sbom-util-secret))', ], }, }, ], }; local windowsinstallmediaimgbuildjob = { local job = self, image:: error 'must set image in windowsinstallmediaimgbuildjob', workflow:: error 'must set workflow in windowsinstallmediaimgbuildjob', // Start of job. name: 'build-' + job.image, on_success: { task: 'publish-success-metric', config: common.publishresulttask { pipeline: 'windows-image-build', job: job.name, result_state: 'success', start_timestamp: '((.:start-timestamp-ms))', }, }, on_failure: { task: 'publish-failure-metric', config: common.publishresulttask { pipeline: 'windows-image-build', job: job.name, result_state: 'failure', start_timestamp: '((.:start-timestamp-ms))', }, }, plan: [ { get: 'compute-image-tools' }, { get: 'guest-test-infra' }, { task: 'generate-timestamp', file: 'guest-test-infra/concourse/tasks/generate-timestamp.yaml', }, { load_var: 'start-timestamp-ms', file: 'timestamp/timestamp-ms', }, { task: 'generate-id', file: 'guest-test-infra/concourse/tasks/generate-id.yaml', }, { load_var: 'id', file: 'generate-id/id', }, { task: 'generate-build-id', file: 'guest-test-infra/concourse/tasks/generate-build-id.yaml', vars: { prefix: job.image, id: '((.:id))' }, }, { put: '%s-gcs' % job.image, params: { file: 'build-id-dir/%s*' % job.image }, }, { load_var: 'gcs-url', file: '%s-gcs/url' % job.image, }, { task: 'get-secret-iso-path-2025', config: gcp_secret_manager.getsecrettask { secret_name: 'win2025-64' }, }, { load_var: 'iso_path_2025', file: 'gcp-secret-manager/win2025-64', }, { task: 'get-secret-iso-path-2022', config: gcp_secret_manager.getsecrettask { secret_name: 'win2022-64' }, }, { load_var: 'iso_path_2022', file: 'gcp-secret-manager/win2022-64', }, { task: 'get-secret-iso-path-2019', config: gcp_secret_manager.getsecrettask { secret_name: 'win2019-64' }, }, { load_var: 'iso_path_2019', file: 'gcp-secret-manager/win2019-64', }, { task: 'get-secret-iso-path-2016', config: gcp_secret_manager.getsecrettask { secret_name: 'win2016-64' }, }, { load_var: 'iso_path_2016', file: 'gcp-secret-manager/win2016-64', }, { task: 'get-secret-iso-path-2012r2', config: gcp_secret_manager.getsecrettask { secret_name: 'win2012-r2-64' }, }, { load_var: 'iso_path_2012r2', file: 'gcp-secret-manager/win2012-r2-64', }, { task: 'get-secret-updates-path-2025', config: gcp_secret_manager.getsecrettask { secret_name: 'windows_gcs_updates_server2025' }, }, { load_var: 'updates_path_2025', file: 'gcp-secret-manager/windows_gcs_updates_server2025', }, { task: 'get-secret-updates-path-2022', config: gcp_secret_manager.getsecrettask { secret_name: 'windows_gcs_updates_server2022' }, }, { load_var: 'updates_path_2022', file: 'gcp-secret-manager/windows_gcs_updates_server2022', }, { task: 'get-secret-updates-path-2019', config: gcp_secret_manager.getsecrettask { secret_name: 'windows_gcs_updates_server2019' }, }, { load_var: 'updates_path_2019', file: 'gcp-secret-manager/windows_gcs_updates_server2019', }, { task: 'get-secret-updates-path-2016', config: gcp_secret_manager.getsecrettask { secret_name: 'windows_gcs_updates_server2016' }, }, { load_var: 'updates_path_2016', file: 'gcp-secret-manager/windows_gcs_updates_server2016', }, { task: 'get-secret-updates-path-2012r2', config: gcp_secret_manager.getsecrettask { secret_name: 'windows_gcs_updates_server2012r2' }, }, { load_var: 'updates_path_2012r2', file: 'gcp-secret-manager/windows_gcs_updates_server2012r2', }, { task: 'daisy-build', config: daisy.daisywindowsinstallmediatask { workflow: job.workflow, gcs_url: '((.:gcs-url))', iso_path_2025: '((.:iso_path_2025))', iso_path_2022: '((.:iso_path_2022))', iso_path_2019: '((.:iso_path_2019))', iso_path_2016: '((.:iso_path_2016))', iso_path_2012r2: '((.:iso_path_2012r2))', updates_path_2025: '((.:updates_path_2025))', updates_path_2022: '((.:updates_path_2022))', updates_path_2019: '((.:updates_path_2019))', updates_path_2016: '((.:updates_path_2016))', updates_path_2012r2: '((.:updates_path_2012r2))', }, }, ], }; local imgpublishjob = { local job = self, image:: error 'must set image in imgpublishjob', env:: error 'must set publish env in imgpublishjob', workflow:: error 'must set workflow in imgpublishjob', gcs_dir:: error 'must set gcs_dir in imgpublishjob', gcs:: 'gs://%s/%s' % [self.gcs_bucket, self.gcs_dir], gcs_shasum:: 'gs://%s/%s' % [self.gcs_sbom_bucket, self.gcs_dir], gcs_bucket:: common.prod_bucket, gcs_sbom_bucket:: common.sbom_bucket, generate_shasum:: true, topic:: common.prod_topic, // Publish can proceed if build passes. passed:: if job.env == 'testing' then 'build-' + job.image else 'publish-to-testing-' + job.image, // Builds are automatically pushed to testing. trigger:: if job.env == 'testing' then true else if job.env == 'internal' then true else if job.env == 'byol' then true else if job.env == 'client' then true else false, // Run tests on server and sql images runtests:: if job.env == 'testing' && (std.length(std.findSubstr("server", job.image)) > 0 || std.length(std.findSubstr("sql", job.image)) > 0) then true else false, // Start of job. name: 'publish-to-%s-%s' % [job.env, job.image], on_success: { task: 'publish-success-metric', config: common.publishresulttask { pipeline: 'windows-image-build', job: job.name, result_state: 'success', start_timestamp: '((.:start-timestamp-ms))', }, }, on_failure: { task: 'publish-failure-metric', config: common.publishresulttask { pipeline: 'windows-image-build', job: job.name, result_state: 'failure', start_timestamp: '((.:start-timestamp-ms))', }, }, plan: [ { get: 'guest-test-infra' }, { get: 'compute-image-tools' }, { task: 'generate-timestamp', file: 'guest-test-infra/concourse/tasks/generate-timestamp.yaml', }, { load_var: 'start-timestamp-ms', file: 'timestamp/timestamp-ms', }, { get: '%s-gcs' % job.image, params: { skip_download: 'true' }, passed: [job.passed], trigger: job.trigger, }, { load_var: 'source-version', file: '%s-gcs/version' % job.image, }, { task: 'generate-version', file: 'guest-test-infra/concourse/tasks/generate-version.yaml', }, { load_var: 'publish-version', file: 'publish-version/version', }, ] + (if job.generate_shasum then [ { get: '%s-shasum' % job.image, params: { skip_download: 'true' }, passed: [job.passed], trigger: job.trigger, }, { load_var: 'sha256-txt', file: '%s-shasum/url' % job.image, }, ] else []) + (if job.env == 'prod' then [ { task: 'arle-publish-' + job.image, config: arle.arlepublishtask { gcs_image_path: job.gcs, image_sha256_hash_txt: if job.generate_shasum then '((.:sha256-txt))' else '', source_version: 'v((.:source-version))', publish_version: '((.:publish-version))', wf: job.workflow, image_name: job.image, }, }, ] else [ { task: 'gce-image-publish-' + job.image, config: arle.gcepublishtask { source_gcs_path: job.gcs, source_version: 'v((.:source-version))', publish_version: '((.:publish-version))', wf: job.workflow, environment: if job.env == 'testing' then 'test' else job.env, }, }, ]) + (if job.runtests then [ { task: 'image-test-n1-' + job.image, config: imagetestn1 { images: 'projects/bct-prod-images/global/images/%s-((.:publish-version))' % job.image, }, attempts: 3, }, { task: 'image-test-c3-' + job.image, config: imagetestc3 { images: 'projects/bct-prod-images/global/images/%s-((.:publish-version))' % job.image, }, attempts: 3, } ] else []), }; local ImgBuildJob(image, iso_secret, updates_secret) = imgbuildjob { image: image, iso_secret: iso_secret, updates_secret: updates_secret, workflow: 'windows/%s-uefi.wf.json' % image, }; local SQLImgBuildJob(image, base_image, sql_version, ssms_version) = sqlimgbuildjob { image: image, base_image: base_image, sql_version: sql_version, ssms_version: ssms_version, workflow: 'sqlserver/%s.wf.json' % image, }; local WindowsInstallMediaImgBuildJob(image) = windowsinstallmediaimgbuildjob { image: image, workflow: 'windows/%s.wf.json' % image, }; local ImgPublishJob(image, env, workflow_dir, gcs_dir) = imgpublishjob { image: image, env: env, gcs_dir: gcs_dir, // build -> testing -> prod -> internal & byol // build -> testing -> internal & client passed:: if env == 'testing' then 'build-' + image else if env == 'prod' then 'publish-to-testing-' + image else if env == 'internal' then 'publish-to-prod-' + image else if env == 'byol' then 'publish-to-prod-' + image else if env == 'client' then 'publish-to-testing-' + image, workflow: '%s/%s' % [workflow_dir, image + '-uefi.publish.json'], }; local MediaImgPublishJob(image, env, workflow_dir, gcs_dir) = imgpublishjob { image: image, env: env, gcs_dir: gcs_dir, generate_shasum: false, // build -> testing -> prod passed:: if env == 'testing' then 'build-' + image else if env == 'prod' then 'publish-to-testing-' + image, workflow: '%s/%s' % [workflow_dir, image + '.publish.json'], }; local ImgGroup(name, images, environments) = { name: name, jobs: [ 'build-' + image for image in images ] + [ 'publish-to-%s-%s' % [env, image] for env in environments for image in images ], }; // Start of output. { local windows_10_images = [ 'windows-10-21h2-ent-x64', 'windows-10-22h2-ent-x64', ], local windows_11_images = [ 'windows-11-21h2-ent-x64', 'windows-11-22h2-ent-x64', 'windows-11-23h2-ent-x64', 'windows-11-24h2-ent-x64', ], local windows_2016_images = [ 'windows-server-2016-dc', 'windows-server-2016-dc-core', ], local windows_2019_images = [ 'windows-server-2019-dc', 'windows-server-2019-dc-core', ], local windows_2022_images = [ 'windows-server-2022-dc', 'windows-server-2022-dc-core', ], local windows_2025_images = [ 'windows-server-2025-dc', 'windows-server-2025-dc-core', ], local sql_2016_images = [ 'sql-2016-enterprise-windows-2016-dc', 'sql-2016-enterprise-windows-2019-dc', 'sql-2016-standard-windows-2016-dc', 'sql-2016-standard-windows-2019-dc', 'sql-2016-web-windows-2016-dc', 'sql-2016-web-windows-2019-dc', ], local sql_2017_images = [ 'sql-2017-enterprise-windows-2016-dc', 'sql-2017-enterprise-windows-2019-dc', 'sql-2017-enterprise-windows-2022-dc', 'sql-2017-enterprise-windows-2025-dc', 'sql-2017-express-windows-2016-dc', 'sql-2017-express-windows-2019-dc', 'sql-2017-standard-windows-2016-dc', 'sql-2017-standard-windows-2019-dc', 'sql-2017-standard-windows-2022-dc', 'sql-2017-standard-windows-2025-dc', 'sql-2017-web-windows-2016-dc', 'sql-2017-web-windows-2019-dc', 'sql-2017-web-windows-2022-dc', 'sql-2017-web-windows-2025-dc', ], local sql_2019_images = [ 'sql-2019-enterprise-windows-2019-dc', 'sql-2019-enterprise-windows-2022-dc', 'sql-2019-enterprise-windows-2025-dc', 'sql-2019-standard-windows-2019-dc', 'sql-2019-standard-windows-2022-dc', 'sql-2019-standard-windows-2025-dc', 'sql-2019-web-windows-2019-dc', 'sql-2019-web-windows-2022-dc', 'sql-2019-web-windows-2025-dc', ], local sql_2022_images = [ 'sql-2022-enterprise-windows-2019-dc', 'sql-2022-enterprise-windows-2022-dc', 'sql-2022-enterprise-windows-2025-dc', 'sql-2022-standard-windows-2019-dc', 'sql-2022-standard-windows-2022-dc', 'sql-2022-standard-windows-2025-dc', 'sql-2022-web-windows-2019-dc', 'sql-2022-web-windows-2022-dc', 'sql-2022-web-windows-2025-dc', ], local windows_install_media_images = [ 'windows-install-media', ], local windows_client_images = windows_10_images + windows_11_images, local windows_server_images = windows_2016_images + windows_2019_images + windows_2022_images + windows_2025_images, local sql_images = sql_2016_images + sql_2017_images + sql_2019_images + sql_2022_images, resource_types: [ { name: 'gcs', source: { repository: 'frodenas/gcs-resource' }, type: 'registry-image', }, { name: 'registry-image-forked', type: 'registry-image', source: { repository: 'gcr.io/compute-image-tools/registry-image-forked' }, }, ], resources: [ { name: 'daily-time', type: 'time', source: { interval: '24h', start: '10:30 AM', stop: '11:00 AM', location: 'America/Los_Angeles', days: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'], initial_version: true }, }, common.GitResource('compute-image-tools'), common.GitResource('guest-test-infra'), ] + [ common.GcsImgResource(image, 'windows-uefi') for image in windows_client_images + windows_server_images ] + [ common.GcsSbomResource(image, 'windows-client') for image in windows_client_images ] + [ common.GcsSbomResource(image, 'windows-server') for image in windows_server_images ] + [ common.GcsSbomResource(image, 'sql') for image in sql_images ] + [ common.GcsShasumResource(image, 'windows-client') for image in windows_client_images ] + [ common.GcsShasumResource(image, 'windows-server') for image in windows_server_images ] + [ common.GcsShasumResource(image, 'sql') for image in sql_images ] + [ common.GcsImgResource(image, 'sqlserver-uefi') for image in sql_images ] + [ common.GcsImgResource(image, 'windows-install-media') for image in windows_install_media_images ], jobs: [ // Windows builds ImgBuildJob('windows-10-21h2-ent-x64', 'win10-21h2-64', 'windows_gcs_updates_client10-21h2-64'), ImgBuildJob('windows-10-22h2-ent-x64', 'win10-22h2-64', 'windows_gcs_updates_client10-22h2-64'), ImgBuildJob('windows-11-21h2-ent-x64', 'win11-21h2-64', 'windows_gcs_updates_client11-21h2-64'), ImgBuildJob('windows-11-22h2-ent-x64', 'win11-22h2-64', 'windows_gcs_updates_client11-22h2-64'), ImgBuildJob('windows-11-23h2-ent-x64', 'win11-23h2-64', 'windows_gcs_updates_client11-23h2-64'), ImgBuildJob('windows-11-24h2-ent-x64', 'win11-24h2-64', 'windows_gcs_updates_client11-24h2-64'), ImgBuildJob('windows-server-2025-dc', 'win2025-64', 'windows_gcs_updates_server2025'), ImgBuildJob('windows-server-2025-dc-core', 'win2025-64', 'windows_gcs_updates_server2025'), ImgBuildJob('windows-server-2022-dc', 'win2022-64', 'windows_gcs_updates_server2022'), ImgBuildJob('windows-server-2022-dc-core', 'win2022-64', 'windows_gcs_updates_server2022'), ImgBuildJob('windows-server-2019-dc', 'win2019-64', 'windows_gcs_updates_server2019'), ImgBuildJob('windows-server-2019-dc-core', 'win2019-64', 'windows_gcs_updates_server2019'), ImgBuildJob('windows-server-2016-dc', 'win2016-64', 'windows_gcs_updates_server2016'), ImgBuildJob('windows-server-2016-dc-core', 'win2016-64', 'windows_gcs_updates_server2016'), // SQL derivative builds SQLImgBuildJob('sql-2016-enterprise-windows-2016-dc', 'windows-server-2016-dc', 'sql-2016-enterprise', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2016-enterprise-windows-2019-dc', 'windows-server-2019-dc', 'sql-2016-enterprise', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2016-standard-windows-2016-dc', 'windows-server-2016-dc', 'sql-2016-standard', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2016-standard-windows-2019-dc', 'windows-server-2019-dc', 'sql-2016-standard', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2016-web-windows-2016-dc', 'windows-server-2016-dc', 'sql-2016-web', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2016-web-windows-2019-dc', 'windows-server-2019-dc', 'sql-2016-web', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2017-enterprise-windows-2016-dc', 'windows-server-2016-dc', 'sql-2017-enterprise', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2017-enterprise-windows-2019-dc', 'windows-server-2019-dc', 'sql-2017-enterprise', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2017-enterprise-windows-2022-dc', 'windows-server-2022-dc', 'sql-2017-enterprise', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2017-enterprise-windows-2025-dc', 'windows-server-2025-dc', 'sql-2017-enterprise', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2017-express-windows-2016-dc', 'windows-server-2016-dc', 'sql-2017-express', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2017-express-windows-2019-dc', 'windows-server-2019-dc', 'sql-2017-express', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2017-standard-windows-2016-dc', 'windows-server-2016-dc', 'sql-2017-standard', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2017-standard-windows-2019-dc', 'windows-server-2019-dc', 'sql-2017-standard', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2017-standard-windows-2022-dc', 'windows-server-2022-dc', 'sql-2017-standard', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2017-standard-windows-2025-dc', 'windows-server-2025-dc', 'sql-2017-standard', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2017-web-windows-2016-dc', 'windows-server-2016-dc', 'sql-2017-web', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2017-web-windows-2019-dc', 'windows-server-2019-dc', 'sql-2017-web', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2017-web-windows-2022-dc', 'windows-server-2022-dc', 'sql-2017-web', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2017-web-windows-2025-dc', 'windows-server-2025-dc', 'sql-2017-web', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2019-enterprise-windows-2019-dc', 'windows-server-2019-dc', 'sql-2019-enterprise', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2019-enterprise-windows-2022-dc', 'windows-server-2022-dc', 'sql-2019-enterprise', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2019-enterprise-windows-2025-dc', 'windows-server-2025-dc', 'sql-2019-enterprise', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2019-standard-windows-2019-dc', 'windows-server-2019-dc', 'sql-2019-standard', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2019-standard-windows-2022-dc', 'windows-server-2022-dc', 'sql-2019-standard', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2019-standard-windows-2025-dc', 'windows-server-2025-dc', 'sql-2019-standard', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2019-web-windows-2019-dc', 'windows-server-2019-dc', 'sql-2019-web', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2019-web-windows-2022-dc', 'windows-server-2022-dc', 'sql-2019-web', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2019-web-windows-2025-dc', 'windows-server-2025-dc', 'sql-2019-web', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2022-enterprise-windows-2019-dc', 'windows-server-2019-dc', 'sql-2022-enterprise', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2022-enterprise-windows-2022-dc', 'windows-server-2022-dc', 'sql-2022-enterprise', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2022-enterprise-windows-2025-dc', 'windows-server-2025-dc', 'sql-2022-enterprise', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2022-standard-windows-2019-dc', 'windows-server-2019-dc', 'sql-2022-standard', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2022-standard-windows-2022-dc', 'windows-server-2022-dc', 'sql-2022-standard', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2022-standard-windows-2025-dc', 'windows-server-2025-dc', 'sql-2022-standard', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2022-web-windows-2019-dc', 'windows-server-2019-dc', 'sql-2022-web', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2022-web-windows-2022-dc', 'windows-server-2022-dc', 'sql-2022-web', 'windows_gcs_ssms_exe'), SQLImgBuildJob('sql-2022-web-windows-2025-dc', 'windows-server-2025-dc', 'sql-2022-web', 'windows_gcs_ssms_exe'), // Windows install media builds WindowsInstallMediaImgBuildJob('windows-install-media'), ] + // Publish jobs // Windows client has 2 jobs to account for skipping of prod environment. This avoids needing to // rewrite the rest of the passed logic. TODO: Mod logic such that only 1 ImgPublishJob is needed [ ImgPublishJob(image, env, 'windows', 'windows-uefi') for image in windows_client_images for env in ['testing', 'client'] ] + [ ImgPublishJob(image, 'internal', 'windows', 'windows-uefi') {passed:'publish-to-testing-' + image} for image in windows_client_images ] + [ ImgPublishJob(image, env, 'windows', 'windows-uefi') for image in windows_server_images for env in server_envs ] + [ ImgPublishJob(image, env, 'sqlserver', 'sqlserver-uefi') for image in sql_images for env in sql_envs ] + [ MediaImgPublishJob(image, env, 'windows', 'windows-install-media') for image in windows_install_media_images for env in windows_install_media_envs ], groups: [ ImgGroup('windows-10', windows_10_images, client_envs), ImgGroup('windows-11', windows_11_images, client_envs), ImgGroup('windows-2016', windows_2016_images, server_envs), ImgGroup('windows-2019', windows_2019_images, server_envs), ImgGroup('windows-2022', windows_2022_images, server_envs), ImgGroup('windows-2025', windows_2025_images, server_envs), ImgGroup('sql-2016', sql_2016_images, sql_envs), ImgGroup('sql-2017', sql_2017_images, sql_envs), ImgGroup('sql-2019', sql_2019_images, sql_envs), ImgGroup('sql-2022', sql_2022_images, sql_envs), ImgGroup('windows-install-media', windows_install_media_images, windows_install_media_envs), ], }