Let auto-build slots run their own build command under their own name
A branches.<name>.autoBuild.times entry is now either a plain HH:MM string or an object with time, its own buildCommand, and a name, so a nightly slot can run a fuller check than the on-commit builds. The watcher passes the slot's command and name to the executor, persisted in the build result — UI restarts, gittally retry, and the startup recovery repeat a build with the command and name it originally ran under. A named slot (e.g. master@nightly) gets its own pool: repository grouping, retention count, branches-view row (sorted after its branch), latest status, and permanent latest-green artifact link are keyed by the build name, while origin lookups, gone-branch pruning, worktrees, and Gitea links/statuses stay keyed by the real branch. Without a name, slot builds share the branch's pool as before. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
f292badac1
commit
8aee3190ea
@@ -33,21 +33,21 @@ class BranchPermalinksTest : FunSpec() {
|
||||
|
||||
init {
|
||||
test("resolves the hash-free permanent key to the branch's latest green build") {
|
||||
every { repository.latestPerBranch() } returns listOf(result("feature/x"), result("main"))
|
||||
every { repository.latestPerName() } returns listOf(result("feature/x"), result("main"))
|
||||
every { repository.latestGreenFor("feature/x") } returns result("feature/x")
|
||||
|
||||
permalinks.latestGreenBuild("feature_x") shouldBe result("feature/x")
|
||||
}
|
||||
|
||||
test("resolves the full branch key with hash suffix") {
|
||||
every { repository.latestPerBranch() } returns listOf(result("feature/x"))
|
||||
every { repository.latestPerName() } returns listOf(result("feature/x"))
|
||||
every { repository.latestGreenFor("feature/x") } returns result("feature/x")
|
||||
|
||||
permalinks.latestGreenBuild(ArtifactKeys.branchKey("feature/x")) shouldBe result("feature/x")
|
||||
}
|
||||
|
||||
test("an unknown branch key answers 404") {
|
||||
every { repository.latestPerBranch() } returns listOf(result("main"))
|
||||
every { repository.latestPerName() } returns listOf(result("main"))
|
||||
|
||||
val exception = shouldThrow<ResponseStatusException> { permalinks.latestGreenBuild("gone") }
|
||||
|
||||
@@ -55,7 +55,7 @@ class BranchPermalinksTest : FunSpec() {
|
||||
}
|
||||
|
||||
test("a branch without a green build answers 404") {
|
||||
every { repository.latestPerBranch() } returns listOf(result("main", status = BuildStatus.FAILED))
|
||||
every { repository.latestPerName() } returns listOf(result("main", status = BuildStatus.FAILED))
|
||||
every { repository.latestGreenFor("main") } returns null
|
||||
|
||||
val exception = shouldThrow<ResponseStatusException> { permalinks.latestGreenBuild("main") }
|
||||
@@ -64,7 +64,7 @@ class BranchPermalinksTest : FunSpec() {
|
||||
}
|
||||
|
||||
test("a permanent key matching several branches answers 409 and names the candidates") {
|
||||
every { repository.latestPerBranch() } returns listOf(result("feature/x"), result("feature_x"))
|
||||
every { repository.latestPerName() } returns listOf(result("feature/x"), result("feature_x"))
|
||||
|
||||
val exception = shouldThrow<ResponseStatusException> { permalinks.latestGreenBuild("feature_x") }
|
||||
|
||||
@@ -73,7 +73,7 @@ class BranchPermalinksTest : FunSpec() {
|
||||
}
|
||||
|
||||
test("with ambiguous permanent keys the full branch key still resolves") {
|
||||
every { repository.latestPerBranch() } returns listOf(result("feature/x"), result("feature_x"))
|
||||
every { repository.latestPerName() } returns listOf(result("feature/x"), result("feature_x"))
|
||||
every { repository.latestGreenFor("feature/x") } returns result("feature/x")
|
||||
|
||||
permalinks.latestGreenBuild(ArtifactKeys.branchKey("feature/x")) shouldBe result("feature/x")
|
||||
@@ -82,5 +82,14 @@ class BranchPermalinksTest : FunSpec() {
|
||||
test("permanentUrl uses the hash-free branch key") {
|
||||
BranchPermalinks.permanentUrl("feature/x") shouldBe "/branches/feature_x"
|
||||
}
|
||||
|
||||
test("resolves a named slot pool to its own latest green build") {
|
||||
val nightly = result("main").copy(name = "main@nightly", artifactKey = "nightly-key")
|
||||
every { repository.latestPerName() } returns listOf(result("main"), nightly)
|
||||
every { repository.latestGreenFor("main@nightly") } returns nightly
|
||||
|
||||
// sanitized like any branch key: the '@' becomes '_' in the URL
|
||||
permalinks.latestGreenBuild("main_nightly") shouldBe nightly
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user