Skip to content

Commit c3724f1

Browse files
rzlinkDawei Weitimmy-wright
authored
feat: Add pipeline support for Windows 2025 image creation (#5908)
Co-authored-by: Dawei Wei <[email protected]> Co-authored-by: Tim Wright <[email protected]>
1 parent 4f92809 commit c3724f1

19 files changed

+291
-27
lines changed

.pipelines/.vsts-vhd-builder-pr-windows.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,5 @@ stages:
6060
build23H2gen2: True
6161
overrideBranch: master
6262
useOverrides: False
63+
build2025: False
64+
build2025gen2: True

.pipelines/.vsts-vhd-builder-release-windows.yaml

+10
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ parameters:
3131
displayName: Build 23H2 Gen 2
3232
type: boolean
3333
default: True
34+
- name: build2025
35+
displayName: Build 2025
36+
type: boolean
37+
default: True
38+
- name: build2025gen2
39+
displayName: Build 2025 Gen 2
40+
type: boolean
41+
default: True
3442
- name: dryrun
3543
displayName: Dry run
3644
type: boolean
@@ -75,6 +83,8 @@ stages:
7583
build2022containerdgen2: ${{ parameters.build2022containerdgen2 }}
7684
build23H2: ${{ parameters.build23H2 }}
7785
build23H2gen2: ${{ parameters.build23H2gen2 }}
86+
build2025: ${{ parameters.build2025 }}
87+
build2025gen2: ${{ parameters.build2025gen2 }}
7888
skipExtensionCheck: ${{ parameters.skipExtensionCheck }}
7989
installOpenSshServer: ${{ parameters.installOpenSshServer }}
8090
overrideBranch: ${{ parameters.overrideBranch }}

.pipelines/.vsts-vhd-windows-automation.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ steps:
4141
go install .
4242
cd ../../..
4343
echo "go run autonotes to shuffle release note files from Azure Pipelines into the AgentBaker repo structure"
44-
go run vhdbuilder/release-notes/autonotes/main.go --build $BUILD_ID --include 2019-containerd,2022-containerd,2022-containerd-gen2,23H2,23H2-gen2
44+
go run vhdbuilder/release-notes/autonotes/main.go --build $BUILD_ID --include 2019-containerd,2022-containerd,2022-containerd-gen2,23H2,23H2-gen2,2025,2025-gen2
4545
echo "run bash to create pull request for the shuffled release note files"
4646
/bin/bash vhdbuilder/scripts/windows/automate_release_notes.sh "$GITHUB_TOKEN" "$BUILD_ID"
4747
env:

.pipelines/templates/.build-and-test-windows-vhds-template.yaml

+46
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ parameters:
1414
- name: build23H2gen2
1515
displayName: Build 23H2 Gen 2
1616
type: boolean
17+
- name: build2025
18+
displayName: Build 2025
19+
type: boolean
20+
- name: build2025gen2
21+
displayName: Build 2025 Gen 2
22+
type: boolean
1723
- name: dryrun
1824
displayName: Dry run
1925
type: boolean
@@ -141,6 +147,46 @@ stages:
141147
overrideBranch: ${{ parameters.overrideBranch }}
142148
useOverrides: ${{ parameters.useOverrides }}
143149

150+
- template: ./.build-and-test-windows-vhd-template.yaml
151+
parameters:
152+
stageName: win_2025_v1
153+
artifactName: 2025
154+
imageName: windows-2025
155+
windowsSku: 2025
156+
hyperVGeneration: V1
157+
architecture: X86_64
158+
buildVmSize: ${{ parameters.buildVmSize }}
159+
build: ${{ parameters.build2025 }}
160+
vhddebug: ${{ parameters.vhddebug }}
161+
dryrun: ${{ parameters.dryrun }}
162+
installOpenSshServer: ${{ parameters.installOpenSshServer }}
163+
skipExtensionCheck: ${{ parameters.skipExtensionCheck }}
164+
windowsBaseImageUrl: $(WINDOWS_2025_BASE_IMAGE_URL)
165+
windowsNanoImageUrl: $(WINDOWS_2025_NANO_IMAGE_URL)
166+
windowsCoreImageUrl: $(WINDOWS_2025_CORE_IMAGE_URL)
167+
overrideBranch: ${{ parameters.overrideBranch }}
168+
useOverrides: ${{ parameters.useOverrides }}
169+
170+
- template: ./.build-and-test-windows-vhd-template.yaml
171+
parameters:
172+
stageName: win_2025_v2
173+
artifactName: 2025-gen2
174+
imageName: windows-2025-gen2
175+
windowsSku: 2025-gen2
176+
hyperVGeneration: V2
177+
architecture: X86_64
178+
buildVmSize: ${{ parameters.buildVmSize }}
179+
build: ${{ parameters.build2025gen2 }}
180+
vhddebug: ${{ parameters.vhddebug }}
181+
dryrun: ${{ parameters.dryrun }}
182+
installOpenSshServer: ${{ parameters.installOpenSshServer }}
183+
skipExtensionCheck: ${{ parameters.skipExtensionCheck }}
184+
windowsBaseImageUrl: $(WINDOWS_2025_GEN2_BASE_IMAGE_URL)
185+
windowsNanoImageUrl: $(WINDOWS_2025_NANO_IMAGE_URL)
186+
windowsCoreImageUrl: $(WINDOWS_2025_CORE_IMAGE_URL)
187+
overrideBranch: ${{ parameters.overrideBranch }}
188+
useOverrides: ${{ parameters.useOverrides }}
189+
144190
- stage: backfill_cleanup_outdated_resources
145191
dependsOn: [ ]
146192
condition: always()

e2e/config/vhd.go

+18
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,24 @@ var (
183183
Latest: true,
184184
Gallery: windowsGallery,
185185
}
186+
187+
VHDWindows2025 = &Image{
188+
Name: "windows-2025",
189+
OS: OSWindows,
190+
Arch: "amd64",
191+
Distro: datamodel.AKSWindows2025,
192+
Latest: true,
193+
Gallery: windowsGallery,
194+
}
195+
196+
VHDWindows2025Gen2 = &Image{
197+
Name: "windows-2025-gen2",
198+
OS: OSWindows,
199+
Arch: "amd64",
200+
Distro: datamodel.AKSWindows2025Gen2,
201+
Latest: true,
202+
Gallery: windowsGallery,
203+
}
186204
)
187205

188206
var ErrNotFound = fmt.Errorf("not found")

e2e/scenario_win_test.go

+65-22
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,17 @@ import (
99
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v6"
1010
)
1111

12+
func EmptyBootstrapConfigMutator(configuration *datamodel.NodeBootstrappingConfiguration) {}
13+
func EmptyVMConfigMutator(vmss *armcompute.VirtualMachineScaleSet) {}
14+
1215
func Test_Windows2019Containerd(t *testing.T) {
1316
RunScenario(t, &Scenario{
1417
Description: "Windows Server 2019 with Containerd",
1518
Config: Config{
1619
Cluster: ClusterAzureNetwork,
1720
VHD: config.VHDWindows2019Containerd,
18-
VMConfigMutator: func(vmss *armcompute.VirtualMachineScaleSet) {},
19-
BootstrapConfigMutator: func(configuration *datamodel.NodeBootstrappingConfiguration) {},
21+
VMConfigMutator: EmptyVMConfigMutator,
22+
BootstrapConfigMutator: EmptyBootstrapConfigMutator,
2023
Validator: func(ctx context.Context, s *Scenario) {
2124
ValidateWindowsVersionFromWindowsSettings(ctx, s, "2019-containerd")
2225
ValidateWindowsProductName(ctx, s, "Windows Server 2019 Datacenter")
@@ -34,11 +37,10 @@ func Test_Windows2022Containerd(t *testing.T) {
3437
RunScenario(t, &Scenario{
3538
Description: "Windows Server 2022 with Containerd",
3639
Config: Config{
37-
Cluster: ClusterAzureNetwork,
38-
VHD: config.VHDWindows2022Containerd,
39-
VMConfigMutator: func(vmss *armcompute.VirtualMachineScaleSet) {},
40-
BootstrapConfigMutator: func(configuration *datamodel.NodeBootstrappingConfiguration) {
41-
},
40+
Cluster: ClusterAzureNetwork,
41+
VHD: config.VHDWindows2022Containerd,
42+
VMConfigMutator: EmptyVMConfigMutator,
43+
BootstrapConfigMutator: EmptyBootstrapConfigMutator,
4244
Validator: func(ctx context.Context, s *Scenario) {
4345
ValidateWindowsVersionFromWindowsSettings(ctx, s, "2022-containerd")
4446
ValidateWindowsProductName(ctx, s, "Windows Server 2022 Datacenter")
@@ -55,11 +57,10 @@ func Test_Windows2022ContainerdGen2(t *testing.T) {
5557
RunScenario(t, &Scenario{
5658
Description: "Windows Server 2022 with Containerd - hyperv gen 2",
5759
Config: Config{
58-
Cluster: ClusterAzureNetwork,
59-
VHD: config.VHDWindows2022ContainerdGen2,
60-
VMConfigMutator: func(vmss *armcompute.VirtualMachineScaleSet) {},
61-
BootstrapConfigMutator: func(configuration *datamodel.NodeBootstrappingConfiguration) {
62-
},
60+
Cluster: ClusterAzureNetwork,
61+
VHD: config.VHDWindows2022ContainerdGen2,
62+
VMConfigMutator: EmptyVMConfigMutator,
63+
BootstrapConfigMutator: EmptyBootstrapConfigMutator,
6364
Validator: func(ctx context.Context, s *Scenario) {
6465
ValidateWindowsVersionFromWindowsSettings(ctx, s, "2022-containerd-gen2")
6566
ValidateWindowsProductName(ctx, s, "Windows Server 2022 Datacenter")
@@ -76,11 +77,10 @@ func Test_Windows23H2(t *testing.T) {
7677
RunScenario(t, &Scenario{
7778
Description: "Windows Server 23H2 with Containerd",
7879
Config: Config{
79-
Cluster: ClusterAzureNetwork,
80-
VHD: config.VHDWindows23H2,
81-
VMConfigMutator: func(vmss *armcompute.VirtualMachineScaleSet) {},
82-
BootstrapConfigMutator: func(configuration *datamodel.NodeBootstrappingConfiguration) {
83-
},
80+
Cluster: ClusterAzureNetwork,
81+
VHD: config.VHDWindows23H2,
82+
VMConfigMutator: EmptyVMConfigMutator,
83+
BootstrapConfigMutator: EmptyBootstrapConfigMutator,
8484
Validator: func(ctx context.Context, s *Scenario) {
8585
ValidateWindowsVersionFromWindowsSettings(ctx, s, "23H2")
8686
ValidateWindowsProductName(ctx, s, "Windows Server 2022 Datacenter")
@@ -97,11 +97,10 @@ func Test_Windows23H2Gen2(t *testing.T) {
9797
RunScenario(t, &Scenario{
9898
Description: "Windows Server 23H2 with Containerd - hyperv gen2",
9999
Config: Config{
100-
Cluster: ClusterAzureNetwork,
101-
VHD: config.VHDWindows23H2Gen2,
102-
VMConfigMutator: func(vmss *armcompute.VirtualMachineScaleSet) {},
103-
BootstrapConfigMutator: func(configuration *datamodel.NodeBootstrappingConfiguration) {
104-
},
100+
Cluster: ClusterAzureNetwork,
101+
VHD: config.VHDWindows23H2Gen2,
102+
VMConfigMutator: EmptyVMConfigMutator,
103+
BootstrapConfigMutator: EmptyBootstrapConfigMutator,
105104
Validator: func(ctx context.Context, s *Scenario) {
106105
ValidateWindowsVersionFromWindowsSettings(ctx, s, "23H2-gen2")
107106
ValidateWindowsProductName(ctx, s, "Windows Server 2022 Datacenter")
@@ -114,6 +113,50 @@ func Test_Windows23H2Gen2(t *testing.T) {
114113
})
115114
}
116115

116+
func Test_Windows2025(t *testing.T) {
117+
// TODO: re-enable the tests once the Windows E2E tests are fixed in pipeline
118+
t.Skip("Skipping testing")
119+
RunScenario(t, &Scenario{
120+
Description: "Windows Server 2025 with Containerd",
121+
Config: Config{
122+
Cluster: ClusterAzureNetwork,
123+
VHD: config.VHDWindows2025,
124+
VMConfigMutator: EmptyVMConfigMutator,
125+
BootstrapConfigMutator: EmptyBootstrapConfigMutator,
126+
Validator: func(ctx context.Context, s *Scenario) {
127+
ValidateWindowsVersionFromWindowsSettings(ctx, s, "2025")
128+
ValidateWindowsProductName(ctx, s, "Windows Server 2025 Datacenter")
129+
ValidateWindowsDisplayVersion(ctx, s, "2025")
130+
ValidateFileHasContent(ctx, s, "/k/kubeletstart.ps1", "--container-runtime=remote")
131+
ValidateWindowsProcessHasCliArguments(ctx, s, "kubelet.exe", []string{"--rotate-certificates=true", "--client-ca-file=c:\\k\\ca.crt"})
132+
ValidateCiliumIsNotRunningWindows(ctx, s)
133+
},
134+
},
135+
})
136+
}
137+
138+
func Test_Windows2025Gen2(t *testing.T) {
139+
// TODO: re-enable the tests once the Windows E2E tests are fixed in pipeline
140+
t.Skip("Skipping testing")
141+
RunScenario(t, &Scenario{
142+
Description: "Windows Server 2025 with Containerd - hyperv gen 2",
143+
Config: Config{
144+
Cluster: ClusterAzureNetwork,
145+
VHD: config.VHDWindows2025Gen2,
146+
VMConfigMutator: EmptyVMConfigMutator,
147+
BootstrapConfigMutator: EmptyBootstrapConfigMutator,
148+
Validator: func(ctx context.Context, s *Scenario) {
149+
ValidateWindowsVersionFromWindowsSettings(ctx, s, "2025-gen2")
150+
ValidateWindowsProductName(ctx, s, "Windows Server 2025 Datacenter")
151+
ValidateWindowsDisplayVersion(ctx, s, "2025")
152+
ValidateFileHasContent(ctx, s, "/k/kubeletstart.ps1", "--container-runtime=remote")
153+
ValidateWindowsProcessHasCliArguments(ctx, s, "kubelet.exe", []string{"--rotate-certificates=true", "--client-ca-file=c:\\k\\ca.crt"})
154+
ValidateCiliumIsNotRunningWindows(ctx, s)
155+
},
156+
},
157+
})
158+
}
159+
117160
// TODO: enable this test once production AKS supports Cilium Windows
118161
/*
119162
func Test_Windows23H2_Cilium2(t *testing.T) {

parts/common/components.json

+10
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
"renovateTag": "registry=https://mcr.microsoft.com, name=windows/servercore",
2020
"latestVersion": "ltsc2022",
2121
"windowsSkuMatch": "23H2*"
22+
},
23+
{
24+
"renovateTag": "registry=https://mcr.microsoft.com, name=windows/servercore",
25+
"latestVersion": "ltsc2022",
26+
"windowsSkuMatch": "2025*"
2227
}
2328
]
2429
},
@@ -42,6 +47,11 @@
4247
"renovateTag": "registry=https://mcr.microsoft.com, name=windows/nanoserver",
4348
"latestVersion": "ltsc2022",
4449
"windowsSkuMatch": "23H2*"
50+
},
51+
{
52+
"renovateTag": "registry=https://mcr.microsoft.com, name=windows/nanoserver",
53+
"latestVersion": "ltsc2022",
54+
"windowsSkuMatch": "2025*"
4555
}
4656
]
4757
},

pkg/agent/datamodel/sig_config.go

+19
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,8 @@ var AvailableWindowsSIGDistros = []Distro{
351351
AKSWindows2022ContainerdGen2,
352352
AKSWindows23H2,
353353
AKSWindows23H2Gen2,
354+
AKSWindows2025,
355+
AKSWindows2025Gen2,
354356
CustomizedWindowsOSImage,
355357
}
356358

@@ -397,6 +399,7 @@ const (
397399
Windows2019SIGImageVersion string = "17763.2019.221114"
398400
Windows2022SIGImageVersion string = "20348.2022.221114"
399401
Windows23H2SIGImageVersion string = "25398.2022.221114"
402+
Windows2025SIGImageVersion string = "26100.2025.221114"
400403
)
401404

402405
type sigVersion struct {
@@ -821,6 +824,20 @@ var (
821824
Definition: "windows-23H2-gen2",
822825
Version: Windows23H2SIGImageVersion,
823826
}
827+
828+
SIGWindows2025ImageConfigTemplate = SigImageConfigTemplate{
829+
ResourceGroup: AKSWindowsResourceGroup,
830+
Gallery: AKSWindowsGalleryName,
831+
Definition: "windows-2025",
832+
Version: Windows2025SIGImageVersion,
833+
}
834+
835+
SIGWindows2025Gen2ImageConfigTemplate = SigImageConfigTemplate{
836+
ResourceGroup: AKSWindowsResourceGroup,
837+
Gallery: AKSWindowsGalleryName,
838+
Definition: "windows-2025-gen2",
839+
Version: Windows2025SIGImageVersion,
840+
}
824841
)
825842

826843
// GetMaintainedLinuxSIGImageConfigMap returns a set of Distro -> SigImageConfig mappings
@@ -920,6 +937,8 @@ func getSigWindowsImageConfigMapWithOpts(opts ...SigImageConfigOpt) map[Distro]S
920937
AKSWindows2022ContainerdGen2: SIGWindows2022ContainerdGen2ImageConfigTemplate.WithOptions(opts...),
921938
AKSWindows23H2: SIGWindows23H2ImageConfigTemplate.WithOptions(opts...),
922939
AKSWindows23H2Gen2: SIGWindows23H2Gen2ImageConfigTemplate.WithOptions(opts...),
940+
AKSWindows2025: SIGWindows2025ImageConfigTemplate.WithOptions(opts...),
941+
AKSWindows2025Gen2: SIGWindows2025Gen2ImageConfigTemplate.WithOptions(opts...),
923942
}
924943
}
925944

pkg/agent/datamodel/sig_config_test.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ var _ = Describe("GetSIGAzureCloudSpecConfig", func() {
133133
Expect(azurelinuxV3Gen2.Definition).To(Equal("V3gen2"))
134134
Expect(azurelinuxV3Gen2.Version).To(Equal(LinuxSIGImageVersion))
135135

136-
Expect(len(sigConfig.SigWindowsImageConfig)).To(Equal(6))
136+
Expect(len(sigConfig.SigWindowsImageConfig)).To(Equal(8))
137137

138138
windows2019 := sigConfig.SigWindowsImageConfig[AKSWindows2019]
139139
Expect(windows2019.ResourceGroup).To(Equal("AKS-Windows"))
@@ -171,6 +171,18 @@ var _ = Describe("GetSIGAzureCloudSpecConfig", func() {
171171
Expect(windows23H2Gen2.Definition).To(Equal("windows-23H2-gen2"))
172172
Expect(windows23H2Gen2.Version).To(Equal("25398.2022.221114"))
173173

174+
windows2025 := sigConfig.SigWindowsImageConfig[AKSWindows2025]
175+
Expect(windows2025.ResourceGroup).To(Equal("AKS-Windows"))
176+
Expect(windows2025.Gallery).To(Equal("AKSWindows"))
177+
Expect(windows2025.Definition).To(Equal("windows-2025"))
178+
Expect(windows2025.Version).To(Equal("26100.2025.221114"))
179+
180+
windows2025Gen2 := sigConfig.SigWindowsImageConfig[AKSWindows2025Gen2]
181+
Expect(windows2025Gen2.ResourceGroup).To(Equal("AKS-Windows"))
182+
Expect(windows2025Gen2.Gallery).To(Equal("AKSWindows"))
183+
Expect(windows2025Gen2.Definition).To(Equal("windows-2025-gen2"))
184+
Expect(windows2025Gen2.Version).To(Equal("26100.2025.221114"))
185+
174186
aksUbuntuArm642204Gen2 := sigConfig.SigUbuntuImageConfig[AKSUbuntuArm64Containerd2204Gen2]
175187
Expect(aksUbuntuArm642204Gen2.ResourceGroup).To(Equal("resourcegroup"))
176188
Expect(aksUbuntuArm642204Gen2.Gallery).To(Equal("aksubuntu"))

pkg/agent/datamodel/types.go

+4
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,10 @@ const (
218218
AKSWindows23H2 Distro = "aks-windows-23H2"
219219
// AKSWindows23H2Gen2 stands for distro for windows 23H2 Gen 2 SIG image.
220220
AKSWindows23H2Gen2 Distro = "aks-windows-23H2-gen2"
221+
// AKSWindows2025 stands for distro for windows server 2025 SIG image.
222+
AKSWindows2025 Distro = "aks-windows-2025"
223+
// AKSWindows2025Gen2 stands for distro for windows server 2025 Gen 2 SIG image.
224+
AKSWindows2025Gen2 Distro = "aks-windows-2025-gen2"
221225
// AKSWindows2019PIR stands for distro of windows server 2019 PIR image with docker.
222226
AKSWindows2019PIR Distro = "aks-windows-2019-pir"
223227
CustomizedImage Distro = "CustomizedImage"

schemas/components.cue

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ package components
7474
ws2019?: #ReleaseDownloadURI
7575
ws2022?: #ReleaseDownloadURI
7676
ws23h2?: #ReleaseDownloadURI
77+
ws2025?: #ReleaseDownloadURI
7778
}
7879

7980
#DownloadURIs: {

schemas/windows_settings.cue

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
"2022-containerd-gen2": #WindowsBaseVersion
3737
"23H2": #WindowsBaseVersion
3838
"23H2-gen2": #WindowsBaseVersion
39+
"2025": #WindowsBaseVersion
40+
"2025-gen2": #WindowsBaseVersion
3941
}
4042

4143
#WindowsDefenderInfo: {

vhdbuilder/packer/init-variables.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ fi
343343
# shellcheck disable=SC2236
344344
if [ "$OS_TYPE" == "Windows" ]; then
345345

346-
echo "Set the base image sku and version from windows-settings.json"
346+
echo "Set the base image sku and version from windows_settings.json"
347347

348348
WINDOWS_IMAGE_SKU=`jq -r ".WindowsBaseVersions.\"${WINDOWS_SKU}\".base_image_sku" < $CDIR/windows/windows_settings.json`
349349
WINDOWS_IMAGE_VERSION=`jq -r ".WindowsBaseVersions.\"${WINDOWS_SKU}\".base_image_version" < $CDIR/windows/windows_settings.json`

0 commit comments

Comments
 (0)