diff --git a/Makefile b/Makefile
index 79ff865..90c9540 100644
--- a/Makefile
+++ b/Makefile
@@ -18,7 +18,7 @@ venv_dev: requirements/dev.txt
###################################
test:
- RESULTS=$(RESULTS) pytest-3 --junitxml=$(RESULTS)/junit.xml \
+ RESULTS=$(RESULTS) pytest-3 -ra --junitxml=$(RESULTS)/junit.xml \
--cov=. --cov-report=xml:$(RESULTS)/coverage.xml --pep8
test_pylint:
diff --git a/build/fixtures/config/trunk.yml b/build/fixtures/config/trunk.yml
index 0e7930d..2e8df16 100644
--- a/build/fixtures/config/trunk.yml
+++ b/build/fixtures/config/trunk.yml
@@ -1,8 +1,13 @@
distris:
- release-trunk-buster
+ - release-trunk-bullseye
debian_release: buster
+release-trunk-bullseye:
+ # TT#44190 needed by ngcp-panel
+ - grafana: 7.3.1
+
release-trunk-buster:
# TT#32916 TT#44119 bcg729 for G.729 codec support for rtpengine
- bcg729: 1.0.4+git20180222-0.1~bpo10+1
diff --git a/build/management/commands/create_fake_buildrelease.py b/build/management/commands/create_fake_buildrelease.py
index a9ad562..59b6d38 100644
--- a/build/management/commands/create_fake_buildrelease.py
+++ b/build/management/commands/create_fake_buildrelease.py
@@ -19,6 +19,7 @@ from django.core.management.base import CommandError
from build.models import BuildRelease
from build.models.br import regex_mrXX
+from build.utils import ReleaseConfig
class Command(BaseCommand):
@@ -32,6 +33,12 @@ class Command(BaseCommand):
if not regex_mrXX.match(ver):
raise CommandError("'{}'' not mrX.Y version".format(ver))
release = "release-{}".format(ver)
- if BuildRelease.objects.release(release).count() > 0:
+ config = ReleaseConfig(release)
+ if (
+ BuildRelease.objects.release(
+ release, config.debian_release
+ ).count()
+ > 0
+ ):
raise CommandError("'{}' has already instances".format(release))
BuildRelease.objects.create_build_release(uuid.uuid4(), ver, fake=True)
diff --git a/build/models/br.py b/build/models/br.py
index 22472a3..a31f2b8 100644
--- a/build/models/br.py
+++ b/build/models/br.py
@@ -13,9 +13,9 @@
# You should have received a copy of the GNU General Public License along
# with this program. If not, see .
import datetime
-import logging
import re
+import structlog
from django.db import models
from django.db.models import Q
from django.forms.models import model_to_dict
@@ -27,7 +27,7 @@ from build.utils import get_simple_release
from build.utils import ReleaseConfig
from repoapi.models import JenkinsBuildInfo
-logger = logging.getLogger(__name__)
+logger = structlog.get_logger(__name__)
regex_mrXXX = re.compile(r"^mr[0-9]+\.[0-9]+\.[0-9]+$")
regex_mrXX = re.compile(r"^mr[0-9]+\.[0-9]+$")
@@ -37,16 +37,20 @@ regex_mrXX_up = re.compile(r"^release-mr[0-9]+\.[0-9]+-update$")
class BuildReleaseManager(models.Manager):
_jbi = JenkinsBuildInfo.objects
- def release(self, version):
+ def release(self, version, distribution):
qs = self.get_queryset()
return qs.filter(
- Q(release=version) | Q(release="{}-update".format(version))
+ Q(release=version, distribution=distribution)
+ | Q(release="{}-update".format(version), distribution=distribution)
)
def create_build_release(self, uuid, release, fake=False):
+ log = logger.bind(uuid=str(uuid), release=release, fake=fake)
config = ReleaseConfig(release)
qs = self.get_queryset()
- br = qs.filter(release=config.release)
+ br = qs.filter(
+ release=config.release, distribution=config.debian_release
+ )
release_ok = config.release
if br.exists():
if regex_mrXXX.match(config.branch):
@@ -58,7 +62,7 @@ class BuildReleaseManager(models.Manager):
"release[mrX.Y]:{} has already a build, "
"set {} as release"
)
- logger.info(msg.format(config.branch, release_ok))
+ log.info(msg.format(config.branch, release_ok))
projects = ",".join(config.projects)
if fake:
start_date = timezone.make_aware(datetime.datetime(1977, 1, 1))
@@ -277,6 +281,7 @@ class BuildRelease(models.Model):
return "branch/{}".format(self.branch)
def _next(self):
+ log = logger.bind(release=self)
if self.built_projects is None:
return self.build_deps[0][0]
if self.done:
@@ -293,8 +298,10 @@ class BuildRelease(models.Model):
deps_missing.append(prj)
else:
if len(deps_missing) > 0:
- msg = "release {} has build_deps {} missing"
- logger.info(msg.format(self, deps_missing))
+ log.info(
+ "release has build_deps missing",
+ deps_missing=deps_missing,
+ )
return None
for prj in self.projects_list:
if prj not in built_list and prj not in t_list:
@@ -303,15 +310,19 @@ class BuildRelease(models.Model):
@property
def next(self):
failed_projects = self.failed_projects_list
+ log = logger.bind(release=self)
if any(job in failed_projects for job in settings.BUILD_RELEASE_JOBS):
- msg = "release {} has failed release_jobs, stop sending jobs"
- logger.info(msg.format(self))
+ log.info(
+ "release has failed release_jobs, stop sending jobs",
+ failed_projects=failed_projects,
+ )
return
res = self._next()
if res is not None:
if res in failed_projects:
- logger.error(
- "project: %s marked as failed, stop sending jobs", res
+ log.error(
+ "project marked as failed, stop sending jobs",
+ project=res,
)
else:
return res
@@ -328,5 +339,7 @@ class BuildRelease(models.Model):
@property
def config(self):
if getattr(self, "_config", None) is None:
- self._config = ReleaseConfig(self.release)
+ self._config = ReleaseConfig(
+ self.release, distribution=self.distribution
+ )
return self._config
diff --git a/build/tasks.py b/build/tasks.py
index 39074ef..7d9522d 100644
--- a/build/tasks.py
+++ b/build/tasks.py
@@ -12,8 +12,8 @@
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see .
+import structlog
from celery import shared_task
-from celery.utils.log import get_task_logger
from .conf import settings
from build.models.br import BuildRelease
@@ -21,36 +21,37 @@ from build.utils import trigger_build
from build.utils import trigger_copy_deps
from repoapi.celery import app
-logger = get_task_logger(__name__)
+logger = structlog.get_logger(__name__)
@app.task(bind=True)
def build_release(self, pk):
+ log = logger.bind(pk=pk)
br = BuildRelease.objects
try:
instance = br.get(id=pk)
except BuildRelease.DoesNotExist as exc:
+ log.warn("BuildRelease not found")
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=release,
- internal=True,
- release_uuid=instance.uuid,
+ release=release, internal=True, release_uuid=instance.uuid
+ )
+ log.info(
+ "BuildRelease copy_deps triggered", instance=str(instance), url=url
)
- logger.info("%s triggered" % url)
@shared_task(ignore_result=True)
def build_project(pk, project):
+ log = logger.bind(project=project, pk=pk)
try:
br = BuildRelease.objects.get(id=pk)
except BuildRelease.DoesNotExist:
- logger.error(
- "can't trigger %s on unknown release with id:%s", project, pk
- )
+ log.error("can't trigger project on unknown release")
return
url = trigger_build(
"{}-get-code".format(project),
@@ -60,15 +61,16 @@ def build_project(pk, project):
trigger_distribution=br.distribution,
)
br.pool_size += 1
- logger.info("%s triggered" % url)
+ log.info("project triggered", url=url, pool_size=br.pool_size)
@shared_task(ignore_result=True)
def build_resume(pk):
+ log = logger.bind(pk=pk)
try:
br = BuildRelease.objects.get(id=pk)
except BuildRelease.DoesNotExist:
- logger.error("can't resume on unknown release with id:%s", pk)
+ log.error("can't resume on unknown release")
return
params = {
"release_uuid": br.uuid,
@@ -77,21 +79,16 @@ def build_resume(pk):
"trigger_distribution": br.distribution,
}
size = settings.BUILD_POOL - br.pool_size
+ log.bind(size=size, pool_size=br.pool_size, br=str(br))
if size <= 0:
- logger.info(
- "BuildRelease:%s No more room for new builds,"
- " wait for next slot",
- br,
- )
+ log.info("No more room for new builds, wait for next slot")
for step in range(size):
prj = br.next
if prj:
params["project"] = "{}-get-code".format(prj)
- logger.debug(
- "trigger:%s for BuildRelease:%s", params["project"], br
- )
+ log.debug("trigger project", project=params["project"])
trigger_build(**params)
br.append_triggered(prj)
else:
- logger.debug("BuildRelease:%s has no next", br)
+ log.debug("BuildRelease has no next")
break
diff --git a/build/test/test_commands.py b/build/test/test_commands.py
index 67ae7e0..1a179b0 100644
--- a/build/test/test_commands.py
+++ b/build/test/test_commands.py
@@ -32,10 +32,10 @@ class createFakeBuildReleaseTest(TestCase):
def test_mrXX_ok(self):
self.assertEqual(
- BuildRelease.objects.release("release-mr7.5").count(), 0
+ BuildRelease.objects.release("release-mr7.5", "buster").count(), 0
)
call_command("create_fake_buildrelease", "mr7.5")
- qs = BuildRelease.objects.release("release-mr7.5")
+ qs = BuildRelease.objects.release("release-mr7.5", "buster")
self.assertEqual(qs.count(), 1)
br = qs.first()
self.assertTrue(br.done)
diff --git a/build/test/test_models.py b/build/test/test_models.py
index 80eaa36..d4939ad 100644
--- a/build/test/test_models.py
+++ b/build/test/test_models.py
@@ -41,6 +41,17 @@ class BuildReleaseManagerTestCase(BaseTest):
self.assertNotEqual(len(br.projects), 0)
self.assertIn("sipwise-base", br.projects)
+ def test_create_release_trunk(self, dlf):
+ br = BuildRelease.objects.create_build_release(
+ "AAA", "release-trunk-bullseye"
+ )
+ self.assertEqual(br.release, "trunk")
+ self.assertEqual(br.distribution, "bullseye")
+ self.assertIsNone(br.tag)
+ self.assertEqual(br.branch, "master")
+ self.assertNotEqual(len(br.projects), 0)
+ self.assertIn("sipwise-base", br.projects)
+
def test_create_mrXX(self, dlf):
BuildRelease.objects.filter(release="release-mr8.1").delete()
self.assertFalse(
@@ -88,7 +99,7 @@ class BuildReleaseManagerTestCase(BaseTest):
prev = BuildRelease.objects.filter(release="release-mr8.1")
br = BuildRelease.objects.create_build_release("BBB", "mr8.1")
self.assertEqual(br.release, "release-mr8.1-update")
- qs = BuildRelease.objects.release("release-mr8.1")
+ qs = BuildRelease.objects.release("release-mr8.1", "buster")
self.assertEqual(qs.count(), prev.count() + 1)
def test_create_fake(self, dlf):
@@ -102,9 +113,7 @@ class BuildReleaseManagerTestCase(BaseTest):
class BuildReleaseTestCase(BaseTest):
- fixtures = [
- "test_models",
- ]
+ fixtures = ["test_models"]
release_uuid = "dbe569f7-eab6-4532-a6d1-d31fb559649b"
def test_distribution(self):
@@ -121,14 +130,12 @@ class BuildReleaseTestCase(BaseTest):
def test_built_projects_list(self):
build = BuildRelease.objects.get(uuid=self.release_uuid)
self.assertCountEqual(
- build.built_projects_list, ["kamailio", "lua-ngcp-kamailio"],
+ build.built_projects_list, ["kamailio", "lua-ngcp-kamailio"]
)
def test_queued_projects_list(self):
build = BuildRelease.objects.get(uuid=self.release_uuid)
- self.assertCountEqual(
- build.queued_projects_list, ["ngcp-panel"],
- )
+ self.assertCountEqual(build.queued_projects_list, ["ngcp-panel"])
def test_config(self):
build = BuildRelease.objects.get(uuid=self.release_uuid)
@@ -189,9 +196,7 @@ class BuildReleaseTestCase(BaseTest):
class BuildReleaseStepsTest(BaseTest):
- fixtures = [
- "test_models",
- ]
+ fixtures = ["test_models"]
release = "release-mr8.1"
release_uuid = "dbe569f7-eab6-4532-a6d1-d31fb559648b"
@@ -388,9 +393,7 @@ class BuildReleaseStepsTest(BaseTest):
@patch("repoapi.utils.dlfile")
@patch("build.models.build_resume")
class JBIManageTest(BaseTest):
- fixtures = [
- "test_models",
- ]
+ fixtures = ["test_models"]
release = "release-mr8.1"
release_uuid = "dbe569f7-eab6-4532-a6d1-d31fb559648b"
@@ -461,9 +464,7 @@ class JBIManageTest(BaseTest):
class BRManageTest(BaseTest):
- fixtures = [
- "test_models",
- ]
+ fixtures = ["test_models"]
@patch("build.tasks.trigger_copy_deps")
@patch("build.models.build_resume")
@@ -483,9 +484,7 @@ class BRManageTest(BaseTest):
class BuildReleaseRetriggerTest(BaseTest):
- fixtures = [
- "test_models",
- ]
+ fixtures = ["test_models"]
release = "release-mr8.1"
release_uuid = "dbe569f7-eab6-4532-a6d1-d31fb559648b"
diff --git a/build/test/test_utils.py b/build/test/test_utils.py
index 6964a7c..2239cd6 100644
--- a/build/test/test_utils.py
+++ b/build/test/test_utils.py
@@ -13,20 +13,42 @@
# You should have received a copy of the GNU General Public License along
# with this program. If not, see .
import re
+from unittest.mock import patch
from django.test import override_settings
from django.test import SimpleTestCase
-from mock import patch
from build import exceptions as err
from build.conf import settings
from build.utils import get_common_release
from build.utils import get_simple_release
+from build.utils import is_release_trunk
from build.utils import ReleaseConfig
from build.utils import trigger_build
from build.utils import trigger_copy_deps
+class SimpleIsReleaseTrunkTest(SimpleTestCase):
+ def test_trunk(self):
+ ok, val = is_release_trunk("trunk")
+ self.assertFalse(ok)
+ self.assertIsNone(val)
+
+ def test_mrXX(self):
+ ok, val = is_release_trunk("release-mr8.5")
+ self.assertFalse(ok)
+ self.assertIsNone(val)
+
+ def test_release_trunk(self):
+ ok, val = is_release_trunk("release-trunk-buster")
+ self.assertTrue(ok)
+ self.assertEqual(val, "buster")
+
+ ok, val = is_release_trunk("release-trunk-bullseye")
+ self.assertTrue(ok)
+ self.assertEqual(val, "bullseye")
+
+
class SimpleReleaseTest(SimpleTestCase):
def test_trunk(self):
val = get_simple_release("release-trunk-buster")
@@ -81,7 +103,8 @@ class ReleaseConfigTestCase(SimpleTestCase):
@override_settings(BUILD_RELEASES_SKIP=["mr0.1"])
def test_supported_releases(self):
supported = [
- "trunk",
+ "release-trunk-buster",
+ "release-trunk-bullseye",
"mr8.1.2",
"mr8.1",
"mr7.5.3",
@@ -95,12 +118,17 @@ class ReleaseConfigTestCase(SimpleTestCase):
@patch.object(ReleaseConfig, "supported_releases")
def test_supported_releases_dict(self, sr):
res_ok = [
- {"release": "trunk", "base": "master"},
+ {"release": "release-trunk-buster", "base": "master"},
{"release": "mr8.0", "base": "mr8.0"},
{"release": "mr8.0.1", "base": "mr8.0"},
{"release": "mr7.5.1", "base": "mr7.5"},
]
- sr.return_value = ["trunk", "mr8.0", "mr8.0.1", "mr7.5.1"]
+ sr.return_value = [
+ "release-trunk-buster",
+ "mr8.0",
+ "mr8.0.1",
+ "mr7.5.1",
+ ]
res = ReleaseConfig.supported_releases_dict()
self.assertListEqual(res, res_ok)
@@ -119,6 +147,19 @@ class ReleaseConfigTestCase(SimpleTestCase):
self.assertEqual(rc.debian_release, "buster")
self.assertEqual(len(rc.projects), 73)
+ def test_debian_release_value(self):
+ rc = ReleaseConfig("trunk")
+ self.assertEqual(rc.debian_release, "buster")
+
+ rc = ReleaseConfig("release-trunk-bullseye")
+ self.assertEqual(rc.debian_release, "bullseye")
+
+ rc = ReleaseConfig("trunk", "bullseye")
+ self.assertEqual(rc.debian_release, "bullseye")
+ # distribution parameter is only used with trunk
+ rc = ReleaseConfig("release-mr8.1-update", "bullseye")
+ self.assertEqual(rc.debian_release, "buster")
+
def test_release_value(self):
rc = ReleaseConfig("trunk")
self.assertEqual(rc.release, "trunk")
diff --git a/build/utils.py b/build/utils.py
index 91c2cbd..fca63be 100644
--- a/build/utils.py
+++ b/build/utils.py
@@ -40,6 +40,15 @@ project_url = (
copy_deps_url = base_url + "&release={release}&internal={internal}"
re_release = re.compile(r"^release-(mr[0-9]+\.[0-9]+(\.[0-9]+)?)$")
re_release_common = re.compile(r"^(release-)?(mr[0-9]+\.[0-9]+)(\.[0-9]+)?$")
+re_release_trunk = re.compile(r"^release-trunk-(\w+)$")
+
+
+def is_release_trunk(version):
+ match = re_release_trunk.search(version)
+ if match:
+ return (True, match.group(1))
+ else:
+ return (False, None)
def get_simple_release(version):
@@ -158,6 +167,15 @@ class ReleaseConfig(object):
return list_prj.pop(0)
raise StopIteration
+ @classmethod
+ def load_config(cls, config_path):
+ try:
+ with open(config_path) as f:
+ return load(f, Loader=Loader)
+ except IOError:
+ msg = "could not read configuration file '{}'"
+ raise err.NoConfigReleaseFile(msg.format(config_path))
+
@classmethod
def supported_releases(cls):
skip_files = ["{}.yml".format(x) for x in settings.BUILD_RELEASES_SKIP]
@@ -165,12 +183,21 @@ class ReleaseConfig(object):
for root, dirs, files in os.walk(
settings.BUILD_REPOS_SCRIPTS_CONFIG_DIR
):
+ if "trunk.yml" in files:
+ files.remove("trunk.yml")
+ cfg = cls.load_config(
+ os.path.join(
+ settings.BUILD_REPOS_SCRIPTS_CONFIG_DIR, "trunk.yml"
+ )
+ )
+ for dist in cfg["distris"]:
+ res.append(dist)
for name in files:
path_name = Path(name)
if path_name.suffix != ".yml":
continue
if name not in skip_files:
- res.append(Path(name).stem)
+ res.append(path_name.stem)
res.sort(reverse=True)
return res
@@ -182,7 +209,10 @@ class ReleaseConfig(object):
for version in sr
]
- def __init__(self, name):
+ def __init__(self, name, distribution=None):
+ ok, self.distribution = is_release_trunk(name)
+ if not ok and name == "trunk":
+ self.distribution = distribution
filename = get_simple_release(name)
if filename is None:
filename = name
@@ -190,12 +220,7 @@ class ReleaseConfig(object):
self.config_path = os.path.join(
settings.BUILD_REPOS_SCRIPTS_CONFIG_DIR, self.config_file
)
- try:
- with open(self.config_path) as f:
- self.config = load(f, Loader=Loader)
- except IOError:
- msg = "could not read configuration file '{}'"
- raise err.NoConfigReleaseFile(msg.format(self.config_path))
+ self.config = self.load_config(self.config_path)
try:
self.jenkins_jobs = self.config["jenkins-jobs"]
except KeyError:
@@ -241,6 +266,8 @@ class ReleaseConfig(object):
@property
def debian_release(self):
+ if self.distribution:
+ return self.distribution
return self.config["debian_release"]
@property
diff --git a/panel/views.py b/panel/views.py
index f83a505..d2998cf 100644
--- a/panel/views.py
+++ b/panel/views.py
@@ -23,7 +23,7 @@ from repoapi.models import JenkinsBuildInfo as jbi
def index(request):
- context = {"releases": humansorted(jbi.objects.releases())}
+ context = {"releases": humansorted(jbi.objects.releases(), reverse=True)}
return render(request, "panel/index.html", context)
diff --git a/release_dashboard/views/build.py b/release_dashboard/views/build.py
index a39fb24..dac388d 100644
--- a/release_dashboard/views/build.py
+++ b/release_dashboard/views/build.py
@@ -69,7 +69,7 @@ def build_release(request, release):
)
else:
build_releases = BuildRelease.objects.release(
- release_config.release
+ release_config.release, release_config.debian_release
).order_by("-start_date")
if build_releases.count() == 0:
done = True
diff --git a/repoapi/fixtures/test_model_queries_trunk.yaml b/repoapi/fixtures/test_model_queries_trunk.yaml
new file mode 100644
index 0000000..ea166b5
--- /dev/null
+++ b/repoapi/fixtures/test_model_queries_trunk.yaml
@@ -0,0 +1,399 @@
+- model: repoapi.jenkinsbuildinfo
+ pk: 23955
+ fields:
+ tag: 167c4889-7eca-40c1-ada3-e444fca78d1f
+ projectname: data-hal
+ jobname: data-hal-get-code
+ buildnumber: 35
+ date: 2020-11-19 18:07:20.752111+00:00
+ result: SUCCESS
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/data-hal-get-code/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: trunk
+ param_release_uuid: 62b4ccfe-20c6-4ed9-bb5b-c29893dc2e3a
+ param_distribution: bullseye
+ param_ppa: null
+ repo_name: null
+ git_commit_msg: 8687921 Release new version 9.2.0.0+0~mr9.2.0.0
+- model: repoapi.jenkinsbuildinfo
+ pk: 23956
+ fields:
+ tag: 167c4889-7eca-40c1-ada3-e444fca78d1f
+ projectname: data-hal
+ jobname: data-hal-manage-docker
+ buildnumber: 34
+ date: 2020-11-19 18:07:21.586985+00:00
+ result: SUCCESS
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/data-hal-manage-docker/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: trunk
+ param_release_uuid: 62b4ccfe-20c6-4ed9-bb5b-c29893dc2e3a
+ param_distribution: bullseye
+ param_ppa: $ppa
+ repo_name: null
+ git_commit_msg: 8687921 Release new version 9.2.0.0+0~mr9.2.0.0
+- model: repoapi.jenkinsbuildinfo
+ pk: 23957
+ fields:
+ tag: 167c4889-7eca-40c1-ada3-e444fca78d1f
+ projectname: data-hal
+ jobname: data-hal-tap-test
+ buildnumber: 34
+ date: 2020-11-19 18:07:29.112762+00:00
+ result: SUCCESS
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/data-hal-tap-test/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: trunk
+ param_release_uuid: 62b4ccfe-20c6-4ed9-bb5b-c29893dc2e3a
+ param_distribution: bullseye
+ param_ppa: $ppa
+ repo_name: null
+ git_commit_msg: 8687921 Release new version 9.2.0.0+0~mr9.2.0.0
+- model: repoapi.jenkinsbuildinfo
+ pk: 23958
+ fields:
+ tag: 167c4889-7eca-40c1-ada3-e444fca78d1f
+ projectname: data-hal
+ jobname: data-hal-unit-tests-docker
+ buildnumber: 34
+ date: 2020-11-19 18:07:35.561203+00:00
+ result: SUCCESS
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/data-hal-unit-tests-docker/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: trunk
+ param_release_uuid: 62b4ccfe-20c6-4ed9-bb5b-c29893dc2e3a
+ param_distribution: bullseye
+ param_ppa: $ppa
+ repo_name: null
+ git_commit_msg: 8687921 Release new version 9.2.0.0+0~mr9.2.0.0
+- model: repoapi.jenkinsbuildinfo
+ pk: 23959
+ fields:
+ tag: 167c4889-7eca-40c1-ada3-e444fca78d1f
+ projectname: data-hal
+ jobname: data-hal-source-tests
+ buildnumber: 35
+ date: 2020-11-19 18:07:35.899654+00:00
+ result: SUCCESS
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/data-hal-source-tests/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: trunk
+ param_release_uuid: 62b4ccfe-20c6-4ed9-bb5b-c29893dc2e3a
+ param_distribution: bullseye
+ param_ppa: $ppa
+ repo_name: null
+ git_commit_msg: 8687921 Release new version 9.2.0.0+0~mr9.2.0.0
+- model: repoapi.jenkinsbuildinfo
+ pk: 23960
+ fields:
+ tag: 167c4889-7eca-40c1-ada3-e444fca78d1f
+ projectname: data-hal
+ jobname: data-hal-source
+ buildnumber: 31
+ date: 2020-11-19 18:07:37.676427+00:00
+ result: SUCCESS
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/data-hal-source/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: trunk
+ param_release_uuid: 62b4ccfe-20c6-4ed9-bb5b-c29893dc2e3a
+ param_distribution: bullseye
+ param_ppa: $ppa
+ repo_name: null
+ git_commit_msg: 8687921 Release new version 9.2.0.0+0~mr9.2.0.0
+- model: repoapi.jenkinsbuildinfo
+ pk: 23961
+ fields:
+ tag: 167c4889-7eca-40c1-ada3-e444fca78d1f
+ projectname: data-hal
+ jobname: data-hal-binaries
+ buildnumber: 31
+ date: 2020-11-19 18:08:07.137439+00:00
+ result: SUCCESS
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/data-hal-binaries/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: trunk
+ param_release_uuid: 62b4ccfe-20c6-4ed9-bb5b-c29893dc2e3a
+ param_distribution: bullseye
+ param_ppa: $ppa
+ repo_name: null
+ git_commit_msg: 8687921 Release new version 9.2.0.0+0~mr9.2.0.0
+- model: repoapi.jenkinsbuildinfo
+ pk: 23962
+ fields:
+ tag: 167c4889-7eca-40c1-ada3-e444fca78d1f
+ projectname: data-hal
+ jobname: data-hal-repos
+ buildnumber: 31
+ date: 2020-11-19 18:08:07.759922+00:00
+ result: FAILURE
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/data-hal-repos/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: trunk
+ param_release_uuid: 62b4ccfe-20c6-4ed9-bb5b-c29893dc2e3a
+ param_distribution: bullseye
+ param_ppa: $ppa
+ repo_name: null
+ git_commit_msg: 8687921 Release new version 9.2.0.0+0~mr9.2.0.0
+- model: repoapi.jenkinsbuildinfo
+ pk: 14192
+ fields:
+ tag: c8726604-79d3-4c62-bd18-50f86124dd33
+ projectname: sipwise-base
+ jobname: sipwise-base-get-code
+ buildnumber: 6
+ date: 2020-03-28 08:32:26.520724+00:00
+ result: SUCCESS
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/sipwise-base-get-code/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: release-trunk-buster
+ param_release_uuid: 2b0d0640-a0be-4b44-98be-0c55cc6f6610
+ param_distribution: buster
+ param_ppa: null
+ repo_name: null
+ git_commit_msg: 99e3227 Release new version 8.4.0.0+0~mr8.4.0.0
+- model: repoapi.jenkinsbuildinfo
+ pk: 14193
+ fields:
+ tag: c8726604-79d3-4c62-bd18-50f86124dd33
+ projectname: sipwise-base
+ jobname: sipwise-base-manage-docker
+ buildnumber: 6
+ date: 2020-03-28 08:32:27.025884+00:00
+ result: SUCCESS
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/sipwise-base-manage-docker/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: release-trunk-buster
+ param_release_uuid: 2b0d0640-a0be-4b44-98be-0c55cc6f6610
+ param_distribution: buster
+ param_ppa: $ppa
+ repo_name: null
+ git_commit_msg: 99e3227 Release new version 8.4.0.0+0~mr8.4.0.0
+- model: repoapi.jenkinsbuildinfo
+ pk: 14194
+ fields:
+ tag: c8726604-79d3-4c62-bd18-50f86124dd33
+ projectname: sipwise-base
+ jobname: sipwise-base-tap-test
+ buildnumber: 6
+ date: 2020-03-28 08:32:37.511295+00:00
+ result: SUCCESS
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/sipwise-base-tap-test/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: release-trunk-buster
+ param_release_uuid: 2b0d0640-a0be-4b44-98be-0c55cc6f6610
+ param_distribution: buster
+ param_ppa: $ppa
+ repo_name: null
+ git_commit_msg: 99e3227 Release new version 8.4.0.0+0~mr8.4.0.0
+- model: repoapi.jenkinsbuildinfo
+ pk: 14195
+ fields:
+ tag: c8726604-79d3-4c62-bd18-50f86124dd33
+ projectname: sipwise-base
+ jobname: sipwise-base-dist-test
+ buildnumber: 6
+ date: 2020-03-28 08:32:44.277122+00:00
+ result: SUCCESS
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/sipwise-base-dist-test/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: release-trunk-buster
+ param_release_uuid: 2b0d0640-a0be-4b44-98be-0c55cc6f6610
+ param_distribution: buster
+ param_ppa: $ppa
+ repo_name: null
+ git_commit_msg: 99e3227 Release new version 8.4.0.0+0~mr8.4.0.0
+- model: repoapi.jenkinsbuildinfo
+ pk: 14196
+ fields:
+ tag: c8726604-79d3-4c62-bd18-50f86124dd33
+ projectname: sipwise-base
+ jobname: sipwise-base-source-tests
+ buildnumber: 6
+ date: 2020-03-28 08:32:44.465908+00:00
+ result: SUCCESS
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/sipwise-base-source-tests/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: release-trunk-buster
+ param_release_uuid: 2b0d0640-a0be-4b44-98be-0c55cc6f6610
+ param_distribution: buster
+ param_ppa: $ppa
+ repo_name: null
+ git_commit_msg: 99e3227 Release new version 8.4.0.0+0~mr8.4.0.0
+- model: repoapi.jenkinsbuildinfo
+ pk: 14197
+ fields:
+ tag: c8726604-79d3-4c62-bd18-50f86124dd33
+ projectname: sipwise-base
+ jobname: sipwise-base-docs
+ buildnumber: 6
+ date: 2020-03-28 08:32:45.212242+00:00
+ result: SUCCESS
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/sipwise-base-docs/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: release-trunk-buster
+ param_release_uuid: 2b0d0640-a0be-4b44-98be-0c55cc6f6610
+ param_distribution: buster
+ param_ppa: $ppa
+ repo_name: null
+ git_commit_msg: 99e3227 Release new version 8.4.0.0+0~mr8.4.0.0
+- model: repoapi.jenkinsbuildinfo
+ pk: 14198
+ fields:
+ tag: c8726604-79d3-4c62-bd18-50f86124dd33
+ projectname: sipwise-base
+ jobname: sipwise-base-source
+ buildnumber: 6
+ date: 2020-03-28 08:32:46.692498+00:00
+ result: SUCCESS
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/sipwise-base-source/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: release-trunk-buster
+ param_release_uuid: 2b0d0640-a0be-4b44-98be-0c55cc6f6610
+ param_distribution: buster
+ param_ppa: $ppa
+ repo_name: null
+ git_commit_msg: 99e3227 Release new version 8.4.0.0+0~mr8.4.0.0
+- model: repoapi.jenkinsbuildinfo
+ pk: 14200
+ fields:
+ tag: c8726604-79d3-4c62-bd18-50f86124dd33
+ projectname: sipwise-base
+ jobname: sipwise-base-binaries
+ buildnumber: 6
+ date: 2020-03-28 08:33:07.359523+00:00
+ result: SUCCESS
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/sipwise-base-binaries/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: release-trunk-buster
+ param_release_uuid: 2b0d0640-a0be-4b44-98be-0c55cc6f6610
+ param_distribution: buster
+ param_ppa: $ppa
+ repo_name: null
+ git_commit_msg: 99e3227 Release new version 8.4.0.0+0~mr8.4.0.0
+- model: repoapi.jenkinsbuildinfo
+ pk: 14201
+ fields:
+ tag: c8726604-79d3-4c62-bd18-50f86124dd33
+ projectname: sipwise-base
+ jobname: sipwise-base-repos
+ buildnumber: 6
+ date: 2020-03-28 08:33:08.430006+00:00
+ result: SUCCESS
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/sipwise-base-repos/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: release-trunk-buster
+ param_release_uuid: 2b0d0640-a0be-4b44-98be-0c55cc6f6610
+ param_distribution: buster
+ param_ppa: $ppa
+ repo_name: null
+ git_commit_msg: 99e3227 Release new version 8.4.0.0+0~mr8.4.0.0
+- model: repoapi.jenkinsbuildinfo
+ pk: 14202
+ fields:
+ tag: c8726604-79d3-4c62-bd18-50f86124dd33
+ projectname: sipwise-base
+ jobname: sipwise-base-docker-ppa
+ buildnumber: 5
+ date: 2020-03-28 08:33:08.747639+00:00
+ result: SUCCESS
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/sipwise-base-docker-ppa/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: release-trunk-buster
+ param_release_uuid: 2b0d0640-a0be-4b44-98be-0c55cc6f6610
+ param_distribution: buster
+ param_ppa: $ppa
+ repo_name: null
+ git_commit_msg: 99e3227 Release new version 8.4.0.0+0~mr8.4.0.0
+- model: repoapi.jenkinsbuildinfo
+ pk: 14208
+ fields:
+ tag: c8726604-79d3-4c62-bd18-50f86124dd33
+ projectname: sipwise-base
+ jobname: sipwise-base-piuparts
+ buildnumber: 5
+ date: 2020-03-28 08:33:34.732237+00:00
+ result: SUCCESS
+ job_url: https://jenkins-dev.mgm.sipwise.com/job/sipwise-base-piuparts/
+ gerrit_patchset: none_might-be-direct-push
+ gerrit_change: null
+ gerrit_eventtype: null
+ param_tag: none
+ param_branch: master
+ param_release: release-trunk-buster
+ param_release_uuid: 2b0d0640-a0be-4b44-98be-0c55cc6f6610
+ param_distribution: buster
+ param_ppa: $ppa
+ repo_name: null
+ git_commit_msg: 99e3227 Release new version 8.4.0.0+0~mr8.4.0.0
diff --git a/repoapi/models/jbi.py b/repoapi/models/jbi.py
index b8ee0d6..1da9f60 100644
--- a/repoapi/models/jbi.py
+++ b/repoapi/models/jbi.py
@@ -23,6 +23,7 @@ from urllib.parse import urlparse
import structlog
from django.db import models
+from django.db.models import Q
from django.forms.models import model_to_dict
from debian import deb822
@@ -62,7 +63,8 @@ class JenkinsBuildInfoManager(models.Manager):
def releases(self, flat=True):
qs = self.get_queryset().exclude(
- jobname__in=settings.BUILD_RELEASE_JOBS
+ Q(param_release__contains="trunk")
+ | Q(jobname__in=settings.BUILD_RELEASE_JOBS)
)
res = qs.filter(tag__isnull=False).values("param_release").distinct()
if res.exists():
@@ -70,6 +72,7 @@ class JenkinsBuildInfoManager(models.Manager):
return res.values_list("param_release", flat=True)
else:
return res.values("param_release")
+ return []
def is_release(self, release):
res = self.get_queryset().filter(
diff --git a/repoapi/test/test_model_queries.py b/repoapi/test/test_model_queries.py
index 50d368e..d329dac 100644
--- a/repoapi/test/test_model_queries.py
+++ b/repoapi/test/test_model_queries.py
@@ -103,6 +103,14 @@ class JBIQueriesTestCase(BaseTest):
self.assertEqual(JenkinsBuildInfo.objects.count(), prev_count - 1)
+class JBIQueriesTrunk(BaseTest):
+ fixtures = ["test_model_queries_trunk.yaml"]
+
+ def test_releases(self):
+ releases = JenkinsBuildInfo.objects.releases()
+ self.assertEqual(releases, [])
+
+
class JBIQueriesUUIDTest(BaseTest):
fixtures = ["test_model_queries_uuid.json"]
release = "release-mr8.1"