Child pages
  • Indore 10 EAP2 (build 41463) Release Notes

Versions Compared


  • This line was added.
  • This line was removed.
  • Formatting was changed.


  • each time when you make a commit into .teamcity, TeamCity will execute Kotlin DSL files. Since internally, TeamCity still operates with XML, executed DSL files will produce a bunch of XML files. These XML files then will be applied to existing project effectively changing its configuration. In case of any problems (compilation failures, runtime errors, etc), new changes will not be applied, and current project settings will be preserved on the server.
  • once project is switched to Kotlin, project settings web UI will become disabled (except a few pages: Versioned settings, Maven Settings, SSH keys and Meta-runners), because currently there is no way to propagate changes made via web UI to Kotlin DSL files.
  • Kotlin script is executed on the server, and since this is a potentially dangerous operation, the script is executed in sandbox. It cannot modify file system except the place where it is executed, cannot run other programs, cannot use reflection, and so on.

Examples Example of a Project defined in Kotlin DSL:

Code Block
object Project : KProject({
    uuid = "my_project_id" // uuid should be some constant, never changing string; it is important for preserving history, new id means new entity with new history
    parentId = "_Root" // id of the parent project
    name = "Example of DSL"

    val vcsRoot = vcsRoot (KVcsRoot({
        uuid = "my_vcs_root_id" 
        extId = "ExampleOfDSL_VcsRoot"
        type = "jetbrains.git" // other available types: svn, perforce, tfs, mercurial, starteam, cvs, vault-vcs
        name = "Example of DSL VCS Root"
        param("url", "<url to my git repository>")

    buildType (KBuildType ({
        uuid = "my_build_type_id"
        extId = "ExampleOfDSL_Build"
        name = "Build"

        vcs {
             entry(vcsRoot) // thanks to Kotlin, here we can have static reference to project VCS root

        steps {
             step {
                  type = "Maven2"
                  param("goals", "clean test")

        options {
             buildNumberPattern = "%build.counter%"

        requirements {
             contains("", "Linux")

Since this is essentially Kotlin code, you can do whatever you like, add conditions, loops, methods, classes, etc. Note that for your convenience methods buildType(), vcsRoot() and others not only accept some instance, they also return it as a result. In the example about you can see how vcsRoot instance can be reused in build configuration. 

Smart checking for changes interval