From 36402a2e4caa620726d8fdb1d0a5dee654b40143 Mon Sep 17 00:00:00 2001 From: Victor Seva Date: Fri, 6 Mar 2020 12:52:19 +0100 Subject: [PATCH] TT#43813 trunk fixes * release-copy-debs-yml job expects relase-trunk-$(distribution) * trigger_builds: use 'trunk' as release parameter so is clear a trunk build If we use 'release-trunk-$dist' it gets detected as a release * repoapi: filter out settings.BUILD_RELEASE_JOBS of the list of projects when release_uuid is set Change-Id: I7e522bc05cf4388889fa4aba8828d3254cf983ee --- build/models/__init__.py | 10 ++--- build/tasks.py | 6 ++- build/test/test_models.py | 2 +- build/test/test_rest.py | 6 ++- build/test/test_utils.py | 44 ++++++++++++++++++- build/utils.py | 9 +++- repoapi/fixtures/test_model_queries.json | 23 ++++++++++ repoapi/fixtures/test_model_queries_uuid.json | 23 ++++++++++ repoapi/models/jbi.py | 9 +++- repoapi/test/test_model_queries.py | 12 ++--- repoapi/test/test_tasks.py | 8 ++-- 11 files changed, 128 insertions(+), 24 deletions(-) diff --git a/build/models/__init__.py b/build/models/__init__.py index b3b449d..5a40221 100644 --- a/build/models/__init__.py +++ b/build/models/__init__.py @@ -44,7 +44,7 @@ def jbi_manage(sender, **kwargs): if jbi.jobname in settings.BUILD_RELEASE_JOBS: if not release.startswith("release-"): release = "release-{}".format(jbi.param_release) - if jbi.param_release == "none": + if jbi.param_release_uuid in [None, "none", ""]: logger.debug( "jbi release:%s release_uuid:%s, no ReleaseBuild link, skip", jbi.param_release, @@ -52,14 +52,10 @@ def jbi_manage(sender, **kwargs): ) return try: - br = BuildRelease.objects.get( - release=release, uuid=jbi.param_release_uuid, - ) + br = BuildRelease.objects.get(uuid=jbi.param_release_uuid,) except BuildRelease.DoesNotExist: logger.error( - "BuildRelease:%s[%s] not found", - jbi.param_release, - jbi.param_release_uuid, + "BuildRelease:%s not found", jbi.param_release_uuid, ) return if not br.append_built(jbi): diff --git a/build/tasks.py b/build/tasks.py index 74d662b..ee0d226 100644 --- a/build/tasks.py +++ b/build/tasks.py @@ -32,8 +32,12 @@ def build_release(self, pk): instance = br.get(id=pk) except BuildRelease.DoesNotExist as exc: raise self.retry(countdown=60 * 5, exc=exc) + if instance.release == "trunk": + release = "release-trunk-{}".format(instance.distribution) + else: + release = instance.release url = trigger_copy_deps( - release=instance.release, internal=True, release_uuid=instance.uuid, + release=release, internal=True, release_uuid=instance.uuid, ) logger.info("%s triggered" % url) diff --git a/build/test/test_models.py b/build/test/test_models.py index 8de5cdc..05db206 100644 --- a/build/test/test_models.py +++ b/build/test/test_models.py @@ -31,7 +31,7 @@ class BuildReleaseManagerTestCase(BaseTest): def test_create_trunk(self, dlf): br = BuildRelease.objects.create_build_release("AAA", "trunk") - self.assertEqual(br.release, "release-trunk-buster") + self.assertEqual(br.release, "trunk") self.assertEqual(br.distribution, "buster") self.assertIsNone(br.tag) self.assertEqual(br.branch, "master") diff --git a/build/test/test_rest.py b/build/test/test_rest.py index a68c90a..9d1bab5 100644 --- a/build/test/test_rest.py +++ b/build/test/test_rest.py @@ -56,9 +56,10 @@ class TestRest(APIAuthenticatedTestCase): } response = self.client.post(self.url, data, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertEqual(response.data["release"], "release-trunk-buster") + self.assertEqual(response.data["release"], "trunk") self.assertIsNone(response.data["tag"]) self.assertEqual(response.data["branch"], "master") + self.assertEqual(response.data["distribution"], "buster") def test_trunk(self): data = { @@ -68,9 +69,10 @@ class TestRest(APIAuthenticatedTestCase): response = self.client.post(self.url, data, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(response.data["uuid"], data["uuid"]) - self.assertEqual(response.data["release"], "release-trunk-buster") + self.assertEqual(response.data["release"], "trunk") self.assertIsNone(response.data["tag"]) self.assertEqual(response.data["branch"], "master") + self.assertEqual(response.data["distribution"], "buster") projects = response.data["projects"].split(",") self.assertEqual(len(projects), 73) diff --git a/build/test/test_utils.py b/build/test/test_utils.py index b7afac5..bee83dd 100644 --- a/build/test/test_utils.py +++ b/build/test/test_utils.py @@ -117,7 +117,7 @@ class ReleaseConfigTestCase(SimpleTestCase): def test_release_value(self): rc = ReleaseConfig("trunk") - self.assertEqual(rc.release, "release-trunk-buster") + self.assertEqual(rc.release, "trunk") def test_branch_tag_value_trunk(self): rc = ReleaseConfig("trunk") @@ -234,3 +234,45 @@ class TriggerBuild(SimpleTestCase): params["token"] = settings.JENKINS_TOKEN self.assertEqual(res, "{base}/job/{project}/".format(**params)) openurl.assert_called_once_with(url.format(**params)) + + def test_project_build_trunk(self, openurl): + params = { + "project": "kamailio-get-code", + "release_uuid": "UUID_mr8.2", + "trigger_release": "trunk", + "trigger_branch_or_tag": "branch/master", + "trigger_distribution": "buster", + "uuid": "UUID_A", + } + url = ( + "{base}/job/{project}/buildWithParameters?" + "token={token}&cause={trigger_release}&uuid={uuid}&" + "release_uuid={release_uuid}&" + "branch=master&tag=none&" + "release=trunk&distribution={trigger_distribution}" + ) + res = trigger_build(**params) + params["base"] = settings.JENKINS_URL + params["token"] = settings.JENKINS_TOKEN + self.assertEqual(res, "{base}/job/{project}/".format(**params)) + openurl.assert_called_once_with(url.format(**params)) + + def test_copy_debs_build_trunk(self, openurl): + params = { + "release": "release-trunk-buster", + "internal": True, + "release_uuid": "UUID_master", + "uuid": "UUID_B", + } + url = ( + "{base}/job/{project}/buildWithParameters?" + "token={token}&cause={release}&uuid={uuid}&" + "release_uuid={release_uuid}&" + "release=release-trunk-buster&internal=true" + ) + res = trigger_copy_deps(**params) + params["project"] = "release-copy-debs-yml" + params["base"] = settings.JENKINS_URL + params["token"] = settings.JENKINS_TOKEN + self.assertEqual(res, "{base}/job/{project}/".format(**params)) + openurl.assert_called_once_with(url.format(**params)) diff --git a/build/utils.py b/build/utils.py index 29481ac..198a564 100644 --- a/build/utils.py +++ b/build/utils.py @@ -59,7 +59,10 @@ def get_common_release(version): def trigger_copy_deps(release, internal, release_uuid, uuid=None): - simple = get_simple_release(release) + if release.startswith("release-trunk-"): + simple = release + else: + simple = get_simple_release(release) if uuid is None: uuid = uuid4() params = { @@ -215,7 +218,7 @@ class ReleaseConfig(object): @property def branch(self): release = self.release - if release.startswith("release-trunk-"): + if release == "trunk": return "master" release_count = release.count(".") if release_count in [1, 2]: @@ -231,6 +234,8 @@ class ReleaseConfig(object): @property def release(self): for dist in self.config["distris"]: + if dist.startswith("release-trunk-"): + return "trunk" if dist.startswith("release-"): return dist diff --git a/repoapi/fixtures/test_model_queries.json b/repoapi/fixtures/test_model_queries.json index bf832b0..8b8ae38 100644 --- a/repoapi/fixtures/test_model_queries.json +++ b/repoapi/fixtures/test_model_queries.json @@ -113,5 +113,28 @@ }, "model": "repoapi.jenkinsbuildinfo", "pk": 5 + }, + { + "fields": { + "buildnumber": 1, + "date": "2015-05-04T17:04:57.802Z", + "gerrit_change": null, + "gerrit_eventtype": null, + "gerrit_patchset": null, + "job_url": "https://jenkins.mgm.sipwise.com/job/release-copy-debs-yml/", + "param_branch": null, + "param_distribution": "wheezy", + "param_ppa": null, + "param_release": "mr3.1-fake", + "param_release_uuid": null, + "param_tag": null, + "projectname": "release-copy-debs-yml", + "jobname": "release-copy-debs-yml", + "repo_name": null, + "result": "SUCCESS", + "tag": null + }, + "model": "repoapi.jenkinsbuildinfo", + "pk": 6 } ] \ No newline at end of file diff --git a/repoapi/fixtures/test_model_queries_uuid.json b/repoapi/fixtures/test_model_queries_uuid.json index 8146dc3..bd6cc82 100644 --- a/repoapi/fixtures/test_model_queries_uuid.json +++ b/repoapi/fixtures/test_model_queries_uuid.json @@ -196,5 +196,28 @@ }, "model": "repoapi.jenkinsbuildinfo", "pk": 8 + }, + { + "fields": { + "buildnumber": 13, + "date": "2017-05-04T17:04:57.802Z", + "gerrit_change": null, + "gerrit_eventtype": null, + "gerrit_patchset": null, + "job_url": "https://jenkins.mgm.sipwise.com/job/foo-get-code/", + "param_branch": null, + "param_distribution": "buster", + "param_ppa": null, + "param_release": "release-mr8.1", + "param_release_uuid": "UUID_mr8.1", + "param_tag": null, + "projectname": "release-copy-debs-yml", + "jobname": "release-copy-debs-yml", + "repo_name": null, + "result": "SUCCESS", + "tag": "UUID4" + }, + "model": "repoapi.jenkinsbuildinfo", + "pk": 9 } ] \ No newline at end of file diff --git a/repoapi/models/jbi.py b/repoapi/models/jbi.py index 5387d53..9961e73 100644 --- a/repoapi/models/jbi.py +++ b/repoapi/models/jbi.py @@ -80,6 +80,9 @@ class JenkinsBuildInfoManager(models.Manager): "param_release": release, "tag__isnull": False, } + exclude_params = { + "jobname__in": settings.BUILD_RELEASE_JOBS, + } if release_uuid: params["param_release_uuid"] = release_uuid if failed is not None: @@ -87,8 +90,10 @@ class JenkinsBuildInfoManager(models.Manager): params["result"] = "FAILURE" else: params["result__in"] = ["SUCCESS", "UNSTABLE"] - qs = self.get_queryset() - res = qs.filter(**params).values("projectname").distinct() + qs = self.get_queryset().filter(**params) + if release_uuid: + qs = qs.exclude(**exclude_params) + res = qs.values("projectname").distinct() if res.exists(): if flat: return res.values_list("projectname", flat=True) diff --git a/repoapi/test/test_model_queries.py b/repoapi/test/test_model_queries.py index ff32e44..50d368e 100644 --- a/repoapi/test/test_model_queries.py +++ b/repoapi/test/test_model_queries.py @@ -33,7 +33,7 @@ class JBIQueriesTestCase(BaseTest): "fake", ] check = JenkinsBuildInfo.objects.release_projects("mr3.1-fake") - self.assertCountEqual(check, projects) + self.assertListEqual(list(check), projects) def test_release_project_uuids(self): projects = [ @@ -77,16 +77,18 @@ class JBIQueriesTestCase(BaseTest): ) def test_purge_release(self): + prev_count = JenkinsBuildInfo.objects.count() jbi = JenkinsBuildInfo.objects.get(pk=1) jbi.date = datetime.now() jbi.save() - self.assertEqual(JenkinsBuildInfo.objects.count(), 5) + self.assertEqual(JenkinsBuildInfo.objects.count(), prev_count) JenkinsBuildInfo.objects.purge_release( "mr3.1-fake", timedelta(weeks=3) ) self.assertEqual(JenkinsBuildInfo.objects.count(), 1) def test_purge_release_none(self): + prev_count = JenkinsBuildInfo.objects.count() jbi = JenkinsBuildInfo.objects.get(pk=1) jbi.param_release = None jbi.save() @@ -96,9 +98,9 @@ class JBIQueriesTestCase(BaseTest): ).count(), 1, ) - self.assertEqual(JenkinsBuildInfo.objects.count(), 5) + self.assertEqual(JenkinsBuildInfo.objects.count(), prev_count) JenkinsBuildInfo.objects.purge_release(None, timedelta(weeks=3)) - self.assertEqual(JenkinsBuildInfo.objects.count(), 4) + self.assertEqual(JenkinsBuildInfo.objects.count(), prev_count - 1) class JBIQueriesUUIDTest(BaseTest): @@ -113,7 +115,7 @@ class JBIQueriesUUIDTest(BaseTest): check = JenkinsBuildInfo.objects.release_projects( self.release, release_uuid=self.release_uuid ) - self.assertCountEqual(check, projects) + self.assertListEqual(list(check), projects) def test_release_project_uuids(self): projects = [ diff --git a/repoapi/test/test_tasks.py b/repoapi/test/test_tasks.py index e36ee1f..0882b8e 100644 --- a/repoapi/test/test_tasks.py +++ b/repoapi/test/test_tasks.py @@ -23,14 +23,16 @@ class TasksTestCase(BaseTest): fixtures = ["test_model_queries.json"] def test_purge(self): + prev_count = JenkinsBuildInfo.objects.count() jbi = JenkinsBuildInfo.objects.get(pk=1) jbi.date = datetime.now() jbi.save() - self.assertEqual(JenkinsBuildInfo.objects.count(), 5) + self.assertEqual(JenkinsBuildInfo.objects.count(), prev_count) tasks.jbi_purge.delay("mr3.1-fake", 3) self.assertEqual(JenkinsBuildInfo.objects.count(), 1) def test_purge_none(self): + prev_count = JenkinsBuildInfo.objects.count() jbi = JenkinsBuildInfo.objects.get(pk=1) jbi.param_release = None jbi.save() @@ -40,6 +42,6 @@ class TasksTestCase(BaseTest): ).count(), 1, ) - self.assertEqual(JenkinsBuildInfo.objects.count(), 5) + self.assertEqual(JenkinsBuildInfo.objects.count(), prev_count) tasks.jbi_purge.delay(None, 3) - self.assertEqual(JenkinsBuildInfo.objects.count(), 4) + self.assertEqual(JenkinsBuildInfo.objects.count(), prev_count - 1)