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..535e51e5c9 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 did not need to be removed, 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