Merge ~jugmac00/launchpad:make-automatic-charmrecipe-builds-more-resilient into launchpad:master

Proposed by Jürgen Gmach
Status: Merged
Approved by: Jürgen Gmach
Approved revision: dc0c474fc69ff47e169d4b1ad08a7102214ac199
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~jugmac00/launchpad:make-automatic-charmrecipe-builds-more-resilient
Merge into: launchpad:master
Diff against target: 73 lines (+42/-2)
2 files modified
lib/lp/charms/model/charmrecipe.py (+8/-2)
lib/lp/charms/tests/test_charmrecipe.py (+34/-0)
Reviewer Review Type Date Requested Status
Colin Watson (community) Approve
Review via email: mp+416986@code.launchpad.net

Commit message

Make automatic charmrecipe builds more resilient

To post a comment you must log in.
Revision history for this message
Colin Watson (cjwatson) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/charms/model/charmrecipe.py b/lib/lp/charms/model/charmrecipe.py
2index 7a112da..7c8c59a 100644
3--- a/lib/lp/charms/model/charmrecipe.py
4+++ b/lib/lp/charms/model/charmrecipe.py
5@@ -628,7 +628,7 @@ class CharmRecipe(StormBase, WebhookTargetMixin):
6 "Scheduling builds of charm recipe %s/%s/%s",
7 self.owner.name, self.project.name, self.name)
8 return self.requestBuilds(
9- self.owner, channels=self.auto_build_channels)
10+ requester=self.owner, channels=self.auto_build_channels)
11
12 def getBuildRequest(self, job_id):
13 """See `ICharmRecipe`."""
14@@ -1064,7 +1064,13 @@ class CharmRecipeSet:
15 recipes = cls._findStaleRecipes()
16 build_requests = []
17 for recipe in recipes:
18- build_requests.append(recipe.requestAutoBuilds(logger=logger))
19+ try:
20+ build_request = recipe.requestAutoBuilds(logger=logger)
21+ except Exception as e:
22+ if logger is not None:
23+ logger.exception(e)
24+ continue
25+ build_requests.append(build_request)
26 return build_requests
27
28 def detachFromGitRepository(self, repository):
29diff --git a/lib/lp/charms/tests/test_charmrecipe.py b/lib/lp/charms/tests/test_charmrecipe.py
30index a788bc6..a5aac5c 100644
31--- a/lib/lp/charms/tests/test_charmrecipe.py
32+++ b/lib/lp/charms/tests/test_charmrecipe.py
33@@ -1279,6 +1279,40 @@ class TestCharmRecipeSet(TestCaseWithFactory):
34 expected_log_entries, logger.getLogBuffer().splitlines())
35 self.assertFalse(recipe.is_stale)
36
37+ def test_makeAutoBuild_skips_for_unexpected_exceptions(self):
38+ # scheduling builds need to be unaffected by one erroring
39+ recipe = self.factory.makeCharmRecipe(auto_build=True, is_stale=True)
40+ logger = BufferLogger()
41+ recipe = removeSecurityProxy(recipe)
42+ # currently there is no expected way that `makeAutoBuilds` could fail
43+ # so we fake it
44+ def fake_requestAutoBuilds_with_side_effect(logger=None):
45+ raise Exception("something unexpected went wrong")
46+ recipe.requestAutoBuilds = fake_requestAutoBuilds_with_side_effect
47+
48+ build_requests = getUtility(ICharmRecipeSet).makeAutoBuilds(
49+ logger=logger)
50+
51+ self.assertEqual([], build_requests)
52+ self.assertEqual(
53+ ['ERROR something unexpected went wrong'],
54+ logger.getLogBuffer().splitlines()
55+ )
56+
57+ def test_makeAutoBuild_skips_and_no_logger_enabled(self):
58+ # This is basically the same test case as
59+ # `test_makeAutoBuild_skips_for_unexpected_exceptions`
60+ # but we particularly test with no logger enabled.
61+ recipe = self.factory.makeCharmRecipe(auto_build=True, is_stale=True)
62+ recipe = removeSecurityProxy(recipe)
63+ def fake_requestAutoBuilds_with_side_effect(logger=None):
64+ raise Exception("something unexpected went wrong")
65+ recipe.requestAutoBuilds = fake_requestAutoBuilds_with_side_effect
66+
67+ build_requests = getUtility(ICharmRecipeSet).makeAutoBuilds()
68+
69+ self.assertEqual([], build_requests)
70+
71 def test_makeAutoBuilds_skips_if_requested_recently(self):
72 # ICharmRecipeSet.makeAutoBuilds skips recipes that have been built
73 # recently.

Subscribers

People subscribed via source and target branches

to status/vote changes: