Как создать пользовательский шаг сборки на основе существующего в TeamCity Kotlin DSL? - PullRequest
0 голосов
/ 30 июня 2018

Я использую TeamCity Kotlin DSL 2018.1 для настройки конфигурации сборки. Мой файл settings.kts выглядит так:

version = "2018.1"

project {
    buildType {
        id("some-id")
        name = "name"
        steps {
            ant {
                name = "Step1"
                targets = "target1"
                mode = antFile { path = "/some/path" }
                workingDir = "/some/dir"
                jdkHome = "some_jdk"
            }
            ant {
                name = "Step2"
                targets = "target2"
                mode = antFile { path = "/some/path" }
                workingDir = "/some/dir"
                jdkHome = "some_jdk"
            }
            ...
        }
    }
}

Это работает, как и ожидалось, но я хочу избегать записи одинаковых повторяющихся параметров для каждого шага снова и снова.

Я попытался написать функцию, которая создала бы шаг сборки, предварительно заполненный значениями по умолчанию:

fun customAnt(init: AntBuildStep.() -> kotlin.Unit): AntBuildStep {
    val ant_file = AntBuildStep.Mode.AntFile()
    ant_file.path = "/some/path"

    val ant = AntBuildStep()
    ant.mode = ant_file
    ant.workingDir = "/some/dir"
    ant.jdkHome = "some_jdk"
    return ant
}
project {
    buildType {
        id("some-id")
        name = "name"
        steps {
            customAnt {
                name = "Step1"
                targets = "target1"
            }
            customAnt {
                name = "Step2"
                targets = "target2"
            }
            ...
        }
    }
}

Он компилируется, но не работает: TeamCity просто игнорирует шаги сборки, определенные таким образом.

К сожалению, официальная документация не содержит никакой информации о настройке и расширении DSL. Возможно, я что-то не так делаю с конструкцией Котлина () -> Unit, но не могу понять, что именно не так.

1 Ответ

0 голосов
/ 01 июля 2018

Я понял.

На самом деле, я был близко. Следующий код работает так, как я хотел:

version = "2018.1"

fun BuildSteps.customAnt(init: AntBuildStep.() -> Unit): AntBuildStep {
    val ant_file = AntBuildStep.Mode.AntFile()
    ant_file.path = "/some/path"

    val result = AntBuildStep(init)
    result.mode = ant_file
    result.workingDir = "/some/dir"
    result.jdkHome = "some_jdk"
    step(result)
    return result
}

project {    
    buildType {
        steps {
            customAnt {
                name = "step1"
                targets = "target1"
            }
            customAnt {
                name = "step2"
                targets = "target2"
            }
            ...
        }
    }
}
...