All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.gesellix.gradle.docker.tasks.DockerPublishTask.groovy Maven / Gradle / Ivy

package de.gesellix.gradle.docker.tasks

import org.gradle.api.Task
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.TaskAction

class DockerPublishTask extends GenericDockerTask {

    def buildContextDirectory

    @Input
    @Optional
    def buildContext

    @InputDirectory
    @Optional
    File getBuildContextDirectory() {
        buildContextDirectory ? project.file(this.buildContextDirectory) : null
    }

    @Input
    def imageName

    @Input
    @Optional
    def imageTag

    @Internal
    String imageNameWithTag

    @Input
    @Optional
    def targetRegistries

    DockerPublishTask() {
        description = "builds and publishes an image"
        group = "Docker"
    }

    @Override
    Task configure(Closure closure) {
        def configuredTask = super.configure(closure)

        imageNameWithTag = "${configuredTask.getImageName()}"
        if (configuredTask.getImageTag()) {
            imageNameWithTag += ":${configuredTask.getImageTag()}"
        }

        def buildImageTask = configureBuildImageTask()
        configuredTask.getDependsOn().each { parentTaskDependency ->
            if (buildImageTask != parentTaskDependency) {
                buildImageTask.mustRunAfter parentTaskDependency
            }
        }
        configuredTask.dependsOn buildImageTask

        if ((getTargetRegistries() ?: [:]).isEmpty()) {
            logger.warn("No targetRegistries configured, image won't be pushed to any registry.")
        }
        getTargetRegistries().each { registryName, targetRegistry ->
            def pushTask = createUniquePushTask(registryName, targetRegistry, imageNameWithTag, getAuthConfig())
            pushTask.dependsOn buildImageTask
            configuredTask.dependsOn pushTask
        }

        return configuredTask
    }

    def createUniquePushTask(registryName, targetRegistry, imageNameWithTag, authConfig) {
        def pushTask = createUniqueTask(DockerPushTask, "pushImageTo${registryName.capitalize()}For${this.name.capitalize()}").configure {
            repositoryName = imageNameWithTag
            registry = targetRegistry
            authConfigEncoded = authConfig
        }
        def rmiTask = createUniqueTask(DockerRmiTask, "rmi${registryName.capitalize()}ImageFor${this.name.capitalize()}").configure {
            imageId = "${targetRegistry}/${imageNameWithTag}"
        }
        pushTask.finalizedBy rmiTask
    }

    private def configureBuildImageTask() {
        def buildImageTaskName = "buildImageFor${this.name.capitalize()}"
        def buildImageTask = createUniqueTask(DockerBuildTask, buildImageTaskName).configure {
            imageName = imageNameWithTag
            buildContext = this.getBuildContext()
            buildContextDirectory = this.getBuildContextDirectory()
        }
        return buildImageTask
    }

    def createUniqueTask(taskType, String name) {
        def existingTasks = project.tasks.findAll {
            taskType.isInstance(it) && it.name == name
        }
        if (existingTasks.size() > 1) {
            throw new IllegalStateException("unique task expected, found ${existingTasks.size()}.")
        }

        if (existingTasks) {
            return existingTasks.first()
        }
        else {
            return project.task([type: taskType, group: getGroup()], name)
        }
    }

    @TaskAction
    def publish() {
        logger.info "running publish..."
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy