ci-templates/.teamcity/templates/DockerBuildTemplate.kt

135 lines
4.1 KiB
Kotlin

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<String> = 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<String>()
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(" ")
}
}