package templates import jetbrains.buildServer.configs.kotlin.* import jetbrains.buildServer.configs.kotlin.buildFeatures.commitStatusPublisher import jetbrains.buildServer.configs.kotlin.buildFeatures.dockerRegistryConnections import jetbrains.buildServer.configs.kotlin.buildSteps.DockerCommandStep import jetbrains.buildServer.configs.kotlin.buildSteps.dockerCommand import jetbrains.buildServer.configs.kotlin.triggers.vcs /** * Configuration for Docker build template */ open class DockerBuildConfig { /** Docker registry URL (without protocol) */ var registry: String = "registry.dot-dot.ru" /** Path to Dockerfile relative to repo root */ var dockerfile: String = "Dockerfile" /** Image tag expression, supports TeamCity parameters */ var tag: String = "%teamcity.build.branch%" /** Additional docker build arguments */ var buildArgs: String = "--pull" /** Docker registry connection ID in TeamCity */ var dockerRegistryId: String = "PROJECT_EXT_2" /** Extra hosts for docker build (host:ip format) */ var extraHosts: List = listOf() /** Enable VCS trigger */ var enableVcsTrigger: Boolean = true /** Branch filter for VCS trigger (e.g., "+:*" for all branches, "+:refs/tags/*" for tags) */ var branchFilter: String = "" /** Enable trigger on tags */ var triggerOnTags: Boolean = false /** Gitea API URL for commit status */ var giteaUrl: String = "https://gitea.dot-dot.ru/api/v1" /** Gitea token credential ID */ var giteaTokenId: String = "credentialsJSON:gitea-token" } /** * Template for building and pushing Docker images * * Usage: * ``` * object Build : DockerBuildTemplate({ * registry = "registry.dot-dot.ru" * dockerfile = "Dockerfile" * extraHosts = listOf("nexus.dot-dot.ru:192.168.100.110") * }) * ``` */ open class DockerBuildTemplate( configure: DockerBuildConfig.() -> Unit = {} ) : BuildType() { protected val config = DockerBuildConfig().apply(configure) init { name = "build" allowExternalStatus = true steps { dockerCommand { name = "build image" id = "build_image" commandType = build { source = file { path = config.dockerfile } platform = DockerCommandStep.ImagePlatform.Linux namesAndTags = "${config.registry}/%env.TEAMCITY_PROJECT_NAME%:${config.tag}" commandArgs = buildDockerArgs() } } dockerCommand { name = "push to registry" id = "push_to_registry" commandType = push { namesAndTags = "${config.registry}/%env.TEAMCITY_PROJECT_NAME%:${config.tag}" } } } if (config.enableVcsTrigger) { triggers { vcs { // Build branch filter val filters = mutableListOf() if (config.branchFilter.isNotEmpty()) { filters.add(config.branchFilter) } if (config.triggerOnTags) { filters.add("+:refs/tags/*") } if (filters.isNotEmpty()) { branchFilter = filters.joinToString("\n") } } } } features { dockerRegistryConnections { loginToRegistry = on { dockerRegistryId = config.dockerRegistryId } } commitStatusPublisher { publisher = github { githubUrl = config.giteaUrl authType = personalToken { token = config.giteaTokenId } } } } } private fun buildDockerArgs(): String { val args = mutableListOf(config.buildArgs) config.extraHosts.forEach { host -> args.add("--add-host=$host") } return args.joinToString(" ") } }