Commit a003e50
committed
chore(windows): use docker bake to generate the docker compose file
diff --git a/make.ps1 b/make.ps1
index 3e6e34e..54c9f0c 100644
--- a/make.ps1
+++ b/make.ps1
@@ -1,26 +1,23 @@
[CmdletBinding()]
Param(
- [Parameter(Position=1)]
+ [Parameter(Position = 1)]
+ # Default script target
[String] $Target = 'build',
+ # Jenkins version to include
[String] $JenkinsVersion = '2.534',
- [switch] $DryRun = $false
+ # Windows flavor and windows version to build
+ [String] $ImageType = 'windowsservercore-ltsc2022',
+ # Generate a docker compose file even if it already exists
+ [switch] $OverwriteDockerComposeFile = $false,
+ # Print the build and publish command instead of executing them if set
+ [switch] $DryRun = $false,
+ # Output debug info for tests: 'empty' (no additional test output), 'debug' (test cmd & stderr outputed), 'verbose' (test cmd, stderr, stdout outputed)
+ [String] $TestsDebug = ''
)
$ErrorActionPreference = 'Stop'
$ProgressPreference = 'SilentlyContinue' # Disable Progress bar for faster downloads
-$Repository = 'jenkins'
-$Organisation = 'jenkins4eval'
-$ImageType = 'windowsservercore-ltsc2022' # <WINDOWS_FLAVOR>-<WINDOWS_VERSION>
-
-if(![String]::IsNullOrWhiteSpace($env:DOCKERHUB_REPO)) {
- $Repository = $env:DOCKERHUB_REPO
-}
-
-if(![String]::IsNullOrWhiteSpace($env:DOCKERHUB_ORGANISATION)) {
- $Organisation = $env:DOCKERHUB_ORGANISATION
-}
-
if(![String]::IsNullOrWhiteSpace($env:JENKINS_VERSION)) {
$JenkinsVersion = $env:JENKINS_VERSION
}
@@ -29,28 +26,40 @@ if(![String]::IsNullOrWhiteSpace($env:IMAGE_TYPE)) {
$ImageType = $env:IMAGE_TYPE
}
-$env:DOCKERHUB_ORGANISATION = "$Organisation"
-$env:DOCKERHUB_REPO = "$Repository"
$env:JENKINS_VERSION = "$JenkinsVersion"
-# Add 'lts-' prefix to LTS tags not including Jenkins version
-# Compared to weekly releases, LTS releases include an additional build number in their version
-# Note: the ':' separator is included as trying to set an environment variable to empty on Windows unset it.
-$env:SEPARATOR_LTS_PREFIX = ':'
-$releaseLine = 'war'
-if ($JenkinsVersion.Split('.').Count -eq 3) {
- $env:SEPARATOR_LTS_PREFIX = ':lts-'
- $releaseLine = 'war-stable'
-}
+# Check for required commands
+Function Test-CommandExists {
+ # From https://devblogs.microsoft.com/scripting/use-a-powershell-function-to-see-if-a-command-exists/
+ Param (
+ [String] $command
+ )
-# If there is no WAR_URL set, using get.jenkins.io URL depending on the release line
-if([String]::IsNullOrWhiteSpace($env:WAR_URL)) {
- $env:WAR_URL = 'https://get.jenkins.io/{0}/{1}/jenkins.war' -f $releaseLine, $env:JENKINS_VERSION
+ $oldPreference = $ErrorActionPreference
+ $ErrorActionPreference = 'stop'
+ try {
+ # Special case to test "docker buildx"
+ if ($command.Contains(' ')) {
+ Invoke-Expression $command | Out-Null
+ Write-Debug "$command exists"
+ } else {
+ if(Get-Command $command){
+ Write-Debug "$command exists"
+ }
+ }
+ }
+ Catch {
+ "$command does not exist"
+ }
+ Finally {
+ $ErrorActionPreference = $oldPreference
+ }
}
function Test-Image {
param (
- $ImageName
+ [String] $ImageName,
+ [String] $JavaVersion
)
Write-Host "= TEST: Testing image ${ImageName}:"
@@ -79,56 +88,102 @@ function Test-Image {
return $failed
}
-$items = $ImageType.Split('-')
-$env:WINDOWS_FLAVOR = $items[0]
-$env:WINDOWS_VERSION = $items[1]
+function Initialize-DockerComposeFile {
+ param (
+ [String] $ImageType,
+ [String] $DockerComposeFile
+ )
+
+ $baseDockerBakeCmd = 'docker buildx bake --progress=plain --file=docker-bake.hcl'
+
+ $items = $ImageType.Split('-')
+ $windowsFlavor = $items[0]
+ $windowsVersion = $items[1]
+
+ # Override the list of Windows versions taken defined in docker-bake.hcl by the version from image type
+ $env:WINDOWS_VERSION_OVERRIDE = $windowsVersion
-# Retrieve the sha256 corresponding to the war file
-$warShaURL = '{0}.sha256' -f $env:WAR_URL
-$webClient = New-Object System.Net.WebClient
-$env:WAR_SHA = $webClient.DownloadString($warShaURL).Split(' ')[0]
+ # Retrieve the targets from docker buildx bake --print output
+ # Remove the 'output' section (unsupported by docker compose)
+ # For each target name as service key, return a map consisting of:
+ # - 'image' set to the first tag value
+ # - 'build' set to the content of the bake target
+ $yqMainQuery = '''.target[]' + `
+ ' | del(.output)' + `
+ ' | {(. | key): {\"image\": .tags[0], \"build\": .}}'''
+ # Encapsulate under a top level 'services' map
+ $yqServicesQuery = '''{\"services\": .}'''
-$env:COMMIT_SHA=$(git rev-parse HEAD)
+ # - Use docker buildx bake to output image definitions from the "<windowsFlavor>" bake target
+ # - Convert with yq to the format expected by docker compose
+ # - Store the result in the docker compose file
+ $generateDockerComposeFileCmd = ' {0} {1} --print' -f $baseDockerBakeCmd, $windowsFlavor + `
+ ' | yq --prettyPrint {0} | yq {1}' -f $yqMainQuery, $yqServicesQuery + `
+ ' | Out-File -FilePath {0}' -f $DockerComposeFile
-$baseDockerCmd = 'docker-compose --file=build-windows.yaml'
+ Write-Host "= PREPARE: Docker compose file generation command`n$generateDockerComposeFileCmd"
+
+ Invoke-Expression $generateDockerComposeFileCmd
+
+ # Remove override
+ Remove-Item env:\WINDOWS_VERSION_OVERRIDE
+}
+
+Test-CommandExists 'docker'
+Test-CommandExists 'docker-compose'
+Test-CommandExists 'docker buildx'
+Test-CommandExists 'yq'
+
+$dockerComposeFile = 'build-windows_{1}.yaml' -f $ImageType
+$baseDockerCmd = 'docker-compose --file={0}' -f $dockerComposeFile
$baseDockerBuildCmd = '{0} build --parallel --pull' -f $baseDockerCmd
-Write-Host "= PREPARE: List of $Organisation/$Repository images and tags to be processed:"
+# Generate the docker compose file if it doesn't exists or if the parameter OverwriteDockerComposeFile is set
+if ((Test-Path $dockerComposeFile) -and -not $OverwriteDockerComposeFile) {
+ Write-Host "= PREPARE: The docker compose file '$dockerComposeFile' containing the image definitions already exists."
+} else {
+ Write-Host "= PREPARE: Initialize the docker compose file '$dockerComposeFile' containing the image definitions."
+ Initialize-DockerComposeFile -ImageType $ImageType -DockerComposeFile $dockerComposeFile
+}
+
+Write-Host '= PREPARE: List of images and tags to be processed:'
Invoke-Expression "$baseDockerCmd config"
-if($target -eq 'build') {
+if ($target -eq 'build') {
Write-Host '= BUILD: Building all images...'
+
switch ($DryRun) {
$true { Write-Host "(dry-run) $baseDockerBuildCmd" }
$false { Invoke-Expression $baseDockerBuildCmd }
}
- Write-Host '= BUILD: Finished building all images.'
- if($lastExitCode -ne 0 -and !$DryRun) {
- Write-Error "= BUILD: failed!"
+ if ($lastExitCode -ne 0) {
exit $lastExitCode
}
+
+ Write-Host '= BUILD: Finished building all images.'
}
-if($target -eq 'test') {
+if ($target -eq 'test') {
if ($DryRun) {
- Write-Host '(dry-run) test'
+ Write-Host '= TEST: (dry-run) test harness'
} else {
- # Only fail the run afterwards in case of any test failures
- $testFailed = $false
+ Write-Host '= TEST: Starting test harness'
+
$mod = Get-InstalledModule -Name Pester -MinimumVersion 5.3.0 -MaximumVersion 5.3.3 -ErrorAction SilentlyContinue
- if($null -eq $mod) {
- $module = 'c:\Program Files\WindowsPowerShell\Modules\Pester'
- if(Test-Path $module) {
+ if ($null -eq $mod) {
+ Write-Host '= TEST: Pester 5.3.x not found: installing...'
+ $module = 'C:\Program Files\WindowsPowerShell\Modules\Pester'
+ if (Test-Path $module) {
takeown /F $module /A /R
icacls $module /reset
icacls $module /grant Administrators:'F' /inheritance:d /T
Remove-Item -Path $module -Recurse -Force -Confirm:$false
}
- Install-Module -Force -Name Pester -Verbose -MaximumVersion 5.3.3
+ Install-Module -Force -Name Pester -MaximumVersion 5.3.3
}
- Import-Module -Verbose Pester
+ Import-Module Pester
Write-Host '= TEST: Setting up Pester environment...'
$configuration = [PesterConfiguration]::Default
$configuration.Run.PassThru = $true
@@ -139,40 +194,34 @@ if($target -eq 'test') {
$configuration.Output.Verbosity = 'Diagnostic'
$configuration.CodeCoverage.Enabled = $false
- Write-Host '= TEST: Testing all images...'
+ Write-Host "= TEST: Testing all images..."
# Only fail the run afterwards in case of any test failures
$testFailed = $false
- Invoke-Expression "$baseDockerCmd config" | yq '.services[].image' | ForEach-Object {
- $testFailed = $testFailed -or (Test-Image $_.split(':')[1])
+ $imageDefinitions = Invoke-Expression "$baseDockerCmd config" | yq --unwrapScalar --output-format json '.services' | ConvertFrom-Json
+ foreach ($imageDefinition in $imageDefinitions.PSObject.Properties) {
+ $testFailed = $testFailed -or (Test-Image -ImageName $imageDefinition.Value.image -JavaVersion $imageDefinition.Value.build.args.JAVA_VERSION)
}
# Fail if any test failures
- if($testFailed -ne $false) {
- Write-Error 'Test stage failed!'
+ if ($testFailed -ne $false) {
+ Write-Error "Test stage failed for ${agentType}!"
exit 1
} else {
- Write-Host 'Test stage passed!'
+ Write-Host "= TEST: stage passed for ${agentType}!"
}
}
}
-if($target -eq "publish") {
- Write-Host "= PUBLISH: push all images and tags"
+if ($target -eq 'publish') {
+ Write-Host '= PUBLISH: push all images and tags'
switch($DryRun) {
$true { Write-Host "(dry-run) $baseDockerCmd push" }
$false { Invoke-Expression "$baseDockerCmd push" }
}
# Fail if any issues when publising the docker images
- if($lastExitCode -ne 0) {
- Write-Error "= PUBLISH: failed!"
+ if ($lastExitCode -ne 0) {
+ Write-Error '= PUBLISH: failed!'
exit 1
}
}
-
-if($lastExitCode -ne 0 -and !$DryRun) {
- Write-Error 'Build failed!'
-} else {
- Write-Host 'Build finished successfully'
-}
-exit $lastExitCode1 parent 737cf51 commit a003e50
1 file changed
+118
-69
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
| 4 | + | |
4 | 5 | | |
| 6 | + | |
5 | 7 | | |
6 | | - | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
7 | 16 | | |
8 | 17 | | |
9 | 18 | | |
10 | 19 | | |
11 | 20 | | |
12 | | - | |
13 | | - | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
18 | | - | |
19 | | - | |
20 | | - | |
21 | | - | |
22 | | - | |
23 | | - | |
24 | 21 | | |
25 | 22 | | |
26 | 23 | | |
| |||
29 | 26 | | |
30 | 27 | | |
31 | 28 | | |
32 | | - | |
33 | | - | |
34 | 29 | | |
35 | 30 | | |
36 | | - | |
37 | | - | |
38 | | - | |
39 | | - | |
40 | | - | |
41 | | - | |
42 | | - | |
43 | | - | |
44 | | - | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
45 | 37 | | |
46 | | - | |
47 | | - | |
48 | | - | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
49 | 57 | | |
50 | 58 | | |
51 | 59 | | |
52 | 60 | | |
53 | | - | |
| 61 | + | |
| 62 | + | |
54 | 63 | | |
55 | 64 | | |
56 | 65 | | |
| |||
79 | 88 | | |
80 | 89 | | |
81 | 90 | | |
82 | | - | |
83 | | - | |
84 | | - | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
85 | 105 | | |
86 | | - | |
87 | | - | |
88 | | - | |
89 | | - | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
90 | 116 | | |
91 | | - | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
92 | 123 | | |
93 | | - | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
94 | 139 | | |
95 | 140 | | |
96 | | - | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
97 | 150 | | |
98 | 151 | | |
99 | | - | |
| 152 | + | |
100 | 153 | | |
| 154 | + | |
101 | 155 | | |
102 | 156 | | |
103 | 157 | | |
104 | 158 | | |
105 | | - | |
106 | 159 | | |
107 | | - | |
108 | | - | |
| 160 | + | |
109 | 161 | | |
110 | 162 | | |
| 163 | + | |
| 164 | + | |
111 | 165 | | |
112 | 166 | | |
113 | | - | |
| 167 | + | |
114 | 168 | | |
115 | | - | |
| 169 | + | |
116 | 170 | | |
117 | | - | |
118 | | - | |
| 171 | + | |
| 172 | + | |
119 | 173 | | |
120 | | - | |
121 | | - | |
122 | | - | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
123 | 178 | | |
124 | 179 | | |
125 | 180 | | |
126 | 181 | | |
127 | 182 | | |
128 | | - | |
| 183 | + | |
129 | 184 | | |
130 | 185 | | |
131 | | - | |
| 186 | + | |
132 | 187 | | |
133 | 188 | | |
134 | 189 | | |
| |||
139 | 194 | | |
140 | 195 | | |
141 | 196 | | |
142 | | - | |
| 197 | + | |
143 | 198 | | |
144 | 199 | | |
145 | | - | |
146 | | - | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
147 | 203 | | |
148 | 204 | | |
149 | 205 | | |
150 | | - | |
151 | | - | |
| 206 | + | |
| 207 | + | |
152 | 208 | | |
153 | 209 | | |
154 | | - | |
| 210 | + | |
155 | 211 | | |
156 | 212 | | |
157 | 213 | | |
158 | 214 | | |
159 | | - | |
160 | | - | |
| 215 | + | |
| 216 | + | |
161 | 217 | | |
162 | 218 | | |
163 | 219 | | |
164 | 220 | | |
165 | 221 | | |
166 | 222 | | |
167 | | - | |
168 | | - | |
| 223 | + | |
| 224 | + | |
169 | 225 | | |
170 | 226 | | |
171 | 227 | | |
172 | | - | |
173 | | - | |
174 | | - | |
175 | | - | |
176 | | - | |
177 | | - | |
178 | | - | |
| |||
0 commit comments