concourse/pipelines/windows-image-build-staging.jsonnet (740 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 underscore(input) = std.strReplace(input, '-', '_');
// Templates.
local imagetesttask = 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', '-shapevalidation_test_filter=^(([A-Z][0-3])|(N4))' ],
};
local publishresulttask = {
local task = self,
project:: 'gcp-guest',
zone:: 'us-central1-a',
pipeline:: error 'must set pipeline in publishresulttask',
job:: error 'must set job in publishresulttask',
result_state:: error 'must set result_state in publishresulttask',
start_timestamp:: error 'must set start_timestamp in publishresulttask',
RegistryImagePrivate:: {
name: 'registry-image-private',
type: 'registry-image',
source: { repository: 'gcr.io/compute-image-tools/registry-image-forked' },
},
// Start of output.
platform: 'linux',
image_resource: {
type: 'registry-image-forked',
source: {
repository: 'gcr.io/gcp-guest/concourse-metrics',
tag: 'latest',
// Use workload id to pull image
google_auth: true,
debug: true,
},
},
run: {
path: '/publish-job-result',
args:
[
'--project-id=' + task.project,
'--zone=' + task.zone,
'--pipeline=' + task.pipeline,
'--job=' + task.job,
'--task=publish-job-result',
'--result-state=' + task.result_state,
'--start-timestamp=' + task.start_timestamp,
'--metric-path=concourse/job/duration',
],
},
};
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',
// Start of job.
on_success: {
task: 'publish-success-metric',
config: publishresulttask {
pipeline: 'windows-image-build',
job: job.name,
result_state: 'success',
start_timestamp: '((.:start-timestamp-ms))',
},
},
on_failure: {
task: 'publish-failure-metric',
config: publishresulttask {
pipeline: 'windows-image-build',
job: job.name,
result_state: 'failure',
start_timestamp: '((.:start-timestamp-ms))',
},
},
name: 'build-' + job.image + '-testing',
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: 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-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))',
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=staging',
'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 + '-testing',
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-build-id',
file: 'guest-test-infra/concourse/tasks/generate-build-id.yaml',
vars: { prefix: job.image },
},
{
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-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))',
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 + '-testing',
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-build-id',
file: 'guest-test-infra/concourse/tasks/generate-build-id.yaml',
vars: { prefix: job.image },
},
{
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',
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_bucket:: common.prod_bucket,
topic:: common.prod_topic,
// Publish can proceed if build passes.
passed:: 'build-' + job.image + '-testing',
// Builds are automatically pushed to testing.
trigger:: true,
// Run CIT by default on server and sql
runtests:: if 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-testing-%s' % [job.image],
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',
},
{
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: 'test',
},
},
] +
if job.runtests then
[
{
task: 'image-test-' + job.image,
config: imagetesttask {
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, workflow_dir, gcs_dir) = imgpublishjob {
image: image,
gcs_dir: gcs_dir,
// build -> testing
passed:: 'build-' + image + '-testing',
workflow: '%s/%s' % [workflow_dir, image + '-uefi.publish.json'],
};
local MediaImgPublishJob(image, workflow_dir, gcs_dir) = imgpublishjob {
image: image,
gcs_dir: gcs_dir,
// build -> testing
passed:: 'build-' + image + '-testing',
workflow: '%s/%s' % [workflow_dir, image + '.publish.json'],
};
local ImgGroup(name, images) = {
name: name,
jobs: [
'build-' + image + '-testing',
for image in images
] + [
'publish-to-testing-%s' % [image]
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',
],
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-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-web-windows-2016-dc',
'sql-2017-web-windows-2019-dc',
'sql-2017-web-windows-2022-dc',
],
local sql_2019_images = [
'sql-2019-enterprise-windows-2019-dc',
'sql-2019-enterprise-windows-2022-dc',
'sql-2019-standard-windows-2019-dc',
'sql-2019-standard-windows-2022-dc',
'sql-2019-web-windows-2019-dc',
'sql-2019-web-windows-2022-dc',
],
local sql_2022_images = [
'sql-2022-enterprise-windows-2019-dc',
'sql-2022-enterprise-windows-2022-dc',
'sql-2022-standard-windows-2019-dc',
'sql-2022-standard-windows-2022-dc',
'sql-2022-web-windows-2019-dc',
'sql-2022-web-windows-2022-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: [
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.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-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-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-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-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-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-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-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-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-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'),
// Windows install media builds
WindowsInstallMediaImgBuildJob('windows-install-media'),
] +
// Publish jobs
[
ImgPublishJob(image, 'windows', 'windows-uefi')
for image in windows_client_images
] +
[
ImgPublishJob(image, 'windows', 'windows-uefi')
for image in windows_server_images
] +
[
ImgPublishJob(image, 'sqlserver', 'sqlserver-uefi')
for image in sql_images
] +
[
MediaImgPublishJob(image, 'windows', 'windows-install-media')
for image in windows_install_media_images
],
groups: [
ImgGroup('windows-10-testing', windows_10_images),
ImgGroup('windows-11-testing', windows_11_images),
ImgGroup('windows-2016-testing', windows_2016_images),
ImgGroup('windows-2019-testing', windows_2019_images),
ImgGroup('windows-2022-testing', windows_2022_images),
ImgGroup('windows-2025-testing', windows_2025_images),
ImgGroup('sql-2016-testing', sql_2016_images),
ImgGroup('sql-2017-testing', sql_2017_images),
ImgGroup('sql-2019-testing', sql_2019_images),
ImgGroup('sql-2022-testing', sql_2022_images),
ImgGroup('windows-install-media-testing', windows_install_media_images),
],
}