Initial commit
This commit is contained in:
commit
43063f1f46
|
@ -0,0 +1,9 @@
|
|||
|
||||
# Change Log
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
||||
and this project adheres to [Semantic Versioning](http://semver.org/).
|
||||
|
||||
## [1.0.0] - 2022-06-06
|
||||
- Initial release
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"name": "bit/taskman_teamcity",
|
||||
"description": "Teamcity build setup for RND",
|
||||
"homepage": "https://git.bit5.ru/composer/taskman_teamcity",
|
||||
"require": {
|
||||
"php": ">=7.4"
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": ["teamcity.inc.php"],
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
namespace taskman;
|
||||
use Exception;
|
||||
|
||||
task('setup_teamcity_settings', function($args = [])
|
||||
{
|
||||
setup_teamcity_settings($args);
|
||||
});
|
||||
|
||||
function setup_teamcity_settings($args = array())
|
||||
{
|
||||
global $GAME_ROOT;
|
||||
|
||||
$cmd = "git config --get remote.origin.url";
|
||||
$url = str_replace("\n", "", shell_exec($cmd));
|
||||
$name = "\"git: ${url}\"";
|
||||
taskman_propset("TEAM_CITY_SETTINGS_NAME_HERE", $name);
|
||||
taskman_propset("TEAM_CITY_SETTINGS_URL_HERE", "\"$url\"");
|
||||
|
||||
gen_build_file(__DIR__ . "/teamcity/settings.kts.in",
|
||||
"$GAME_ROOT/.teamcity/settings.kts");
|
||||
}
|
|
@ -0,0 +1,573 @@
|
|||
import jetbrains.buildServer.configs.kotlin.v2019_2.*
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.vcs.GitVcsRoot
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.projectFeatures.slackConnection
|
||||
import jetbrains.buildServer.configs.kotlin.v2019_2.buildFeatures.notifications
|
||||
|
||||
/*
|
||||
The settings script is an entry point for defining a TeamCity
|
||||
project hierarchy. The script should contain a single call to the
|
||||
project() function with a Project instance or an init function as
|
||||
an argument.
|
||||
|
||||
VcsRoots, BuildTypes, Templates, and subprojects can be
|
||||
registered inside the project using the vcsRoot(), buildType(),
|
||||
template(), and subProject() methods respectively.
|
||||
|
||||
To debug settings scripts in command-line, run the
|
||||
|
||||
mvnDebug org.jetbrains.teamcity:teamcity-configs-maven-plugin:generate
|
||||
|
||||
command and attach your debugger to the port 8000.
|
||||
|
||||
To debug in IntelliJ Idea, open the 'Maven Projects' tool window (View
|
||||
-> Tool Windows -> Maven Projects), find the generate task node
|
||||
(Plugins -> teamcity-configs -> teamcity-configs:generate), the
|
||||
'Debug' option is available in the context menu for the task.
|
||||
*/
|
||||
|
||||
version = "2020.2"
|
||||
|
||||
project {
|
||||
vcsRoot(GitProjectRepo)
|
||||
|
||||
cleanup {
|
||||
keepRule {
|
||||
id = "KEEP_RULE_1"
|
||||
keepAtLeast = days(3)
|
||||
dataToKeep = everything()
|
||||
applyPerEachBranch = true
|
||||
preserveArtifactsDependencies = true
|
||||
}
|
||||
}
|
||||
|
||||
features {
|
||||
slackConnection {
|
||||
id = "PROJECT_EXT_2"
|
||||
displayName = "Slack"
|
||||
botToken = "zxxf1ef05c471abaea287f16830919d229f61360973870b6e853ace38bf62e5ec066b2bdef118e22d099ad99fe1343aad4a9f24ef83589597df775d03cbe80d301b"
|
||||
clientId = "141599046048.1771998951381"
|
||||
clientSecret = "zxx87b200290c3fc5ac692d3612fdb1ab75faab4e67de5dfbd2e779f4ac295144e0775d03cbe80d301b"
|
||||
}
|
||||
}
|
||||
|
||||
sequence {
|
||||
parallel {
|
||||
//Android
|
||||
build(BuildAndroid)
|
||||
build(UploadArtifactToSlack("Build_Upload_Android", BuildAndroid))
|
||||
|
||||
//IOS
|
||||
build(BuildIOS)
|
||||
build(UploadArtifactToSlack("Build_Upload_IOS", BuildIOS))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
object BuildAndroid : BuildAndroidType("", "prod/global_android", "+:*")
|
||||
object BuildIOS : BuildIOSType("", "prod/global_ios", "+:*")
|
||||
|
||||
open class BuildAndroidType(proj : String, env : String, branch: String) :
|
||||
BuildType({
|
||||
name = "Build Android"
|
||||
|
||||
var artifact_rules : String = "*.apk\n*.aab"
|
||||
artifactRules = artifact_rules
|
||||
|
||||
vcs {
|
||||
root(GitProjectRepo)
|
||||
branchFilter = branch
|
||||
}
|
||||
|
||||
params {
|
||||
checkbox("build.env.debug", "false", label = "Debug",
|
||||
description = "Build developer version.", checked = "true")
|
||||
param("build.env.buildName", "%system.teamcity.buildConfName%")
|
||||
param("build.env.workDir", "%system.teamcity.build.workingDir%")
|
||||
param("build.env.artifactRules", artifact_rules)
|
||||
}
|
||||
|
||||
features {
|
||||
notifications {
|
||||
notifierSettings = slackNotifier {
|
||||
connection = "PROJECT_EXT_2"
|
||||
sendTo = "#rnd-builds"
|
||||
messageFormat = verboseMessageFormat {
|
||||
addBranch = true
|
||||
addStatusText = true
|
||||
maximumNumberOfChanges = 10
|
||||
}
|
||||
}
|
||||
buildFailed = true
|
||||
buildFinishedSuccessfully = true
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var gamectl_environment = if("%build.env.debug%" == "true") env.replace("global", "dev") else env
|
||||
|
||||
steps {
|
||||
script {
|
||||
name = "Deps Update"
|
||||
scriptContent = "./gamectl try_deps_update"
|
||||
}
|
||||
script {
|
||||
name = "Clean"
|
||||
scriptContent = "./gamectl clean"
|
||||
}
|
||||
script {
|
||||
name = "Produce"
|
||||
scriptContent = "./gamectl --env=" + gamectl_environment + " build_android"
|
||||
}
|
||||
}
|
||||
|
||||
requirements {
|
||||
equals("teamcity.agent.name", "Default Agent")
|
||||
}
|
||||
}
|
||||
)
|
||||
{}
|
||||
|
||||
|
||||
open class BuildIOSType(proj : String, env : String, branch : String) :
|
||||
BuildType({
|
||||
name = "Build IOS"
|
||||
|
||||
var artifact_rules : String = "*.ipa"
|
||||
artifactRules = artifact_rules
|
||||
|
||||
vcs {
|
||||
root(GitProjectRepo)
|
||||
branchFilter = branch
|
||||
}
|
||||
|
||||
params {
|
||||
checkbox("build.env.debug", "false", label = "Debug",
|
||||
description = "Build developer version.", checked = "true")
|
||||
param("build.env.buildName", "%system.teamcity.buildConfName%")
|
||||
param("build.env.workDir", "%system.teamcity.build.workingDir%")
|
||||
param("build.env.artifactRules", artifact_rules)
|
||||
}
|
||||
|
||||
features {
|
||||
notifications {
|
||||
notifierSettings = slackNotifier {
|
||||
connection = "PROJECT_EXT_2"
|
||||
sendTo = "#rnd-builds"
|
||||
messageFormat = verboseMessageFormat {
|
||||
addBranch = true
|
||||
addStatusText = true
|
||||
maximumNumberOfChanges = 10
|
||||
}
|
||||
}
|
||||
buildFailed = true
|
||||
buildFinishedSuccessfully = true
|
||||
}
|
||||
}
|
||||
|
||||
var gamectl_environment = if("%build.env.debug%" == "true") env.replace("global", "dev") else env
|
||||
|
||||
steps {
|
||||
script {
|
||||
name = "Deps Update"
|
||||
scriptContent = "./gamectl try_deps_update"
|
||||
}
|
||||
script {
|
||||
name = "Clean"
|
||||
scriptContent = "./gamectl clean"
|
||||
}
|
||||
script {
|
||||
name = "Produce"
|
||||
scriptContent = "./gamectl --env=" + gamectl_environment + " build_ios"
|
||||
}
|
||||
}
|
||||
|
||||
requirements {
|
||||
matches("teamcity.agent.name", "(Default Agent 2|Default Agent 3)")
|
||||
}
|
||||
})
|
||||
{}
|
||||
|
||||
open class UploadArtifactToSlack(build_id : String, build_deps : BuildType) : BuildType({
|
||||
id(build_id)
|
||||
name = build_id.replace("_", " ")
|
||||
|
||||
vcs {
|
||||
root(GitProjectRepo)
|
||||
}
|
||||
|
||||
val project_name : String = "%system.teamcity.projectName%"
|
||||
val deps_build_name : String = build_deps.depParamRefs["build.env.buildName"].ref
|
||||
val deps_build_number : String = build_deps.depParamRefs.buildNumber.ref
|
||||
val deps_build_directory : String = build_deps.depParamRefs["build.env.workDir"].ref
|
||||
|
||||
steps {
|
||||
script {
|
||||
name = "Upload"
|
||||
scriptContent = """
|
||||
#!/bin/bash
|
||||
init_message="Artifacts For ${project_name} / ${deps_build_name} #${deps_build_number} %0A:tada:"
|
||||
auth="Bearer xoxb-141599046048-1775293613715-4ipxfXXSdFZaPHuoTL3ms8TT"
|
||||
main_thread=${'$'}(curl -d "text=${'$'}init_message" -d "channel=C01P5JB13SM" -H "Authorization:${'$'}auth" -X POST https://slack.com/api/chat.postMessage)\;
|
||||
thread_id=${'$'}(echo ${'$'}main_thread | sed 's/.*"ts":"\([^"]*\)".*/\1/')\;
|
||||
|
||||
artifacts=${'$'}(find ${deps_build_directory} -maxdepth 1 \( -name "*.apk" -o -name "*.aab" \))\;
|
||||
for item in ${'$'}artifacts\;
|
||||
do
|
||||
curl -F file=@${'$'}item -F channels=C01P5JB13SM -F thread_ts=${'$'}thread_id -H "Authorization:${'$'}auth" https://slack.com/api/files.upload
|
||||
done
|
||||
""".trimIndent()
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
artifacts(build_deps){
|
||||
artifactRules = build_deps.depParamRefs["build.env.artifactRules"].ref
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
object PublishArifactToGoogle : BuildType({
|
||||
name = "Publish Android"
|
||||
|
||||
vcs {
|
||||
root(GitProjectRepo)
|
||||
}
|
||||
})
|
||||
|
||||
object PublishArifactToTestFlight : BuildType({
|
||||
name = "Publish IOS"
|
||||
|
||||
vcs {
|
||||
root(GitProjectRepo)
|
||||
}
|
||||
})
|
||||
|
||||
object GitProjectRepo : GitVcsRoot({
|
||||
name = %(TEAM_CITY_SETTINGS_NAME_HERE)%
|
||||
url = %(TEAM_CITY_SETTINGS_URL_HERE)%
|
||||
agentCleanPolicy = AgentCleanPolicy.NEVER
|
||||
branch = "master"
|
||||
branchSpec = "+:*"
|
||||
authMethod = password {
|
||||
userName = "game_ci"
|
||||
password = "zxx47498c67380e2c74005e14d1ad544585"
|
||||
}
|
||||
})
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
|
||||
typealias DependencySettings = SnapshotDependency.() -> Unit
|
||||
|
||||
abstract class Stage {
|
||||
var dependencySettings: DependencySettings = {}
|
||||
val dependencies = mutableListOf<Pair<Stage, DependencySettings>>()
|
||||
}
|
||||
|
||||
class Single(val buildType: BuildType) : Stage()
|
||||
|
||||
class Parallel : Stage() {
|
||||
val buildTypes = arrayListOf<BuildType>()
|
||||
val sequences = arrayListOf<Sequence>()
|
||||
}
|
||||
|
||||
class Sequence : Stage() {
|
||||
val stages = arrayListOf<Stage>()
|
||||
}
|
||||
|
||||
fun Parallel.build(bt: BuildType, block: BuildType.() -> Unit = {}): BuildType {
|
||||
bt.apply(block)
|
||||
buildTypes.add(bt)
|
||||
return bt
|
||||
}
|
||||
|
||||
fun Parallel.build(block: BuildType.() -> Unit): BuildType {
|
||||
val bt = BuildType().apply(block)
|
||||
buildTypes.add(bt)
|
||||
return bt
|
||||
}
|
||||
|
||||
fun Parallel.sequence(block: Sequence.() -> Unit): Sequence {
|
||||
val sequence = Sequence().apply(block)
|
||||
buildDependencies(sequence)
|
||||
sequences.add(sequence)
|
||||
return sequence
|
||||
}
|
||||
|
||||
fun Sequence.sequence(block: Sequence.() -> Unit): Sequence {
|
||||
val sequence = Sequence().apply(block)
|
||||
buildDependencies(sequence)
|
||||
stages.add(sequence)
|
||||
return sequence
|
||||
}
|
||||
|
||||
fun Sequence.parallel(block: Parallel.() -> Unit): Parallel {
|
||||
val parallel = Parallel().apply(block)
|
||||
stages.add(parallel)
|
||||
return parallel
|
||||
}
|
||||
|
||||
fun Sequence.build(bt: BuildType, block: BuildType.() -> Unit = {}): BuildType {
|
||||
bt.apply(block)
|
||||
stages.add(Single(bt))
|
||||
return bt
|
||||
}
|
||||
|
||||
fun Sequence.build(block: BuildType.() -> Unit): BuildType {
|
||||
val bt = BuildType().apply(block)
|
||||
stages.add(Single(bt))
|
||||
return bt
|
||||
}
|
||||
|
||||
fun Project.sequence(block: Sequence.() -> Unit): Sequence {
|
||||
val sequence = Sequence().apply(block)
|
||||
buildDependencies(sequence)
|
||||
registerBuilds(sequence)
|
||||
return sequence
|
||||
}
|
||||
|
||||
fun buildDependencies(sequence: Sequence) {
|
||||
sequence.dependencies.forEach {
|
||||
stageDependsOnStage(sequence, it)
|
||||
}
|
||||
|
||||
var previous: Pair<Stage, DependencySettings>? = null
|
||||
|
||||
for (stage in sequence.stages) {
|
||||
if (previous != null) {
|
||||
stageDependsOnStage(stage, Pair(previous.first, stage.dependencySettings))
|
||||
}
|
||||
stage.dependencies.forEach { dependency ->
|
||||
stageDependsOnStage(stage, dependency)
|
||||
}
|
||||
|
||||
val dependencySettings = previous?.second ?: {}
|
||||
previous = Pair(stage, dependencySettings)
|
||||
}
|
||||
}
|
||||
|
||||
fun stageDependsOnStage(stage: Stage, dependency: Pair<Stage, DependencySettings>) {
|
||||
val s = dependency.first
|
||||
val d = dependency.second
|
||||
if (s is Single) {
|
||||
stageDependsOnSingle(stage, Pair(s, d))
|
||||
}
|
||||
if (s is Parallel) {
|
||||
stageDependsOnParallel(stage, Pair(s, d))
|
||||
}
|
||||
if (s is Sequence) {
|
||||
stageDependsOnSequence(stage, Pair(s, d))
|
||||
}
|
||||
}
|
||||
|
||||
fun stageDependsOnSingle(stage: Stage, dependency: Pair<Single, DependencySettings>) {
|
||||
if (stage is Single) {
|
||||
singleDependsOnSingle(stage, dependency)
|
||||
}
|
||||
if (stage is Parallel) {
|
||||
parallelDependsOnSingle(stage, dependency)
|
||||
}
|
||||
if (stage is Sequence) {
|
||||
sequenceDependsOnSingle(stage, dependency)
|
||||
}
|
||||
}
|
||||
|
||||
fun stageDependsOnParallel(stage: Stage, dependency: Pair<Parallel, DependencySettings>) {
|
||||
if (stage is Single) {
|
||||
singleDependsOnParallel(stage, dependency)
|
||||
}
|
||||
if (stage is Parallel) {
|
||||
parallelDependsOnParallel(stage, dependency)
|
||||
}
|
||||
if (stage is Sequence) {
|
||||
sequenceDependsOnParallel(stage, dependency)
|
||||
}
|
||||
}
|
||||
|
||||
fun stageDependsOnSequence(stage: Stage, dependency: Pair<Sequence, DependencySettings>) {
|
||||
if (stage is Single) {
|
||||
singleDependsOnSequence(stage, dependency)
|
||||
}
|
||||
if (stage is Parallel) {
|
||||
parallelDependsOnSequence(stage, dependency)
|
||||
}
|
||||
if (stage is Sequence) {
|
||||
sequenceDependsOnSequence(stage, dependency)
|
||||
}
|
||||
}
|
||||
|
||||
fun singleDependsOnSingle(stage: Single, dependency: Pair<Single, DependencySettings>) {
|
||||
stage.buildType.dependencies.dependency(dependency.first.buildType) {
|
||||
snapshot(dependency.second)
|
||||
}
|
||||
}
|
||||
|
||||
fun singleDependsOnParallel(stage: Single, dependency: Pair<Parallel, DependencySettings>) {
|
||||
dependency.first.buildTypes.forEach { buildType ->
|
||||
val dep = Pair(Single(buildType), dependency.second)
|
||||
singleDependsOnSingle(stage, dep)
|
||||
}
|
||||
dependency.first.sequences.forEach { sequence ->
|
||||
val dep = Pair(sequence, dependency.second)
|
||||
singleDependsOnSequence(stage, dep)
|
||||
}
|
||||
}
|
||||
|
||||
fun singleDependsOnSequence(stage: Single, dependency: Pair<Sequence, DependencySettings>) {
|
||||
dependency.first.stages.lastOrNull()?.let { lastStage ->
|
||||
if (lastStage is Single) {
|
||||
singleDependsOnSingle(stage, Pair(lastStage, dependency.second))
|
||||
}
|
||||
if (lastStage is Parallel) {
|
||||
singleDependsOnParallel(stage, Pair(lastStage, dependency.second))
|
||||
}
|
||||
if (lastStage is Sequence) {
|
||||
singleDependsOnSequence(stage, Pair(lastStage, dependency.second))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun parallelDependsOnSingle(stage: Parallel, dependency: Pair<Single, DependencySettings>) {
|
||||
stage.buildTypes.forEach { buildType ->
|
||||
val single = Single(buildType)
|
||||
singleDependsOnSingle(single, dependency)
|
||||
}
|
||||
stage.sequences.forEach { sequence ->
|
||||
sequenceDependsOnSingle(sequence, dependency)
|
||||
}
|
||||
}
|
||||
|
||||
fun parallelDependsOnParallel(stage: Parallel, dependency: Pair<Parallel, DependencySettings>) {
|
||||
stage.buildTypes.forEach { buildType ->
|
||||
singleDependsOnParallel(Single(buildType), dependency)
|
||||
}
|
||||
stage.sequences.forEach { sequence ->
|
||||
sequenceDependsOnParallel(sequence, dependency)
|
||||
}
|
||||
}
|
||||
|
||||
fun parallelDependsOnSequence(stage: Parallel, dependency: Pair<Sequence, DependencySettings>) {
|
||||
stage.buildTypes.forEach { buildType ->
|
||||
singleDependsOnSequence(Single(buildType), dependency)
|
||||
}
|
||||
stage.sequences.forEach { sequence ->
|
||||
sequenceDependsOnSequence(sequence, dependency)
|
||||
}
|
||||
}
|
||||
|
||||
fun sequenceDependsOnSingle(stage: Sequence, dependency: Pair<Single, DependencySettings>) {
|
||||
stage.stages.firstOrNull()?.let { firstStage ->
|
||||
if (firstStage is Single) {
|
||||
singleDependsOnSingle(firstStage, dependency)
|
||||
}
|
||||
if (firstStage is Parallel) {
|
||||
parallelDependsOnSingle(firstStage, dependency)
|
||||
}
|
||||
if (firstStage is Sequence) {
|
||||
sequenceDependsOnSingle(firstStage, dependency)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun sequenceDependsOnParallel(stage: Sequence, dependency: Pair<Parallel, DependencySettings>) {
|
||||
stage.stages.firstOrNull()?.let { firstStage ->
|
||||
if (firstStage is Single) {
|
||||
singleDependsOnParallel(firstStage, dependency)
|
||||
}
|
||||
if (firstStage is Parallel) {
|
||||
parallelDependsOnParallel(firstStage, dependency)
|
||||
}
|
||||
if (firstStage is Sequence) {
|
||||
sequenceDependsOnParallel(firstStage, dependency)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun sequenceDependsOnSequence(stage: Sequence, dependency: Pair<Sequence, DependencySettings>) {
|
||||
stage.stages.firstOrNull()?.let { firstStage ->
|
||||
if (firstStage is Single) {
|
||||
singleDependsOnSequence(firstStage, dependency)
|
||||
}
|
||||
if (firstStage is Parallel) {
|
||||
parallelDependsOnSequence(firstStage, dependency)
|
||||
}
|
||||
if (firstStage is Sequence) {
|
||||
sequenceDependsOnSequence(firstStage, dependency)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun Project.registerBuilds(sequence: Sequence) {
|
||||
sequence.stages.forEach {
|
||||
if (it is Single) {
|
||||
buildType(it.buildType)
|
||||
}
|
||||
if (it is Parallel) {
|
||||
it.buildTypes.forEach { build ->
|
||||
buildType(build)
|
||||
}
|
||||
it.sequences.forEach { seq ->
|
||||
registerBuilds(seq)
|
||||
}
|
||||
}
|
||||
if(it is Sequence) {
|
||||
registerBuilds(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun Project.build(bt: BuildType, block: BuildType.() -> Unit = {}): BuildType {
|
||||
bt.apply(block)
|
||||
buildType(bt)
|
||||
return bt
|
||||
}
|
||||
|
||||
fun Project.build(block: BuildType.() -> Unit): BuildType {
|
||||
val bt = BuildType().apply(block)
|
||||
buildType(bt)
|
||||
return bt
|
||||
}
|
||||
|
||||
fun BuildType.produces(artifacts: String) {
|
||||
artifactRules = artifacts
|
||||
}
|
||||
|
||||
fun BuildType.requires(bt: BuildType, artifacts: String, settings: ArtifactDependency.() -> Unit = {}) {
|
||||
dependencies.artifacts(bt) {
|
||||
artifactRules = artifacts
|
||||
settings()
|
||||
}
|
||||
}
|
||||
|
||||
fun BuildType.dependsOn(bt: BuildType, settings: SnapshotDependency.() -> Unit = {}) {
|
||||
dependencies.dependency(bt) {
|
||||
snapshot(settings)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* !!!WARNING!!!
|
||||
*
|
||||
* This method works as expected only if the <code>stage</code> is already populated
|
||||
*/
|
||||
fun BuildType.dependsOn(stage: Stage, dependencySettings: DependencySettings = {}) {
|
||||
val single = Single(this)
|
||||
single.dependsOn(stage, dependencySettings) //TODO: does it really work?
|
||||
}
|
||||
|
||||
fun Stage.dependsOn(bt: BuildType, dependencySettings: DependencySettings = {}) {
|
||||
val stage = Single(bt)
|
||||
dependsOn(stage, dependencySettings)
|
||||
}
|
||||
|
||||
fun Stage.dependsOn(stage: Stage, dependencySettings: DependencySettings = {}) {
|
||||
dependencies.add(Pair(stage, dependencySettings))
|
||||
}
|
||||
|
||||
fun Stage.dependencySettings(dependencySettings: DependencySettings = {}) {
|
||||
this.dependencySettings = dependencySettings
|
||||
}
|
||||
|
||||
fun BuildType.dependencySettings(dependencySettings: DependencySettings = {}) {
|
||||
throw IllegalStateException("dependencySettings can only be used with parallel {} or sequence {}. Please use dependsOn instead")
|
||||
}
|
Loading…
Reference in New Issue