concourse/pipelines/windows-image-build-mbr.jsonnet (299 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 envs = ['testing']; local underscore(input) = std.strReplace(input, '-', '_'); 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))' ], }; // Templates. 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. name: 'build-' + job.image, 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=stable', 'sbom_util_gcs_root=((.:sbom-util-secret))', ], }, }, ], }; 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_bucket:: common.prod_bucket, topic:: common.prod_topic, image_prefix:: self.image, // 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 false, 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], 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: if job.env == 'testing' then 'test' else job.env, }, }, ] + if job.runtests then [ { task: 'image-test-' + job.image, config: imagetesttask { images: 'projects/bct-prod-images/global/images/%s-((.:publish-version))' % job.image_prefix, }, attempts: 3, }, ] else [], }; local ImgBuildJob(image, iso_secret, updates_secret) = imgbuildjob { image: image, iso_secret: iso_secret, updates_secret: updates_secret, workflow: 'windows/%s.wf.json' % image, }; local ImgPublishJob(image, env, workflow_dir, gcs_dir) = imgpublishjob { image: image, env: env, gcs_dir: gcs_dir, passed:: 'build-' + 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_2016_images = [ 'windows-server-2016-dc-bios', ], local windows_2019_images = [ 'windows-server-2019-dc-bios', ], local windows_2022_images = [ 'windows-server-2022-dc-bios', ], local images = windows_2016_images + windows_2019_images + windows_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-bios') for image in images ] + [ common.GcsSbomResource(image, 'windows-server-bios') for image in images ], jobs: [ ImgBuildJob('windows-server-2022-dc-bios', 'win2022-64', 'windows_gcs_updates_server2022'), ImgBuildJob('windows-server-2019-dc-bios', 'win2019-64', 'windows_gcs_updates_server2019'), ImgBuildJob('windows-server-2016-dc-bios', 'win2016-64', 'windows_gcs_updates_server2016'), ] + [ ImgPublishJob(image, env, 'windows', 'windows-bios') for image in images for env in envs ], groups: [ ImgGroup('windows-2016-bios', windows_2016_images, envs), ImgGroup('windows-2019-bios', windows_2019_images, envs), ImgGroup('windows-2022-bios', windows_2022_images, envs), ], }