Skip to content

chore(windows): use docker bake to generate the docker compose file#2189

Merged
lemeurherve merged 40 commits intojenkinsci:masterfrom
lemeurherve:windows-use-docker-bake_2026-01-08
Jan 18, 2026
Merged

chore(windows): use docker bake to generate the docker compose file#2189
lemeurherve merged 40 commits intojenkinsci:masterfrom
lemeurherve:windows-use-docker-bake_2026-01-08

Conversation

@lemeurherve
Copy link
Member

@lemeurherve lemeurherve commented Jan 8, 2026

This change aligns this repository with https://github.com/jenkinsci/docker-agents and https://github.com/jenkinsci/docker-ssh-agent by transplanting the mechanism allowing to use docker bake to generate the docker compose file used to build Windows images until docker buildx is able to build Windows images.

The main advantage is to get a single place of truth where all images and parameters are defined (the docker bake file), facilitating the maintainance of this repository.

The second potential advantage is the possibility to use this PR to easily ship both Windows 2019 and 2022 images in LTS 2.541.1 release, to be discussed. (cf #2167 (comment))

It also allow a possible differenciation between versions provided in Weekly or LTS releases to ease transitions (cf #2197 (comment)).

Finally, it should reduce maintainance effort for these Windows controller images cf #2197 (comment), and to unlock potential improvements and cleanups.

Similar to:

Refs:

Testing done

Locally

$ make list-linux
+ make --silent show-linux
+ jq -r '.target | keys[]'
+ docker buildx bake -f docker-bake.hcl --load --progress=quiet linux --print
+ jq
alpine_jdk21
alpine_jdk25
debian-slim_jdk21
debian-slim_jdk25
debian_jdk21
debian_jdk25
rhel_jdk21
rhel_jdk25

$ make list
+ make --silent listarch-arm64
+ make --silent showarch-arm64
+ jq -r '.target | keys[]'
+ make --silent show
+ jq --arg arch linux/arm64 '.target |= with_entries(select(.value.platforms | index($arch)))'
+ make --silent show-all
+ docker buildx bake -f docker-bake.hcl --load --progress=quiet all --print
+ jq
alpine_jdk21
alpine_jdk25
debian-slim_jdk21
debian-slim_jdk25
debian_jdk21
debian_jdk25
rhel_jdk21
rhel_jdk25

$ OS=windows ARCH=amd64 make list
+ make --silent listarch-amd64
+ make --silent showarch-amd64
+ jq -r '.target | keys[]'
+ make --silent show
+ jq --arg arch windows/amd64 '.target |= with_entries(select(.value.platforms | index($arch)))'
+ make --silent show-all
+ docker buildx bake -f docker-bake.hcl --load --progress=quiet all --print
+ jq
windowsservercore-ltsc2022_jdk21
windowsservercore-ltsc2022_jdk25

ci.jenkins.io

https://ci.jenkins.io/job/Packaging/job/docker/job/PR-2189

trusted.ci.jenkins.io

Tested the calls to ./make.ps1 build and ./make.ps1 test in an trusted.ci.jenkins.io infra check job replay from this PR branch, using the same windows-2019 and windows-2022 and the same PowerShell version used by the Windows parts of this pipeline: https://trusted.ci.jenkins.io/job/Infra-Team-Validate-Agents/597

Test pipeline
#!/usr/bin/env groovy

// Pair of agent template labels to use, and target(s) to test from each of these templates
// Labels & targets requested from https://github.com/jenkinsci/docker/Jenkinsfile
def ProcessorsLabelsAndDockerBakeTargets = [
    // Main test: Windows images
    'windows-2019': ['windowsservercore-ltsc2019'],
    'windows-2022': ['windowsservercore-ltsc2022'],
    // Sanity checks: commons linux targets and arm64 one
    'docker && amd64': ['alpine_jdk21', 'debian_jdk25'],
    'arm64docker': ['arm64'],
]

// Generate a parallel step for each label in labels
def generateParallelSteps(processors) {
    def parallelNodes = [:]
    processors.each { unboundLabel, unboundTargetList ->
        // Bind before the closure
        def label = unboundLabel
        def targetList = unboundTargetList
        targetList.each { unboundTarget ->
            def target = unboundTarget
            def combination = "$target on $label"
            parallelNodes[combination] = {
                node(label) {
                    timestamps {
                        withEnv([
                            // Branch of https://github.com/jenkinsci/docker/pull/2189
                            "REVISION=windows-use-docker-bake_2026-01-08",
                            "IMAGE_TYPE=$target",
                            "GITHUB_OWNER=lemeurherve",
                        ]) {
                            stage('Get docker and CPU info') {
                                if (isUnix()) {
                                    sh 'docker info'
                                    sh 'cat /proc/cpuinfo'
                                } else {
                                    powershell 'docker info'
                                    powershell 'Get-CimInstance Win32_Processor | Out-String'
                                    powershell 'Get-ComputerInfo | Out-String'
                                }
                            }
                            stage("Retrieve jenkinsci/docker at a specific revision") {
                                if (isUnix()) {
                                    sh '''
                                        git clone https://github.com/${GITHUB_OWNER}/docker
                                        cd docker
                                        git checkout "${REVISION}"
                                        git log -1 -p
                                    '''
                                } else {
                                    powershell '''
                                        git clone https://github.com/${env:GITHUB_OWNER}/docker
                                        cd docker
                                        git checkout "${env:REVISION}"
                                        git log -1 -p
                                    '''
                                }
                            }
                            // Using the same `make` and `make.ps1` calls than in jenkinsci/docker
                            stage("Build docker bake target") {
                                dir('docker') {
                                    if (isUnix()) {
                                        sh '''
                                            # Fallback to buildarch-% in case the target is an "architecture" one
                                            make "build-${IMAGE_TYPE}" || make "buildarch-${IMAGE_TYPE}"
                                        '''
                                    } else {
                                        powershell '''
                                            ./make.ps1 build -ImageType ${env:IMAGE_TYPE}
                                        '''
                                    }
                                }
                            }
                            stage("Test docker bake target") {
                                dir('docker') {
                                    if (isUnix()) {
                                        sh '''
                                            # no "testarch-%" target, arch builds not tested in the repo pipeline anyway
                                            make "test-${IMAGE_TYPE}" || true
                                        '''
                                    } else {
                                        powershell '''
                                            ./make.ps1 test -ImageType ${env:IMAGE_TYPE} -TestsDebug verbose
                                        '''
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }  
    return parallelNodes
}

timeout(unit: 'MINUTES', time: 60) {
    stage('Processor') {
        parallel generateParallelSteps(ProcessorsLabelsAndDockerBakeTargets)
    }
}

Build of multiple Windows versions

See #2189 (comment)

Submitter checklist

  • Make sure you are opening from a topic/feature/bugfix branch (right side) and not your main branch!
  • Ensure that the pull request title represents the desired changelog entry
  • Please describe what you did
  • Link to relevant issues in GitHub or Jira
  • Link to relevant pull requests, esp. upstream and downstream changes
  • Ensure you have provided tests that demonstrate the feature works or the issue is fixed

@lemeurherve lemeurherve force-pushed the windows-use-docker-bake_2026-01-08 branch from a003e50 to 0979c2d Compare January 8, 2026 21:51
@lemeurherve lemeurherve force-pushed the windows-use-docker-bake_2026-01-08 branch from 1ba5055 to 3a97f50 Compare January 9, 2026 01:52
@lemeurherve lemeurherve force-pushed the windows-use-docker-bake_2026-01-08 branch from 1d3fb92 to 4b10981 Compare January 9, 2026 03:43
@lemeurherve lemeurherve marked this pull request as ready for review January 9, 2026 03:44
@lemeurherve lemeurherve requested a review from a team as a code owner January 9, 2026 03:44
@lemeurherve lemeurherve force-pushed the windows-use-docker-bake_2026-01-08 branch from e866628 to 8521155 Compare January 9, 2026 04:36
Copy link
Contributor

@dduportal dduportal left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it works on trusted.ci, LGTM

@lemeurherve lemeurherve marked this pull request as draft January 9, 2026 16:44
@lemeurherve
Copy link
Member Author

lemeurherve commented Jan 9, 2026

Putting in draft until a proper test via a simulated build in a new job on trusted.ci.jenkins.io next Monday.

@lemeurherve lemeurherve force-pushed the windows-use-docker-bake_2026-01-08 branch from 8521155 to 86a9810 Compare January 14, 2026 01:29
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 14, 2026
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 14, 2026
…T_WEEKLY` & `LATEST_LTS`

Amends:
- jenkinsci#2189

diff --git a/make.ps1 b/make.ps1
index 665c6ce..abfebdc 100644
--- a/make.ps1
+++ b/make.ps1
@@ -42,21 +42,6 @@ $env:DOCKERHUB_REPO = "$Repository"
 $env:JENKINS_VERSION = "$JenkinsVersion"
 $env:COMMIT_SHA = git rev-parse HEAD

-# 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'
-}
-
-# 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
-}
-
 # Check for required commands
 Function Test-CommandExists {
     Param (
@@ -121,6 +106,52 @@ function Test-Image {

     return $failed
 }
+function Test-IsLatestJenkinsRelease {
+    param (
+        [String] $Version
+    )
+
+    Write-Host "= PREPARE: Checking if $env:JENKINS_VERSION is latest Weekly or LTS..."
+
+    $metadataUrl = "https://repo.jenkins-ci.org/releases/org/jenkins-ci/main/jenkins-war/maven-metadata.xml"
+    try {
+        [xml]$metadata = Invoke-WebRequest $metadataUrl -UseBasicParsing
+    }
+    catch {
+        Write-Error "Failed to retrieve Jenkins versions from Artifactory"
+        exit 1
+    }
+    $allVersions = $metadata.metadata.versioning.versions.version
+
+    # Weekly
+    $weeklyVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    # LTS
+    $ltsVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    $latestWeeklyVersion = $weeklyVersions[-1]
+    Write-Host "latest Weekly version: $latestWeeklyVersion"
+    $latestLTSVersion    = $ltsVersions[-1]
+    Write-Host "latest LTS version: $latestLTSVersion"
+
+    $latest = $false
+    if ($Version -eq $latestWeeklyVersion) {
+        $latest = $true
+    }
+    if ($Version -eq $latestLTSVersion) {
+        $latest = $true
+    }
+    if (!$latest) {
+        Write-Host "WARNING: $JenkinsVersion is neither the lastest Weekly nor the latest LTS version"
+    }
+    return $latest
+}

 function Initialize-DockerComposeFile {
     param (
@@ -166,6 +197,24 @@ Test-CommandExists 'yq'
 # Sanity check
 yq --version

+# Add 'lts-' prefix to LTS tags not including Jenkins version
+# Compared to weekly releases, LTS releases include an additional build number in their version
+$releaseLine = 'war'
+# Determine if the current JENKINS_VERSION corresponds to the latest Weekly or LTS version from Artifactory
+$isJenkinsVersionLatest = Test-IsLatestJenkinsRelease -Version $JenkinsVersion
+
+if ($JenkinsVersion.Split('.').Count -eq 3) {
+    $releaseLine = 'war-stable'
+    $env:LATEST_LTS = $isJenkinsVersionLatest
+} else {
+    $env:LATEST_WEEKLY = $isJenkinsVersionLatest
+}
+
+# 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, $JenkinsVersion
+}
+
 $dockerComposeFile = 'build-windows_{0}.yaml' -f $ImageType
 $baseDockerCmd = 'docker-compose --file={0}' -f $dockerComposeFile
 $baseDockerBuildCmd = '{0} build --parallel --pull' -f $baseDockerCmd
@@ -239,6 +288,7 @@ if ($target -eq 'test') {

 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" }
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 14, 2026
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
…T_WEEKLY` & `LATEST_LTS`

Amends:
- jenkinsci#2189

diff --git a/make.ps1 b/make.ps1
index 665c6ce..abfebdc 100644
--- a/make.ps1
+++ b/make.ps1
@@ -42,21 +42,6 @@ $env:DOCKERHUB_REPO = "$Repository"
 $env:JENKINS_VERSION = "$JenkinsVersion"
 $env:COMMIT_SHA = git rev-parse HEAD

-# 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'
-}
-
-# 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
-}
-
 # Check for required commands
 Function Test-CommandExists {
     Param (
@@ -121,6 +106,52 @@ function Test-Image {

     return $failed
 }
+function Test-IsLatestJenkinsRelease {
+    param (
+        [String] $Version
+    )
+
+    Write-Host "= PREPARE: Checking if $env:JENKINS_VERSION is latest Weekly or LTS..."
+
+    $metadataUrl = "https://repo.jenkins-ci.org/releases/org/jenkins-ci/main/jenkins-war/maven-metadata.xml"
+    try {
+        [xml]$metadata = Invoke-WebRequest $metadataUrl -UseBasicParsing
+    }
+    catch {
+        Write-Error "Failed to retrieve Jenkins versions from Artifactory"
+        exit 1
+    }
+    $allVersions = $metadata.metadata.versioning.versions.version
+
+    # Weekly
+    $weeklyVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    # LTS
+    $ltsVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    $latestWeeklyVersion = $weeklyVersions[-1]
+    Write-Host "latest Weekly version: $latestWeeklyVersion"
+    $latestLTSVersion    = $ltsVersions[-1]
+    Write-Host "latest LTS version: $latestLTSVersion"
+
+    $latest = $false
+    if ($Version -eq $latestWeeklyVersion) {
+        $latest = $true
+    }
+    if ($Version -eq $latestLTSVersion) {
+        $latest = $true
+    }
+    if (!$latest) {
+        Write-Host "WARNING: $JenkinsVersion is neither the lastest Weekly nor the latest LTS version"
+    }
+    return $latest
+}

 function Initialize-DockerComposeFile {
     param (
@@ -166,6 +197,24 @@ Test-CommandExists 'yq'
 # Sanity check
 yq --version

+# Add 'lts-' prefix to LTS tags not including Jenkins version
+# Compared to weekly releases, LTS releases include an additional build number in their version
+$releaseLine = 'war'
+# Determine if the current JENKINS_VERSION corresponds to the latest Weekly or LTS version from Artifactory
+$isJenkinsVersionLatest = Test-IsLatestJenkinsRelease -Version $JenkinsVersion
+
+if ($JenkinsVersion.Split('.').Count -eq 3) {
+    $releaseLine = 'war-stable'
+    $env:LATEST_LTS = $isJenkinsVersionLatest
+} else {
+    $env:LATEST_WEEKLY = $isJenkinsVersionLatest
+}
+
+# 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, $JenkinsVersion
+}
+
 $dockerComposeFile = 'build-windows_{0}.yaml' -f $ImageType
 $baseDockerCmd = 'docker-compose --file={0}' -f $dockerComposeFile
 $baseDockerBuildCmd = '{0} build --parallel --pull' -f $baseDockerCmd
@@ -239,6 +288,7 @@ if ($target -eq 'test') {

 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" }
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
…T_WEEKLY` & `LATEST_LTS`

Amends:
- jenkinsci#2189

diff --git a/make.ps1 b/make.ps1
index 665c6ce..abfebdc 100644
--- a/make.ps1
+++ b/make.ps1
@@ -42,21 +42,6 @@ $env:DOCKERHUB_REPO = "$Repository"
 $env:JENKINS_VERSION = "$JenkinsVersion"
 $env:COMMIT_SHA = git rev-parse HEAD

-# 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'
-}
-
-# 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
-}
-
 # Check for required commands
 Function Test-CommandExists {
     Param (
@@ -121,6 +106,52 @@ function Test-Image {

     return $failed
 }
+function Test-IsLatestJenkinsRelease {
+    param (
+        [String] $Version
+    )
+
+    Write-Host "= PREPARE: Checking if $env:JENKINS_VERSION is latest Weekly or LTS..."
+
+    $metadataUrl = "https://repo.jenkins-ci.org/releases/org/jenkins-ci/main/jenkins-war/maven-metadata.xml"
+    try {
+        [xml]$metadata = Invoke-WebRequest $metadataUrl -UseBasicParsing
+    }
+    catch {
+        Write-Error "Failed to retrieve Jenkins versions from Artifactory"
+        exit 1
+    }
+    $allVersions = $metadata.metadata.versioning.versions.version
+
+    # Weekly
+    $weeklyVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    # LTS
+    $ltsVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    $latestWeeklyVersion = $weeklyVersions[-1]
+    Write-Host "latest Weekly version: $latestWeeklyVersion"
+    $latestLTSVersion    = $ltsVersions[-1]
+    Write-Host "latest LTS version: $latestLTSVersion"
+
+    $latest = $false
+    if ($Version -eq $latestWeeklyVersion) {
+        $latest = $true
+    }
+    if ($Version -eq $latestLTSVersion) {
+        $latest = $true
+    }
+    if (!$latest) {
+        Write-Host "WARNING: $JenkinsVersion is neither the lastest Weekly nor the latest LTS version"
+    }
+    return $latest
+}

 function Initialize-DockerComposeFile {
     param (
@@ -166,6 +197,24 @@ Test-CommandExists 'yq'
 # Sanity check
 yq --version

+# Add 'lts-' prefix to LTS tags not including Jenkins version
+# Compared to weekly releases, LTS releases include an additional build number in their version
+$releaseLine = 'war'
+# Determine if the current JENKINS_VERSION corresponds to the latest Weekly or LTS version from Artifactory
+$isJenkinsVersionLatest = Test-IsLatestJenkinsRelease -Version $JenkinsVersion
+
+if ($JenkinsVersion.Split('.').Count -eq 3) {
+    $releaseLine = 'war-stable'
+    $env:LATEST_LTS = $isJenkinsVersionLatest
+} else {
+    $env:LATEST_WEEKLY = $isJenkinsVersionLatest
+}
+
+# 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, $JenkinsVersion
+}
+
 $dockerComposeFile = 'build-windows_{0}.yaml' -f $ImageType
 $baseDockerCmd = 'docker-compose --file={0}' -f $dockerComposeFile
 $baseDockerBuildCmd = '{0} build --parallel --pull' -f $baseDockerCmd
@@ -239,6 +288,7 @@ if ($target -eq 'test') {

 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" }
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
…T_WEEKLY` & `LATEST_LTS`

Amends:
- jenkinsci#2189

diff --git a/make.ps1 b/make.ps1
index 665c6ce..abfebdc 100644
--- a/make.ps1
+++ b/make.ps1
@@ -42,21 +42,6 @@ $env:DOCKERHUB_REPO = "$Repository"
 $env:JENKINS_VERSION = "$JenkinsVersion"
 $env:COMMIT_SHA = git rev-parse HEAD

-# 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'
-}
-
-# 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
-}
-
 # Check for required commands
 Function Test-CommandExists {
     Param (
@@ -121,6 +106,52 @@ function Test-Image {

     return $failed
 }
+function Test-IsLatestJenkinsRelease {
+    param (
+        [String] $Version
+    )
+
+    Write-Host "= PREPARE: Checking if $env:JENKINS_VERSION is latest Weekly or LTS..."
+
+    $metadataUrl = "https://repo.jenkins-ci.org/releases/org/jenkins-ci/main/jenkins-war/maven-metadata.xml"
+    try {
+        [xml]$metadata = Invoke-WebRequest $metadataUrl -UseBasicParsing
+    }
+    catch {
+        Write-Error "Failed to retrieve Jenkins versions from Artifactory"
+        exit 1
+    }
+    $allVersions = $metadata.metadata.versioning.versions.version
+
+    # Weekly
+    $weeklyVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    # LTS
+    $ltsVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    $latestWeeklyVersion = $weeklyVersions[-1]
+    Write-Host "latest Weekly version: $latestWeeklyVersion"
+    $latestLTSVersion    = $ltsVersions[-1]
+    Write-Host "latest LTS version: $latestLTSVersion"
+
+    $latest = $false
+    if ($Version -eq $latestWeeklyVersion) {
+        $latest = $true
+    }
+    if ($Version -eq $latestLTSVersion) {
+        $latest = $true
+    }
+    if (!$latest) {
+        Write-Host "WARNING: $JenkinsVersion is neither the lastest Weekly nor the latest LTS version"
+    }
+    return $latest
+}

 function Initialize-DockerComposeFile {
     param (
@@ -166,6 +197,24 @@ Test-CommandExists 'yq'
 # Sanity check
 yq --version

+# Add 'lts-' prefix to LTS tags not including Jenkins version
+# Compared to weekly releases, LTS releases include an additional build number in their version
+$releaseLine = 'war'
+# Determine if the current JENKINS_VERSION corresponds to the latest Weekly or LTS version from Artifactory
+$isJenkinsVersionLatest = Test-IsLatestJenkinsRelease -Version $JenkinsVersion
+
+if ($JenkinsVersion.Split('.').Count -eq 3) {
+    $releaseLine = 'war-stable'
+    $env:LATEST_LTS = $isJenkinsVersionLatest
+} else {
+    $env:LATEST_WEEKLY = $isJenkinsVersionLatest
+}
+
+# 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, $JenkinsVersion
+}
+
 $dockerComposeFile = 'build-windows_{0}.yaml' -f $ImageType
 $baseDockerCmd = 'docker-compose --file={0}' -f $dockerComposeFile
 $baseDockerBuildCmd = '{0} build --parallel --pull' -f $baseDockerCmd
@@ -239,6 +288,7 @@ if ($target -eq 'test') {

 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" }
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
…T_WEEKLY` & `LATEST_LTS`

Amends:
- jenkinsci#2189

diff --git a/make.ps1 b/make.ps1
index 665c6ce..abfebdc 100644
--- a/make.ps1
+++ b/make.ps1
@@ -42,21 +42,6 @@ $env:DOCKERHUB_REPO = "$Repository"
 $env:JENKINS_VERSION = "$JenkinsVersion"
 $env:COMMIT_SHA = git rev-parse HEAD

-# 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'
-}
-
-# 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
-}
-
 # Check for required commands
 Function Test-CommandExists {
     Param (
@@ -121,6 +106,52 @@ function Test-Image {

     return $failed
 }
+function Test-IsLatestJenkinsRelease {
+    param (
+        [String] $Version
+    )
+
+    Write-Host "= PREPARE: Checking if $env:JENKINS_VERSION is latest Weekly or LTS..."
+
+    $metadataUrl = "https://repo.jenkins-ci.org/releases/org/jenkins-ci/main/jenkins-war/maven-metadata.xml"
+    try {
+        [xml]$metadata = Invoke-WebRequest $metadataUrl -UseBasicParsing
+    }
+    catch {
+        Write-Error "Failed to retrieve Jenkins versions from Artifactory"
+        exit 1
+    }
+    $allVersions = $metadata.metadata.versioning.versions.version
+
+    # Weekly
+    $weeklyVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    # LTS
+    $ltsVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    $latestWeeklyVersion = $weeklyVersions[-1]
+    Write-Host "latest Weekly version: $latestWeeklyVersion"
+    $latestLTSVersion    = $ltsVersions[-1]
+    Write-Host "latest LTS version: $latestLTSVersion"
+
+    $latest = $false
+    if ($Version -eq $latestWeeklyVersion) {
+        $latest = $true
+    }
+    if ($Version -eq $latestLTSVersion) {
+        $latest = $true
+    }
+    if (!$latest) {
+        Write-Host "WARNING: $JenkinsVersion is neither the lastest Weekly nor the latest LTS version"
+    }
+    return $latest
+}

 function Initialize-DockerComposeFile {
     param (
@@ -166,6 +197,24 @@ Test-CommandExists 'yq'
 # Sanity check
 yq --version

+# Add 'lts-' prefix to LTS tags not including Jenkins version
+# Compared to weekly releases, LTS releases include an additional build number in their version
+$releaseLine = 'war'
+# Determine if the current JENKINS_VERSION corresponds to the latest Weekly or LTS version from Artifactory
+$isJenkinsVersionLatest = Test-IsLatestJenkinsRelease -Version $JenkinsVersion
+
+if ($JenkinsVersion.Split('.').Count -eq 3) {
+    $releaseLine = 'war-stable'
+    $env:LATEST_LTS = $isJenkinsVersionLatest
+} else {
+    $env:LATEST_WEEKLY = $isJenkinsVersionLatest
+}
+
+# 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, $JenkinsVersion
+}
+
 $dockerComposeFile = 'build-windows_{0}.yaml' -f $ImageType
 $baseDockerCmd = 'docker-compose --file={0}' -f $dockerComposeFile
 $baseDockerBuildCmd = '{0} build --parallel --pull' -f $baseDockerCmd
@@ -239,6 +288,7 @@ if ($target -eq 'test') {

 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" }
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
…T_WEEKLY` & `LATEST_LTS`

Amends:
- jenkinsci#2189

diff --git a/make.ps1 b/make.ps1
index 665c6ce..abfebdc 100644
--- a/make.ps1
+++ b/make.ps1
@@ -42,21 +42,6 @@ $env:DOCKERHUB_REPO = "$Repository"
 $env:JENKINS_VERSION = "$JenkinsVersion"
 $env:COMMIT_SHA = git rev-parse HEAD

-# 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'
-}
-
-# 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
-}
-
 # Check for required commands
 Function Test-CommandExists {
     Param (
@@ -121,6 +106,52 @@ function Test-Image {

     return $failed
 }
+function Test-IsLatestJenkinsRelease {
+    param (
+        [String] $Version
+    )
+
+    Write-Host "= PREPARE: Checking if $env:JENKINS_VERSION is latest Weekly or LTS..."
+
+    $metadataUrl = "https://repo.jenkins-ci.org/releases/org/jenkins-ci/main/jenkins-war/maven-metadata.xml"
+    try {
+        [xml]$metadata = Invoke-WebRequest $metadataUrl -UseBasicParsing
+    }
+    catch {
+        Write-Error "Failed to retrieve Jenkins versions from Artifactory"
+        exit 1
+    }
+    $allVersions = $metadata.metadata.versioning.versions.version
+
+    # Weekly
+    $weeklyVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    # LTS
+    $ltsVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    $latestWeeklyVersion = $weeklyVersions[-1]
+    Write-Host "latest Weekly version: $latestWeeklyVersion"
+    $latestLTSVersion    = $ltsVersions[-1]
+    Write-Host "latest LTS version: $latestLTSVersion"
+
+    $latest = $false
+    if ($Version -eq $latestWeeklyVersion) {
+        $latest = $true
+    }
+    if ($Version -eq $latestLTSVersion) {
+        $latest = $true
+    }
+    if (!$latest) {
+        Write-Host "WARNING: $JenkinsVersion is neither the lastest Weekly nor the latest LTS version"
+    }
+    return $latest
+}

 function Initialize-DockerComposeFile {
     param (
@@ -166,6 +197,24 @@ Test-CommandExists 'yq'
 # Sanity check
 yq --version

+# Add 'lts-' prefix to LTS tags not including Jenkins version
+# Compared to weekly releases, LTS releases include an additional build number in their version
+$releaseLine = 'war'
+# Determine if the current JENKINS_VERSION corresponds to the latest Weekly or LTS version from Artifactory
+$isJenkinsVersionLatest = Test-IsLatestJenkinsRelease -Version $JenkinsVersion
+
+if ($JenkinsVersion.Split('.').Count -eq 3) {
+    $releaseLine = 'war-stable'
+    $env:LATEST_LTS = $isJenkinsVersionLatest
+} else {
+    $env:LATEST_WEEKLY = $isJenkinsVersionLatest
+}
+
+# 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, $JenkinsVersion
+}
+
 $dockerComposeFile = 'build-windows_{0}.yaml' -f $ImageType
 $baseDockerCmd = 'docker-compose --file={0}' -f $dockerComposeFile
 $baseDockerBuildCmd = '{0} build --parallel --pull' -f $baseDockerCmd
@@ -239,6 +288,7 @@ if ($target -eq 'test') {

 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" }
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
…T_WEEKLY` & `LATEST_LTS`

Amends:
- jenkinsci#2189

diff --git a/make.ps1 b/make.ps1
index 665c6ce..abfebdc 100644
--- a/make.ps1
+++ b/make.ps1
@@ -42,21 +42,6 @@ $env:DOCKERHUB_REPO = "$Repository"
 $env:JENKINS_VERSION = "$JenkinsVersion"
 $env:COMMIT_SHA = git rev-parse HEAD

-# 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'
-}
-
-# 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
-}
-
 # Check for required commands
 Function Test-CommandExists {
     Param (
@@ -121,6 +106,52 @@ function Test-Image {

     return $failed
 }
+function Test-IsLatestJenkinsRelease {
+    param (
+        [String] $Version
+    )
+
+    Write-Host "= PREPARE: Checking if $env:JENKINS_VERSION is latest Weekly or LTS..."
+
+    $metadataUrl = "https://repo.jenkins-ci.org/releases/org/jenkins-ci/main/jenkins-war/maven-metadata.xml"
+    try {
+        [xml]$metadata = Invoke-WebRequest $metadataUrl -UseBasicParsing
+    }
+    catch {
+        Write-Error "Failed to retrieve Jenkins versions from Artifactory"
+        exit 1
+    }
+    $allVersions = $metadata.metadata.versioning.versions.version
+
+    # Weekly
+    $weeklyVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    # LTS
+    $ltsVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    $latestWeeklyVersion = $weeklyVersions[-1]
+    Write-Host "latest Weekly version: $latestWeeklyVersion"
+    $latestLTSVersion    = $ltsVersions[-1]
+    Write-Host "latest LTS version: $latestLTSVersion"
+
+    $latest = $false
+    if ($Version -eq $latestWeeklyVersion) {
+        $latest = $true
+    }
+    if ($Version -eq $latestLTSVersion) {
+        $latest = $true
+    }
+    if (!$latest) {
+        Write-Host "WARNING: $JenkinsVersion is neither the lastest Weekly nor the latest LTS version"
+    }
+    return $latest
+}

 function Initialize-DockerComposeFile {
     param (
@@ -166,6 +197,24 @@ Test-CommandExists 'yq'
 # Sanity check
 yq --version

+# Add 'lts-' prefix to LTS tags not including Jenkins version
+# Compared to weekly releases, LTS releases include an additional build number in their version
+$releaseLine = 'war'
+# Determine if the current JENKINS_VERSION corresponds to the latest Weekly or LTS version from Artifactory
+$isJenkinsVersionLatest = Test-IsLatestJenkinsRelease -Version $JenkinsVersion
+
+if ($JenkinsVersion.Split('.').Count -eq 3) {
+    $releaseLine = 'war-stable'
+    $env:LATEST_LTS = $isJenkinsVersionLatest
+} else {
+    $env:LATEST_WEEKLY = $isJenkinsVersionLatest
+}
+
+# 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, $JenkinsVersion
+}
+
 $dockerComposeFile = 'build-windows_{0}.yaml' -f $ImageType
 $baseDockerCmd = 'docker-compose --file={0}' -f $dockerComposeFile
 $baseDockerBuildCmd = '{0} build --parallel --pull' -f $baseDockerCmd
@@ -239,6 +288,7 @@ if ($target -eq 'test') {

 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" }
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
…T_WEEKLY` & `LATEST_LTS`

Amends:
- jenkinsci#2189

diff --git a/make.ps1 b/make.ps1
index 665c6ce..abfebdc 100644
--- a/make.ps1
+++ b/make.ps1
@@ -42,21 +42,6 @@ $env:DOCKERHUB_REPO = "$Repository"
 $env:JENKINS_VERSION = "$JenkinsVersion"
 $env:COMMIT_SHA = git rev-parse HEAD

-# 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'
-}
-
-# 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
-}
-
 # Check for required commands
 Function Test-CommandExists {
     Param (
@@ -121,6 +106,52 @@ function Test-Image {

     return $failed
 }
+function Test-IsLatestJenkinsRelease {
+    param (
+        [String] $Version
+    )
+
+    Write-Host "= PREPARE: Checking if $env:JENKINS_VERSION is latest Weekly or LTS..."
+
+    $metadataUrl = "https://repo.jenkins-ci.org/releases/org/jenkins-ci/main/jenkins-war/maven-metadata.xml"
+    try {
+        [xml]$metadata = Invoke-WebRequest $metadataUrl -UseBasicParsing
+    }
+    catch {
+        Write-Error "Failed to retrieve Jenkins versions from Artifactory"
+        exit 1
+    }
+    $allVersions = $metadata.metadata.versioning.versions.version
+
+    # Weekly
+    $weeklyVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    # LTS
+    $ltsVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    $latestWeeklyVersion = $weeklyVersions[-1]
+    Write-Host "latest Weekly version: $latestWeeklyVersion"
+    $latestLTSVersion    = $ltsVersions[-1]
+    Write-Host "latest LTS version: $latestLTSVersion"
+
+    $latest = $false
+    if ($Version -eq $latestWeeklyVersion) {
+        $latest = $true
+    }
+    if ($Version -eq $latestLTSVersion) {
+        $latest = $true
+    }
+    if (!$latest) {
+        Write-Host "WARNING: $JenkinsVersion is neither the lastest Weekly nor the latest LTS version"
+    }
+    return $latest
+}

 function Initialize-DockerComposeFile {
     param (
@@ -166,6 +197,24 @@ Test-CommandExists 'yq'
 # Sanity check
 yq --version

+# Add 'lts-' prefix to LTS tags not including Jenkins version
+# Compared to weekly releases, LTS releases include an additional build number in their version
+$releaseLine = 'war'
+# Determine if the current JENKINS_VERSION corresponds to the latest Weekly or LTS version from Artifactory
+$isJenkinsVersionLatest = Test-IsLatestJenkinsRelease -Version $JenkinsVersion
+
+if ($JenkinsVersion.Split('.').Count -eq 3) {
+    $releaseLine = 'war-stable'
+    $env:LATEST_LTS = $isJenkinsVersionLatest
+} else {
+    $env:LATEST_WEEKLY = $isJenkinsVersionLatest
+}
+
+# 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, $JenkinsVersion
+}
+
 $dockerComposeFile = 'build-windows_{0}.yaml' -f $ImageType
 $baseDockerCmd = 'docker-compose --file={0}' -f $dockerComposeFile
 $baseDockerBuildCmd = '{0} build --parallel --pull' -f $baseDockerCmd
@@ -239,6 +288,7 @@ if ($target -eq 'test') {

 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" }
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
…T_WEEKLY` & `LATEST_LTS`

Amends:
- jenkinsci#2189

diff --git a/make.ps1 b/make.ps1
index 665c6ce..abfebdc 100644
--- a/make.ps1
+++ b/make.ps1
@@ -42,21 +42,6 @@ $env:DOCKERHUB_REPO = "$Repository"
 $env:JENKINS_VERSION = "$JenkinsVersion"
 $env:COMMIT_SHA = git rev-parse HEAD

-# 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'
-}
-
-# 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
-}
-
 # Check for required commands
 Function Test-CommandExists {
     Param (
@@ -121,6 +106,52 @@ function Test-Image {

     return $failed
 }
+function Test-IsLatestJenkinsRelease {
+    param (
+        [String] $Version
+    )
+
+    Write-Host "= PREPARE: Checking if $env:JENKINS_VERSION is latest Weekly or LTS..."
+
+    $metadataUrl = "https://repo.jenkins-ci.org/releases/org/jenkins-ci/main/jenkins-war/maven-metadata.xml"
+    try {
+        [xml]$metadata = Invoke-WebRequest $metadataUrl -UseBasicParsing
+    }
+    catch {
+        Write-Error "Failed to retrieve Jenkins versions from Artifactory"
+        exit 1
+    }
+    $allVersions = $metadata.metadata.versioning.versions.version
+
+    # Weekly
+    $weeklyVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    # LTS
+    $ltsVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    $latestWeeklyVersion = $weeklyVersions[-1]
+    Write-Host "latest Weekly version: $latestWeeklyVersion"
+    $latestLTSVersion    = $ltsVersions[-1]
+    Write-Host "latest LTS version: $latestLTSVersion"
+
+    $latest = $false
+    if ($Version -eq $latestWeeklyVersion) {
+        $latest = $true
+    }
+    if ($Version -eq $latestLTSVersion) {
+        $latest = $true
+    }
+    if (!$latest) {
+        Write-Host "WARNING: $JenkinsVersion is neither the lastest Weekly nor the latest LTS version"
+    }
+    return $latest
+}

 function Initialize-DockerComposeFile {
     param (
@@ -166,6 +197,24 @@ Test-CommandExists 'yq'
 # Sanity check
 yq --version

+# Add 'lts-' prefix to LTS tags not including Jenkins version
+# Compared to weekly releases, LTS releases include an additional build number in their version
+$releaseLine = 'war'
+# Determine if the current JENKINS_VERSION corresponds to the latest Weekly or LTS version from Artifactory
+$isJenkinsVersionLatest = Test-IsLatestJenkinsRelease -Version $JenkinsVersion
+
+if ($JenkinsVersion.Split('.').Count -eq 3) {
+    $releaseLine = 'war-stable'
+    $env:LATEST_LTS = $isJenkinsVersionLatest
+} else {
+    $env:LATEST_WEEKLY = $isJenkinsVersionLatest
+}
+
+# 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, $JenkinsVersion
+}
+
 $dockerComposeFile = 'build-windows_{0}.yaml' -f $ImageType
 $baseDockerCmd = 'docker-compose --file={0}' -f $dockerComposeFile
 $baseDockerBuildCmd = '{0} build --parallel --pull' -f $baseDockerCmd
@@ -239,6 +288,7 @@ if ($target -eq 'test') {

 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" }
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
…T_WEEKLY` & `LATEST_LTS`

Amends:
- jenkinsci#2189

diff --git a/make.ps1 b/make.ps1
index 665c6ce..abfebdc 100644
--- a/make.ps1
+++ b/make.ps1
@@ -42,21 +42,6 @@ $env:DOCKERHUB_REPO = "$Repository"
 $env:JENKINS_VERSION = "$JenkinsVersion"
 $env:COMMIT_SHA = git rev-parse HEAD

-# 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'
-}
-
-# 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
-}
-
 # Check for required commands
 Function Test-CommandExists {
     Param (
@@ -121,6 +106,52 @@ function Test-Image {

     return $failed
 }
+function Test-IsLatestJenkinsRelease {
+    param (
+        [String] $Version
+    )
+
+    Write-Host "= PREPARE: Checking if $env:JENKINS_VERSION is latest Weekly or LTS..."
+
+    $metadataUrl = "https://repo.jenkins-ci.org/releases/org/jenkins-ci/main/jenkins-war/maven-metadata.xml"
+    try {
+        [xml]$metadata = Invoke-WebRequest $metadataUrl -UseBasicParsing
+    }
+    catch {
+        Write-Error "Failed to retrieve Jenkins versions from Artifactory"
+        exit 1
+    }
+    $allVersions = $metadata.metadata.versioning.versions.version
+
+    # Weekly
+    $weeklyVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    # LTS
+    $ltsVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    $latestWeeklyVersion = $weeklyVersions[-1]
+    Write-Host "latest Weekly version: $latestWeeklyVersion"
+    $latestLTSVersion    = $ltsVersions[-1]
+    Write-Host "latest LTS version: $latestLTSVersion"
+
+    $latest = $false
+    if ($Version -eq $latestWeeklyVersion) {
+        $latest = $true
+    }
+    if ($Version -eq $latestLTSVersion) {
+        $latest = $true
+    }
+    if (!$latest) {
+        Write-Host "WARNING: $JenkinsVersion is neither the lastest Weekly nor the latest LTS version"
+    }
+    return $latest
+}

 function Initialize-DockerComposeFile {
     param (
@@ -166,6 +197,24 @@ Test-CommandExists 'yq'
 # Sanity check
 yq --version

+# Add 'lts-' prefix to LTS tags not including Jenkins version
+# Compared to weekly releases, LTS releases include an additional build number in their version
+$releaseLine = 'war'
+# Determine if the current JENKINS_VERSION corresponds to the latest Weekly or LTS version from Artifactory
+$isJenkinsVersionLatest = Test-IsLatestJenkinsRelease -Version $JenkinsVersion
+
+if ($JenkinsVersion.Split('.').Count -eq 3) {
+    $releaseLine = 'war-stable'
+    $env:LATEST_LTS = $isJenkinsVersionLatest
+} else {
+    $env:LATEST_WEEKLY = $isJenkinsVersionLatest
+}
+
+# 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, $JenkinsVersion
+}
+
 $dockerComposeFile = 'build-windows_{0}.yaml' -f $ImageType
 $baseDockerCmd = 'docker-compose --file={0}' -f $dockerComposeFile
 $baseDockerBuildCmd = '{0} build --parallel --pull' -f $baseDockerCmd
@@ -239,6 +288,7 @@ if ($target -eq 'test') {

 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" }
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
…T_WEEKLY` & `LATEST_LTS`

Amends:
- jenkinsci#2189

diff --git a/make.ps1 b/make.ps1
index 665c6ce..abfebdc 100644
--- a/make.ps1
+++ b/make.ps1
@@ -42,21 +42,6 @@ $env:DOCKERHUB_REPO = "$Repository"
 $env:JENKINS_VERSION = "$JenkinsVersion"
 $env:COMMIT_SHA = git rev-parse HEAD

-# 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'
-}
-
-# 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
-}
-
 # Check for required commands
 Function Test-CommandExists {
     Param (
@@ -121,6 +106,52 @@ function Test-Image {

     return $failed
 }
+function Test-IsLatestJenkinsRelease {
+    param (
+        [String] $Version
+    )
+
+    Write-Host "= PREPARE: Checking if $env:JENKINS_VERSION is latest Weekly or LTS..."
+
+    $metadataUrl = "https://repo.jenkins-ci.org/releases/org/jenkins-ci/main/jenkins-war/maven-metadata.xml"
+    try {
+        [xml]$metadata = Invoke-WebRequest $metadataUrl -UseBasicParsing
+    }
+    catch {
+        Write-Error "Failed to retrieve Jenkins versions from Artifactory"
+        exit 1
+    }
+    $allVersions = $metadata.metadata.versioning.versions.version
+
+    # Weekly
+    $weeklyVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    # LTS
+    $ltsVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    $latestWeeklyVersion = $weeklyVersions[-1]
+    Write-Host "latest Weekly version: $latestWeeklyVersion"
+    $latestLTSVersion    = $ltsVersions[-1]
+    Write-Host "latest LTS version: $latestLTSVersion"
+
+    $latest = $false
+    if ($Version -eq $latestWeeklyVersion) {
+        $latest = $true
+    }
+    if ($Version -eq $latestLTSVersion) {
+        $latest = $true
+    }
+    if (!$latest) {
+        Write-Host "WARNING: $JenkinsVersion is neither the lastest Weekly nor the latest LTS version"
+    }
+    return $latest
+}

 function Initialize-DockerComposeFile {
     param (
@@ -166,6 +197,24 @@ Test-CommandExists 'yq'
 # Sanity check
 yq --version

+# Add 'lts-' prefix to LTS tags not including Jenkins version
+# Compared to weekly releases, LTS releases include an additional build number in their version
+$releaseLine = 'war'
+# Determine if the current JENKINS_VERSION corresponds to the latest Weekly or LTS version from Artifactory
+$isJenkinsVersionLatest = Test-IsLatestJenkinsRelease -Version $JenkinsVersion
+
+if ($JenkinsVersion.Split('.').Count -eq 3) {
+    $releaseLine = 'war-stable'
+    $env:LATEST_LTS = $isJenkinsVersionLatest
+} else {
+    $env:LATEST_WEEKLY = $isJenkinsVersionLatest
+}
+
+# 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, $JenkinsVersion
+}
+
 $dockerComposeFile = 'build-windows_{0}.yaml' -f $ImageType
 $baseDockerCmd = 'docker-compose --file={0}' -f $dockerComposeFile
 $baseDockerBuildCmd = '{0} build --parallel --pull' -f $baseDockerCmd
@@ -239,6 +288,7 @@ if ($target -eq 'test') {

 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" }
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
…T_WEEKLY` & `LATEST_LTS`

Amends:
- jenkinsci#2189

diff --git a/make.ps1 b/make.ps1
index 665c6ce..abfebdc 100644
--- a/make.ps1
+++ b/make.ps1
@@ -42,21 +42,6 @@ $env:DOCKERHUB_REPO = "$Repository"
 $env:JENKINS_VERSION = "$JenkinsVersion"
 $env:COMMIT_SHA = git rev-parse HEAD

-# 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'
-}
-
-# 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
-}
-
 # Check for required commands
 Function Test-CommandExists {
     Param (
@@ -121,6 +106,52 @@ function Test-Image {

     return $failed
 }
+function Test-IsLatestJenkinsRelease {
+    param (
+        [String] $Version
+    )
+
+    Write-Host "= PREPARE: Checking if $env:JENKINS_VERSION is latest Weekly or LTS..."
+
+    $metadataUrl = "https://repo.jenkins-ci.org/releases/org/jenkins-ci/main/jenkins-war/maven-metadata.xml"
+    try {
+        [xml]$metadata = Invoke-WebRequest $metadataUrl -UseBasicParsing
+    }
+    catch {
+        Write-Error "Failed to retrieve Jenkins versions from Artifactory"
+        exit 1
+    }
+    $allVersions = $metadata.metadata.versioning.versions.version
+
+    # Weekly
+    $weeklyVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    # LTS
+    $ltsVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    $latestWeeklyVersion = $weeklyVersions[-1]
+    Write-Host "latest Weekly version: $latestWeeklyVersion"
+    $latestLTSVersion    = $ltsVersions[-1]
+    Write-Host "latest LTS version: $latestLTSVersion"
+
+    $latest = $false
+    if ($Version -eq $latestWeeklyVersion) {
+        $latest = $true
+    }
+    if ($Version -eq $latestLTSVersion) {
+        $latest = $true
+    }
+    if (!$latest) {
+        Write-Host "WARNING: $JenkinsVersion is neither the lastest Weekly nor the latest LTS version"
+    }
+    return $latest
+}

 function Initialize-DockerComposeFile {
     param (
@@ -166,6 +197,24 @@ Test-CommandExists 'yq'
 # Sanity check
 yq --version

+# Add 'lts-' prefix to LTS tags not including Jenkins version
+# Compared to weekly releases, LTS releases include an additional build number in their version
+$releaseLine = 'war'
+# Determine if the current JENKINS_VERSION corresponds to the latest Weekly or LTS version from Artifactory
+$isJenkinsVersionLatest = Test-IsLatestJenkinsRelease -Version $JenkinsVersion
+
+if ($JenkinsVersion.Split('.').Count -eq 3) {
+    $releaseLine = 'war-stable'
+    $env:LATEST_LTS = $isJenkinsVersionLatest
+} else {
+    $env:LATEST_WEEKLY = $isJenkinsVersionLatest
+}
+
+# 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, $JenkinsVersion
+}
+
 $dockerComposeFile = 'build-windows_{0}.yaml' -f $ImageType
 $baseDockerCmd = 'docker-compose --file={0}' -f $dockerComposeFile
 $baseDockerBuildCmd = '{0} build --parallel --pull' -f $baseDockerCmd
@@ -239,6 +288,7 @@ if ($target -eq 'test') {

 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" }
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
…T_WEEKLY` & `LATEST_LTS`

Amends:
- jenkinsci#2189

diff --git a/make.ps1 b/make.ps1
index 665c6ce..abfebdc 100644
--- a/make.ps1
+++ b/make.ps1
@@ -42,21 +42,6 @@ $env:DOCKERHUB_REPO = "$Repository"
 $env:JENKINS_VERSION = "$JenkinsVersion"
 $env:COMMIT_SHA = git rev-parse HEAD

-# 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'
-}
-
-# 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
-}
-
 # Check for required commands
 Function Test-CommandExists {
     Param (
@@ -121,6 +106,52 @@ function Test-Image {

     return $failed
 }
+function Test-IsLatestJenkinsRelease {
+    param (
+        [String] $Version
+    )
+
+    Write-Host "= PREPARE: Checking if $env:JENKINS_VERSION is latest Weekly or LTS..."
+
+    $metadataUrl = "https://repo.jenkins-ci.org/releases/org/jenkins-ci/main/jenkins-war/maven-metadata.xml"
+    try {
+        [xml]$metadata = Invoke-WebRequest $metadataUrl -UseBasicParsing
+    }
+    catch {
+        Write-Error "Failed to retrieve Jenkins versions from Artifactory"
+        exit 1
+    }
+    $allVersions = $metadata.metadata.versioning.versions.version
+
+    # Weekly
+    $weeklyVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    # LTS
+    $ltsVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    $latestWeeklyVersion = $weeklyVersions[-1]
+    Write-Host "latest Weekly version: $latestWeeklyVersion"
+    $latestLTSVersion    = $ltsVersions[-1]
+    Write-Host "latest LTS version: $latestLTSVersion"
+
+    $latest = $false
+    if ($Version -eq $latestWeeklyVersion) {
+        $latest = $true
+    }
+    if ($Version -eq $latestLTSVersion) {
+        $latest = $true
+    }
+    if (!$latest) {
+        Write-Host "WARNING: $JenkinsVersion is neither the lastest Weekly nor the latest LTS version"
+    }
+    return $latest
+}

 function Initialize-DockerComposeFile {
     param (
@@ -166,6 +197,24 @@ Test-CommandExists 'yq'
 # Sanity check
 yq --version

+# Add 'lts-' prefix to LTS tags not including Jenkins version
+# Compared to weekly releases, LTS releases include an additional build number in their version
+$releaseLine = 'war'
+# Determine if the current JENKINS_VERSION corresponds to the latest Weekly or LTS version from Artifactory
+$isJenkinsVersionLatest = Test-IsLatestJenkinsRelease -Version $JenkinsVersion
+
+if ($JenkinsVersion.Split('.').Count -eq 3) {
+    $releaseLine = 'war-stable'
+    $env:LATEST_LTS = $isJenkinsVersionLatest
+} else {
+    $env:LATEST_WEEKLY = $isJenkinsVersionLatest
+}
+
+# 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, $JenkinsVersion
+}
+
 $dockerComposeFile = 'build-windows_{0}.yaml' -f $ImageType
 $baseDockerCmd = 'docker-compose --file={0}' -f $dockerComposeFile
 $baseDockerBuildCmd = '{0} build --parallel --pull' -f $baseDockerCmd
@@ -239,6 +288,7 @@ if ($target -eq 'test') {

 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" }
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
…T_WEEKLY` & `LATEST_LTS`

Amends:
- jenkinsci#2189

diff --git a/make.ps1 b/make.ps1
index 665c6ce..abfebdc 100644
--- a/make.ps1
+++ b/make.ps1
@@ -42,21 +42,6 @@ $env:DOCKERHUB_REPO = "$Repository"
 $env:JENKINS_VERSION = "$JenkinsVersion"
 $env:COMMIT_SHA = git rev-parse HEAD

-# 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'
-}
-
-# 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
-}
-
 # Check for required commands
 Function Test-CommandExists {
     Param (
@@ -121,6 +106,52 @@ function Test-Image {

     return $failed
 }
+function Test-IsLatestJenkinsRelease {
+    param (
+        [String] $Version
+    )
+
+    Write-Host "= PREPARE: Checking if $env:JENKINS_VERSION is latest Weekly or LTS..."
+
+    $metadataUrl = "https://repo.jenkins-ci.org/releases/org/jenkins-ci/main/jenkins-war/maven-metadata.xml"
+    try {
+        [xml]$metadata = Invoke-WebRequest $metadataUrl -UseBasicParsing
+    }
+    catch {
+        Write-Error "Failed to retrieve Jenkins versions from Artifactory"
+        exit 1
+    }
+    $allVersions = $metadata.metadata.versioning.versions.version
+
+    # Weekly
+    $weeklyVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    # LTS
+    $ltsVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    $latestWeeklyVersion = $weeklyVersions[-1]
+    Write-Host "latest Weekly version: $latestWeeklyVersion"
+    $latestLTSVersion    = $ltsVersions[-1]
+    Write-Host "latest LTS version: $latestLTSVersion"
+
+    $latest = $false
+    if ($Version -eq $latestWeeklyVersion) {
+        $latest = $true
+    }
+    if ($Version -eq $latestLTSVersion) {
+        $latest = $true
+    }
+    if (!$latest) {
+        Write-Host "WARNING: $JenkinsVersion is neither the lastest Weekly nor the latest LTS version"
+    }
+    return $latest
+}

 function Initialize-DockerComposeFile {
     param (
@@ -166,6 +197,24 @@ Test-CommandExists 'yq'
 # Sanity check
 yq --version

+# Add 'lts-' prefix to LTS tags not including Jenkins version
+# Compared to weekly releases, LTS releases include an additional build number in their version
+$releaseLine = 'war'
+# Determine if the current JENKINS_VERSION corresponds to the latest Weekly or LTS version from Artifactory
+$isJenkinsVersionLatest = Test-IsLatestJenkinsRelease -Version $JenkinsVersion
+
+if ($JenkinsVersion.Split('.').Count -eq 3) {
+    $releaseLine = 'war-stable'
+    $env:LATEST_LTS = $isJenkinsVersionLatest
+} else {
+    $env:LATEST_WEEKLY = $isJenkinsVersionLatest
+}
+
+# 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, $JenkinsVersion
+}
+
 $dockerComposeFile = 'build-windows_{0}.yaml' -f $ImageType
 $baseDockerCmd = 'docker-compose --file={0}' -f $dockerComposeFile
 $baseDockerBuildCmd = '{0} build --parallel --pull' -f $baseDockerCmd
@@ -239,6 +288,7 @@ if ($target -eq 'test') {

 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" }
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
lemeurherve added a commit to lemeurherve/docker that referenced this pull request Feb 15, 2026
…T_WEEKLY` & `LATEST_LTS`

Amends:
- jenkinsci#2189

diff --git a/make.ps1 b/make.ps1
index 665c6ce..abfebdc 100644
--- a/make.ps1
+++ b/make.ps1
@@ -42,21 +42,6 @@ $env:DOCKERHUB_REPO = "$Repository"
 $env:JENKINS_VERSION = "$JenkinsVersion"
 $env:COMMIT_SHA = git rev-parse HEAD

-# 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'
-}
-
-# 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
-}
-
 # Check for required commands
 Function Test-CommandExists {
     Param (
@@ -121,6 +106,52 @@ function Test-Image {

     return $failed
 }
+function Test-IsLatestJenkinsRelease {
+    param (
+        [String] $Version
+    )
+
+    Write-Host "= PREPARE: Checking if $env:JENKINS_VERSION is latest Weekly or LTS..."
+
+    $metadataUrl = "https://repo.jenkins-ci.org/releases/org/jenkins-ci/main/jenkins-war/maven-metadata.xml"
+    try {
+        [xml]$metadata = Invoke-WebRequest $metadataUrl -UseBasicParsing
+    }
+    catch {
+        Write-Error "Failed to retrieve Jenkins versions from Artifactory"
+        exit 1
+    }
+    $allVersions = $metadata.metadata.versioning.versions.version
+
+    # Weekly
+    $weeklyVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    # LTS
+    $ltsVersions = $allVersions |
+        Where-Object { $_ -match '^\d+\.\d+\.\d+$' } |
+        ForEach-Object { [version]$_ } |
+        Sort-Object
+
+    $latestWeeklyVersion = $weeklyVersions[-1]
+    Write-Host "latest Weekly version: $latestWeeklyVersion"
+    $latestLTSVersion    = $ltsVersions[-1]
+    Write-Host "latest LTS version: $latestLTSVersion"
+
+    $latest = $false
+    if ($Version -eq $latestWeeklyVersion) {
+        $latest = $true
+    }
+    if ($Version -eq $latestLTSVersion) {
+        $latest = $true
+    }
+    if (!$latest) {
+        Write-Host "WARNING: $JenkinsVersion is neither the lastest Weekly nor the latest LTS version"
+    }
+    return $latest
+}

 function Initialize-DockerComposeFile {
     param (
@@ -166,6 +197,24 @@ Test-CommandExists 'yq'
 # Sanity check
 yq --version

+# Add 'lts-' prefix to LTS tags not including Jenkins version
+# Compared to weekly releases, LTS releases include an additional build number in their version
+$releaseLine = 'war'
+# Determine if the current JENKINS_VERSION corresponds to the latest Weekly or LTS version from Artifactory
+$isJenkinsVersionLatest = Test-IsLatestJenkinsRelease -Version $JenkinsVersion
+
+if ($JenkinsVersion.Split('.').Count -eq 3) {
+    $releaseLine = 'war-stable'
+    $env:LATEST_LTS = $isJenkinsVersionLatest
+} else {
+    $env:LATEST_WEEKLY = $isJenkinsVersionLatest
+}
+
+# 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, $JenkinsVersion
+}
+
 $dockerComposeFile = 'build-windows_{0}.yaml' -f $ImageType
 $baseDockerCmd = 'docker-compose --file={0}' -f $dockerComposeFile
 $baseDockerBuildCmd = '{0} build --parallel --pull' -f $baseDockerCmd
@@ -239,6 +288,7 @@ if ($target -eq 'test') {

 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" }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bake chore into-lts This should be filed against an LTS branch release-version:2.541.1 Indicate that this has been or will be delivered in this docker controller LTS release. release-version:2.547 windows

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants