From 9688a31e0511c97a35cf64a5621e089cde704ced Mon Sep 17 00:00:00 2001 From: Dana Maxfield Date: Mon, 6 Oct 2025 17:27:35 -0400 Subject: [PATCH 1/4] IALERT-3896 - Pre remove base images before building --- build.gradle | 11 ++++++-- buildSrc/docker.gradle | 33 ++++++++++++++++++---- docker/blackduck-alert-db/Dockerfile | 11 ++++---- docker/blackduck-alert-rabbitmq/Dockerfile | 9 ++++-- docker/blackduck-alert/Dockerfile | 9 ++++-- 5 files changed, 54 insertions(+), 19 deletions(-) diff --git a/build.gradle b/build.gradle index 3aaa1dc9f3..33f727e1e0 100644 --- a/build.gradle +++ b/build.gradle @@ -36,10 +36,15 @@ ext { postgresContainerVersionMigration = '15.8' postgresContainerVersionCurrent = '16.9' - // Docker Variables + // All variables that start with 'dockerBuildParam+' will all be passed to the 'docker build' command + dockerBuildParam_BASEIMAGE_HUB_DOCKER_COMMON = 'blackducksoftware/hub-docker-common:1.0.7' + dockerBuildParam_BASEIMAGE_BLACKDUCK_ALERT = 'alpine:3.20' + dockerBuildParam_BASEIMAGE_BLACKDUCK_ALERT_DB_MIGRATION = 'postgres:' + postgresContainerVersionMigration + '-alpine' + dockerBuildParam_BASEIMAGE_BLACKDUCK_ALERT_DB = 'postgres:' + postgresContainerVersionCurrent + '-alpine' dockerBuildParam_POSTGRES_MIGRATION_VERSION = postgresContainerVersionMigration - dockerBuildParam_POSTGRESIMAGEVERSION_MIGRATION = 'postgres:' + postgresContainerVersionMigration + '-alpine' - dockerBuildParam_POSTGRESIMAGEVERSION = 'postgres:' + postgresContainerVersionCurrent + '-alpine' + dockerBuildParam_BASEIMAGE_BLACKDUCK_ALERT_RABBITMQ = 'rabbitmq:3.13-alpine' + + // General Docker Variables dockerStagingDirectory = project.buildDir.toString() + '/docker-staging' baseDockerDirectory = project.projectDir.toString() + '/docker' dockerCleanStagingAreaDirectoryStageName = 'dockerCleanStagingAreaDirectory' diff --git a/buildSrc/docker.gradle b/buildSrc/docker.gradle index 19262da215..d931cca7b1 100644 --- a/buildSrc/docker.gradle +++ b/buildSrc/docker.gradle @@ -10,21 +10,26 @@ String dockerPublishAllImages_DH = rootProject.ext.dockerPublishAllImages_DHStag String dockerPublishAllImages_ART = rootProject.ext.dockerPublishAllImages_ARTStageName String dockerPublishAllImages = rootProject.ext.dockerPublishAllImagesStageName -ext.createDockerRemoveTask = { removeTaskName, removeGroupName, removeImageName, primaryDependencyTaskName -> - project.tasks.create(name: removeTaskName, type: Exec, group: removeGroupName, description: "Docker remove tagged Artifactory image. ") { +ext.createDockerRemoveTask = { removeTaskName, removeGroupName, removeImageNames, primaryDependencyTaskName -> + project.tasks.create(name: removeTaskName, type: Exec, group: removeGroupName, description: "Docker remove tagged Docker images. ") { outputs.upToDateWhen { false } ignoreExitValue = true errorOutput = new ByteArrayOutputStream() - commandLine 'docker', 'image', 'rm', removeImageName + def imageList = removeImageNames as List + def command = ['docker', 'image', 'rm'] + command.addAll(imageList) + + logger.lifecycle("Pre-removing the following images: " + imageList) + commandLine command doLast { String stdErr = errorOutput.toString() if (stdErr?.trim() && !stdErr.contains("Deleted: ")) { if (stdErr.contains("No such image")) { - logger.lifecycle("Image does not exist, continuing.") + logger.lifecycle("One or more images do not exist, continuing.") } else { throw new GradleException("${stdErr}") } @@ -102,10 +107,26 @@ dockerImagesToBuild.each { imageName -> imageTaskNameSuffix += token.substring(0, 1).toUpperCase() + token.substring(1).toLowerCase() } + // Identify base images that should be pre-removed + def imageNamesToRemove = [] + imageNamesToRemove.add(fullDockerImageName) + + def dockerfile = new File(baseDockerDirectory + '/' + imageName + '/Dockerfile') + dockerfile.eachLine { line -> + def matcher = line =~ /^FROM\s+\$\{([^}]+)\}/ + if (matcher.find()) { + def gradlePropertyName = "dockerBuildParam_${matcher.group(1)}".toString() + if (!rootProject.ext.properties.containsKey(gradlePropertyName)) { + throw new GradleException("Missing Gradle property: ${gradlePropertyName}") + } + imageNamesToRemove << rootProject.ext.properties[gradlePropertyName] + } + } + String dockerImageRemoveTaskName = "dockerRemove${imageTaskNameSuffix}" String dockerImageBuildTaskName = "dockerBuild${imageTaskNameSuffix}" - ext.createDockerRemoveTask(dockerImageRemoveTaskName, 'Docker', fullDockerImageName, dockerRemoveAllImages) + ext.createDockerRemoveTask(dockerImageRemoveTaskName, 'Docker', imageNamesToRemove, dockerRemoveAllImages) project.tasks.create(name: dockerImageBuildTaskName, type: Exec, dependsOn: [dockerSetupStagingAreaDirectory], group: 'Docker', description: "Build docker image. ") { outputs.upToDateWhen { false } @@ -202,5 +223,5 @@ dockerImagesToBuild.each { imageName -> } project.tasks.findByName(dockerPublishAllImages_ART).dependsOn project.tasks.findByName(dockerImagePublishARTTaskName) - ext.createDockerRemoveTask(dockerImageRemoveTagARTaskName, 'Docker_Artifactory', artifactoryDockerImageName, dockerRemoveAllImages) + ext.createDockerRemoveTask(dockerImageRemoveTagARTaskName, 'Docker_Artifactory', [artifactoryDockerImageName], dockerRemoveAllImages) } diff --git a/docker/blackduck-alert-db/Dockerfile b/docker/blackduck-alert-db/Dockerfile index 61dab8c2bd..5c44289800 100644 --- a/docker/blackduck-alert-db/Dockerfile +++ b/docker/blackduck-alert-db/Dockerfile @@ -1,11 +1,10 @@ -# The ARG for the FROM image comes from Gradle. It is based off of postgresContainerVersion, +# The ARG's for the FROM images come from Gradle. Base image variables are set in the root build.gradle, # and used in buildSrc/docker.gradle -ARG POSTGRESIMAGEVERSION_MIGRATION="default" -ARG POSTGRESIMAGEVERSION="default" +ARG BASEIMAGE_BLACKDUCK_ALERT_DB_MIGRATION="default" +ARG BASEIMAGE_BLACKDUCK_ALERT_DB="default" -FROM ${POSTGRESIMAGEVERSION_MIGRATION} AS old - -FROM ${POSTGRESIMAGEVERSION} +FROM ${BASEIMAGE_BLACKDUCK_ALERT_DB_MIGRATION} AS old +FROM ${BASEIMAGE_BLACKDUCK_ALERT_DB} ARG VERSION ARG COMMITHASH diff --git a/docker/blackduck-alert-rabbitmq/Dockerfile b/docker/blackduck-alert-rabbitmq/Dockerfile index 855cda0f87..511536c3f1 100644 --- a/docker/blackduck-alert-rabbitmq/Dockerfile +++ b/docker/blackduck-alert-rabbitmq/Dockerfile @@ -1,5 +1,10 @@ -FROM blackducksoftware/hub-docker-common:1.0.7 AS docker-common -FROM rabbitmq:3.13-alpine +# The ARG's for the FROM images come from Gradle. Base image variables are set in the root build.gradle, +# and used in buildSrc/docker.gradle +ARG BASEIMAGE_HUB_DOCKER_COMMON="default" +ARG BASEIMAGE_BLACKDUCK_ALERT_RABBITMQ="default" + +FROM ${BASEIMAGE_HUB_DOCKER_COMMON} AS docker-common +FROM ${BASEIMAGE_BLACKDUCK_ALERT_RABBITMQ} ARG VERSION ARG COMMITHASH diff --git a/docker/blackduck-alert/Dockerfile b/docker/blackduck-alert/Dockerfile index d0766a56a5..be262cccf0 100644 --- a/docker/blackduck-alert/Dockerfile +++ b/docker/blackduck-alert/Dockerfile @@ -1,5 +1,10 @@ -FROM blackducksoftware/hub-docker-common:1.0.7 AS docker-common -FROM alpine:3.20 +# The ARG's for the FROM images come from Gradle. Base image variables are set in the root build.gradle, +# and used in buildSrc/docker.gradle +ARG BASEIMAGE_HUB_DOCKER_COMMON="default" +ARG BASEIMAGE_BLACKDUCK_ALERT="default" + +FROM ${BASEIMAGE_HUB_DOCKER_COMMON} AS docker-common +FROM ${BASEIMAGE_BLACKDUCK_ALERT} ARG VERSION ARG COMMITHASH From a84b40f1384b5a48a55f25f6306d5cfd662c8d91 Mon Sep 17 00:00:00 2001 From: Dana Maxfield Date: Tue, 7 Oct 2025 10:24:24 -0400 Subject: [PATCH 2/4] IALERT-3896 - Debug logging --- buildSrc/docker.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/buildSrc/docker.gradle b/buildSrc/docker.gradle index d931cca7b1..ac788927f0 100644 --- a/buildSrc/docker.gradle +++ b/buildSrc/docker.gradle @@ -27,6 +27,8 @@ ext.createDockerRemoveTask = { removeTaskName, removeGroupName, removeImageNames doLast { String stdErr = errorOutput.toString() + logger.lifecycle("Docker rm stdErr : " + stdErr) + if (stdErr?.trim() && !stdErr.contains("Deleted: ")) { if (stdErr.contains("No such image")) { logger.lifecycle("One or more images do not exist, continuing.") From b5419eec395227b40005a491f90b462acdc40118 Mon Sep 17 00:00:00 2001 From: Dana Maxfield Date: Tue, 7 Oct 2025 11:57:38 -0400 Subject: [PATCH 3/4] IALERT-3896 - Improve message --- buildSrc/docker.gradle | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/buildSrc/docker.gradle b/buildSrc/docker.gradle index ac788927f0..c310debe71 100644 --- a/buildSrc/docker.gradle +++ b/buildSrc/docker.gradle @@ -27,11 +27,9 @@ ext.createDockerRemoveTask = { removeTaskName, removeGroupName, removeImageNames doLast { String stdErr = errorOutput.toString() - logger.lifecycle("Docker rm stdErr : " + stdErr) - if (stdErr?.trim() && !stdErr.contains("Deleted: ")) { if (stdErr.contains("No such image")) { - logger.lifecycle("One or more images do not exist, continuing.") + logger.lifecycle("One or more images did not need to be removed, continuing.") } else { throw new GradleException("${stdErr}") } From 17eec4ada9c0aa6963e61309b6b464c2d517dd53 Mon Sep 17 00:00:00 2001 From: Dana Maxfield Date: Thu, 13 Nov 2025 08:54:13 -0500 Subject: [PATCH 4/4] IALERT-3896 - Add matcher to match IMAGE and {IMAGE} --- buildSrc/docker.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/docker.gradle b/buildSrc/docker.gradle index c310debe71..535e51e5c9 100644 --- a/buildSrc/docker.gradle +++ b/buildSrc/docker.gradle @@ -113,7 +113,7 @@ dockerImagesToBuild.each { imageName -> def dockerfile = new File(baseDockerDirectory + '/' + imageName + '/Dockerfile') dockerfile.eachLine { line -> - def matcher = line =~ /^FROM\s+\$\{([^}]+)\}/ + def matcher = line =~ /^FROM\s+\$\{?([^}]+)\}?/ if (matcher.find()) { def gradlePropertyName = "dockerBuildParam_${matcher.group(1)}".toString() if (!rootProject.ext.properties.containsKey(gradlePropertyName)) {