Merge ~cjwatson/launchpad:ci-recalculate-builder-constraints into launchpad:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: 4fa1a1e6287daf61f7af3259a5e7c07cf144d288
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad:ci-recalculate-builder-constraints
Merge into: launchpad:master
Diff against target: 50 lines (+21/-0)
2 files modified
lib/lp/code/model/cibuild.py (+7/-0)
lib/lp/code/model/tests/test_cibuild.py (+14/-0)
Reviewer Review Type Date Requested Status
Clinton Fung Approve
Review via email: mp+436200@code.launchpad.net

Commit message

Recalculate CIBuild.builder_constraints on retry

Description of the change

This allows us to reconfigure a repository's builder constraints and then just retry builds, rather than having to push new commits to cause new builds to be created.

To post a comment you must log in.
Revision history for this message
Clinton Fung (clinton-fung) wrote :

Added an inline comment, otherwise +1 from me.

review: Approve
Revision history for this message
Colin Watson (cjwatson) :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/code/model/cibuild.py b/lib/lp/code/model/cibuild.py
2index d431000..0bfc773 100644
3--- a/lib/lp/code/model/cibuild.py
4+++ b/lib/lp/code/model/cibuild.py
5@@ -310,6 +310,13 @@ class CIBuild(PackageBuildMixin, StormBase):
6 return False
7 return super().can_be_retried
8
9+ def resetBuild(self):
10+ """See `IBuildFarmJob`."""
11+ super().resetBuild()
12+ self.builder_constraints = copy(
13+ removeSecurityProxy(self.git_repository.builder_constraints)
14+ )
15+
16 def calculateScore(self):
17 # Low latency is especially useful for CI builds, so score these
18 # above bulky things like live filesystem builds, but below
19diff --git a/lib/lp/code/model/tests/test_cibuild.py b/lib/lp/code/model/tests/test_cibuild.py
20index 114b606..d5b4405 100644
21--- a/lib/lp/code/model/tests/test_cibuild.py
22+++ b/lib/lp/code/model/tests/test_cibuild.py
23@@ -68,6 +68,7 @@ from lp.testing import (
24 StormStatementRecorder,
25 TestCaseWithFactory,
26 api_url,
27+ celebrity_logged_in,
28 login,
29 logout,
30 person_logged_in,
31@@ -240,6 +241,19 @@ class TestCIBuild(TestCaseWithFactory):
32 self.assertIsNone(build.upload_log)
33 self.assertEqual(0, build.failure_count)
34
35+ def test_retry_resets_builder_constraints(self):
36+ # Retrying a build recalculates its builder constraints.
37+ build = self.factory.makeCIBuild()
38+ self.assertIsNone(build.builder_constraints)
39+ build.updateStatus(BuildStatus.BUILDING)
40+ build.updateStatus(BuildStatus.FAILEDTOBUILD)
41+ build.gotFailure()
42+ with celebrity_logged_in("commercial_admin"):
43+ build.git_repository.builder_constraints = ["gpu"]
44+ with person_logged_in(build.git_repository.owner):
45+ build.retry()
46+ self.assertEqual(("gpu",), build.builder_constraints)
47+
48 def test_cancel_not_in_progress(self):
49 # The cancel() method for a pending build leaves it in the CANCELLED
50 # state.

Subscribers

People subscribed via source and target branches

to status/vote changes: