135 lines
4.1 KiB
Kotlin
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(" ")
|
|
}
|
|
}
|