TT#100201 build: support trunk with more than one distribution

* Makefile: add extra test summary
* migrate to structlog, this is an ongoing effort
* panel: remove any "trunk" build

Change-Id: I6f60541248f2970e0fe0784f2eb6eff5dec40721
pull/3/head
Victor Seva 5 years ago
parent 2bc954c4ce
commit ffe2d6c8b9
No known key found for this signature in database
GPG Key ID: B1589889727198E0

@ -18,7 +18,7 @@ venv_dev: requirements/dev.txt
################################### ###################################
test: 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 --cov=. --cov-report=xml:$(RESULTS)/coverage.xml --pep8
test_pylint: test_pylint:

@ -1,8 +1,13 @@
distris: distris:
- release-trunk-buster - release-trunk-buster
- release-trunk-bullseye
debian_release: buster debian_release: buster
release-trunk-bullseye:
# TT#44190 needed by ngcp-panel
- grafana: 7.3.1
release-trunk-buster: release-trunk-buster:
# TT#32916 TT#44119 bcg729 for G.729 codec support for rtpengine # TT#32916 TT#44119 bcg729 for G.729 codec support for rtpengine
- bcg729: 1.0.4+git20180222-0.1~bpo10+1 - bcg729: 1.0.4+git20180222-0.1~bpo10+1

@ -19,6 +19,7 @@ from django.core.management.base import CommandError
from build.models import BuildRelease from build.models import BuildRelease
from build.models.br import regex_mrXX from build.models.br import regex_mrXX
from build.utils import ReleaseConfig
class Command(BaseCommand): class Command(BaseCommand):
@ -32,6 +33,12 @@ class Command(BaseCommand):
if not regex_mrXX.match(ver): if not regex_mrXX.match(ver):
raise CommandError("'{}'' not mrX.Y version".format(ver)) raise CommandError("'{}'' not mrX.Y version".format(ver))
release = "release-{}".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)) raise CommandError("'{}' has already instances".format(release))
BuildRelease.objects.create_build_release(uuid.uuid4(), ver, fake=True) BuildRelease.objects.create_build_release(uuid.uuid4(), ver, fake=True)

@ -13,9 +13,9 @@
# You should have received a copy of the GNU General Public License along # You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>. # with this program. If not, see <http://www.gnu.org/licenses/>.
import datetime import datetime
import logging
import re import re
import structlog
from django.db import models from django.db import models
from django.db.models import Q from django.db.models import Q
from django.forms.models import model_to_dict 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 build.utils import ReleaseConfig
from repoapi.models import JenkinsBuildInfo 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_mrXXX = re.compile(r"^mr[0-9]+\.[0-9]+\.[0-9]+$")
regex_mrXX = re.compile(r"^mr[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): class BuildReleaseManager(models.Manager):
_jbi = JenkinsBuildInfo.objects _jbi = JenkinsBuildInfo.objects
def release(self, version): def release(self, version, distribution):
qs = self.get_queryset() qs = self.get_queryset()
return qs.filter( 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): def create_build_release(self, uuid, release, fake=False):
log = logger.bind(uuid=str(uuid), release=release, fake=fake)
config = ReleaseConfig(release) config = ReleaseConfig(release)
qs = self.get_queryset() qs = self.get_queryset()
br = qs.filter(release=config.release) br = qs.filter(
release=config.release, distribution=config.debian_release
)
release_ok = config.release release_ok = config.release
if br.exists(): if br.exists():
if regex_mrXXX.match(config.branch): if regex_mrXXX.match(config.branch):
@ -58,7 +62,7 @@ class BuildReleaseManager(models.Manager):
"release[mrX.Y]:{} has already a build, " "release[mrX.Y]:{} has already a build, "
"set {} as release" "set {} as release"
) )
logger.info(msg.format(config.branch, release_ok)) log.info(msg.format(config.branch, release_ok))
projects = ",".join(config.projects) projects = ",".join(config.projects)
if fake: if fake:
start_date = timezone.make_aware(datetime.datetime(1977, 1, 1)) start_date = timezone.make_aware(datetime.datetime(1977, 1, 1))
@ -277,6 +281,7 @@ class BuildRelease(models.Model):
return "branch/{}".format(self.branch) return "branch/{}".format(self.branch)
def _next(self): def _next(self):
log = logger.bind(release=self)
if self.built_projects is None: if self.built_projects is None:
return self.build_deps[0][0] return self.build_deps[0][0]
if self.done: if self.done:
@ -293,8 +298,10 @@ class BuildRelease(models.Model):
deps_missing.append(prj) deps_missing.append(prj)
else: else:
if len(deps_missing) > 0: if len(deps_missing) > 0:
msg = "release {} has build_deps {} missing" log.info(
logger.info(msg.format(self, deps_missing)) "release has build_deps missing",
deps_missing=deps_missing,
)
return None return None
for prj in self.projects_list: for prj in self.projects_list:
if prj not in built_list and prj not in t_list: if prj not in built_list and prj not in t_list:
@ -303,15 +310,19 @@ class BuildRelease(models.Model):
@property @property
def next(self): def next(self):
failed_projects = self.failed_projects_list failed_projects = self.failed_projects_list
log = logger.bind(release=self)
if any(job in failed_projects for job in settings.BUILD_RELEASE_JOBS): if any(job in failed_projects for job in settings.BUILD_RELEASE_JOBS):
msg = "release {} has failed release_jobs, stop sending jobs" log.info(
logger.info(msg.format(self)) "release has failed release_jobs, stop sending jobs",
failed_projects=failed_projects,
)
return return
res = self._next() res = self._next()
if res is not None: if res is not None:
if res in failed_projects: if res in failed_projects:
logger.error( log.error(
"project: %s marked as failed, stop sending jobs", res "project marked as failed, stop sending jobs",
project=res,
) )
else: else:
return res return res
@ -328,5 +339,7 @@ class BuildRelease(models.Model):
@property @property
def config(self): def config(self):
if getattr(self, "_config", None) is None: if getattr(self, "_config", None) is None:
self._config = ReleaseConfig(self.release) self._config = ReleaseConfig(
self.release, distribution=self.distribution
)
return self._config return self._config

@ -12,8 +12,8 @@
# #
# You should have received a copy of the GNU General Public License along # You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>. # with this program. If not, see <http://www.gnu.org/licenses/>.
import structlog
from celery import shared_task from celery import shared_task
from celery.utils.log import get_task_logger
from .conf import settings from .conf import settings
from build.models.br import BuildRelease from build.models.br import BuildRelease
@ -21,36 +21,37 @@ from build.utils import trigger_build
from build.utils import trigger_copy_deps from build.utils import trigger_copy_deps
from repoapi.celery import app from repoapi.celery import app
logger = get_task_logger(__name__) logger = structlog.get_logger(__name__)
@app.task(bind=True) @app.task(bind=True)
def build_release(self, pk): def build_release(self, pk):
log = logger.bind(pk=pk)
br = BuildRelease.objects br = BuildRelease.objects
try: try:
instance = br.get(id=pk) instance = br.get(id=pk)
except BuildRelease.DoesNotExist as exc: except BuildRelease.DoesNotExist as exc:
log.warn("BuildRelease not found")
raise self.retry(countdown=60 * 5, exc=exc) raise self.retry(countdown=60 * 5, exc=exc)
if instance.release == "trunk": if instance.release == "trunk":
release = "release-trunk-{}".format(instance.distribution) release = "release-trunk-{}".format(instance.distribution)
else: else:
release = instance.release release = instance.release
url = trigger_copy_deps( url = trigger_copy_deps(
release=release, release=release, internal=True, release_uuid=instance.uuid
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) @shared_task(ignore_result=True)
def build_project(pk, project): def build_project(pk, project):
log = logger.bind(project=project, pk=pk)
try: try:
br = BuildRelease.objects.get(id=pk) br = BuildRelease.objects.get(id=pk)
except BuildRelease.DoesNotExist: except BuildRelease.DoesNotExist:
logger.error( log.error("can't trigger project on unknown release")
"can't trigger %s on unknown release with id:%s", project, pk
)
return return
url = trigger_build( url = trigger_build(
"{}-get-code".format(project), "{}-get-code".format(project),
@ -60,15 +61,16 @@ def build_project(pk, project):
trigger_distribution=br.distribution, trigger_distribution=br.distribution,
) )
br.pool_size += 1 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) @shared_task(ignore_result=True)
def build_resume(pk): def build_resume(pk):
log = logger.bind(pk=pk)
try: try:
br = BuildRelease.objects.get(id=pk) br = BuildRelease.objects.get(id=pk)
except BuildRelease.DoesNotExist: except BuildRelease.DoesNotExist:
logger.error("can't resume on unknown release with id:%s", pk) log.error("can't resume on unknown release")
return return
params = { params = {
"release_uuid": br.uuid, "release_uuid": br.uuid,
@ -77,21 +79,16 @@ def build_resume(pk):
"trigger_distribution": br.distribution, "trigger_distribution": br.distribution,
} }
size = settings.BUILD_POOL - br.pool_size size = settings.BUILD_POOL - br.pool_size
log.bind(size=size, pool_size=br.pool_size, br=str(br))
if size <= 0: if size <= 0:
logger.info( log.info("No more room for new builds, wait for next slot")
"BuildRelease:%s No more room for new builds,"
" wait for next slot",
br,
)
for step in range(size): for step in range(size):
prj = br.next prj = br.next
if prj: if prj:
params["project"] = "{}-get-code".format(prj) params["project"] = "{}-get-code".format(prj)
logger.debug( log.debug("trigger project", project=params["project"])
"trigger:%s for BuildRelease:%s", params["project"], br
)
trigger_build(**params) trigger_build(**params)
br.append_triggered(prj) br.append_triggered(prj)
else: else:
logger.debug("BuildRelease:%s has no next", br) log.debug("BuildRelease has no next")
break break

@ -32,10 +32,10 @@ class createFakeBuildReleaseTest(TestCase):
def test_mrXX_ok(self): def test_mrXX_ok(self):
self.assertEqual( 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") 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) self.assertEqual(qs.count(), 1)
br = qs.first() br = qs.first()
self.assertTrue(br.done) self.assertTrue(br.done)

@ -41,6 +41,17 @@ class BuildReleaseManagerTestCase(BaseTest):
self.assertNotEqual(len(br.projects), 0) self.assertNotEqual(len(br.projects), 0)
self.assertIn("sipwise-base", br.projects) 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): def test_create_mrXX(self, dlf):
BuildRelease.objects.filter(release="release-mr8.1").delete() BuildRelease.objects.filter(release="release-mr8.1").delete()
self.assertFalse( self.assertFalse(
@ -88,7 +99,7 @@ class BuildReleaseManagerTestCase(BaseTest):
prev = BuildRelease.objects.filter(release="release-mr8.1") prev = BuildRelease.objects.filter(release="release-mr8.1")
br = BuildRelease.objects.create_build_release("BBB", "mr8.1") br = BuildRelease.objects.create_build_release("BBB", "mr8.1")
self.assertEqual(br.release, "release-mr8.1-update") 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) self.assertEqual(qs.count(), prev.count() + 1)
def test_create_fake(self, dlf): def test_create_fake(self, dlf):
@ -102,9 +113,7 @@ class BuildReleaseManagerTestCase(BaseTest):
class BuildReleaseTestCase(BaseTest): class BuildReleaseTestCase(BaseTest):
fixtures = [ fixtures = ["test_models"]
"test_models",
]
release_uuid = "dbe569f7-eab6-4532-a6d1-d31fb559649b" release_uuid = "dbe569f7-eab6-4532-a6d1-d31fb559649b"
def test_distribution(self): def test_distribution(self):
@ -121,14 +130,12 @@ class BuildReleaseTestCase(BaseTest):
def test_built_projects_list(self): def test_built_projects_list(self):
build = BuildRelease.objects.get(uuid=self.release_uuid) build = BuildRelease.objects.get(uuid=self.release_uuid)
self.assertCountEqual( self.assertCountEqual(
build.built_projects_list, ["kamailio", "lua-ngcp-kamailio"], build.built_projects_list, ["kamailio", "lua-ngcp-kamailio"]
) )
def test_queued_projects_list(self): def test_queued_projects_list(self):
build = BuildRelease.objects.get(uuid=self.release_uuid) build = BuildRelease.objects.get(uuid=self.release_uuid)
self.assertCountEqual( self.assertCountEqual(build.queued_projects_list, ["ngcp-panel"])
build.queued_projects_list, ["ngcp-panel"],
)
def test_config(self): def test_config(self):
build = BuildRelease.objects.get(uuid=self.release_uuid) build = BuildRelease.objects.get(uuid=self.release_uuid)
@ -189,9 +196,7 @@ class BuildReleaseTestCase(BaseTest):
class BuildReleaseStepsTest(BaseTest): class BuildReleaseStepsTest(BaseTest):
fixtures = [ fixtures = ["test_models"]
"test_models",
]
release = "release-mr8.1" release = "release-mr8.1"
release_uuid = "dbe569f7-eab6-4532-a6d1-d31fb559648b" release_uuid = "dbe569f7-eab6-4532-a6d1-d31fb559648b"
@ -388,9 +393,7 @@ class BuildReleaseStepsTest(BaseTest):
@patch("repoapi.utils.dlfile") @patch("repoapi.utils.dlfile")
@patch("build.models.build_resume") @patch("build.models.build_resume")
class JBIManageTest(BaseTest): class JBIManageTest(BaseTest):
fixtures = [ fixtures = ["test_models"]
"test_models",
]
release = "release-mr8.1" release = "release-mr8.1"
release_uuid = "dbe569f7-eab6-4532-a6d1-d31fb559648b" release_uuid = "dbe569f7-eab6-4532-a6d1-d31fb559648b"
@ -461,9 +464,7 @@ class JBIManageTest(BaseTest):
class BRManageTest(BaseTest): class BRManageTest(BaseTest):
fixtures = [ fixtures = ["test_models"]
"test_models",
]
@patch("build.tasks.trigger_copy_deps") @patch("build.tasks.trigger_copy_deps")
@patch("build.models.build_resume") @patch("build.models.build_resume")
@ -483,9 +484,7 @@ class BRManageTest(BaseTest):
class BuildReleaseRetriggerTest(BaseTest): class BuildReleaseRetriggerTest(BaseTest):
fixtures = [ fixtures = ["test_models"]
"test_models",
]
release = "release-mr8.1" release = "release-mr8.1"
release_uuid = "dbe569f7-eab6-4532-a6d1-d31fb559648b" release_uuid = "dbe569f7-eab6-4532-a6d1-d31fb559648b"

@ -13,20 +13,42 @@
# You should have received a copy of the GNU General Public License along # You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>. # with this program. If not, see <http://www.gnu.org/licenses/>.
import re import re
from unittest.mock import patch
from django.test import override_settings from django.test import override_settings
from django.test import SimpleTestCase from django.test import SimpleTestCase
from mock import patch
from build import exceptions as err from build import exceptions as err
from build.conf import settings from build.conf import settings
from build.utils import get_common_release from build.utils import get_common_release
from build.utils import get_simple_release from build.utils import get_simple_release
from build.utils import is_release_trunk
from build.utils import ReleaseConfig from build.utils import ReleaseConfig
from build.utils import trigger_build from build.utils import trigger_build
from build.utils import trigger_copy_deps 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): class SimpleReleaseTest(SimpleTestCase):
def test_trunk(self): def test_trunk(self):
val = get_simple_release("release-trunk-buster") val = get_simple_release("release-trunk-buster")
@ -81,7 +103,8 @@ class ReleaseConfigTestCase(SimpleTestCase):
@override_settings(BUILD_RELEASES_SKIP=["mr0.1"]) @override_settings(BUILD_RELEASES_SKIP=["mr0.1"])
def test_supported_releases(self): def test_supported_releases(self):
supported = [ supported = [
"trunk", "release-trunk-buster",
"release-trunk-bullseye",
"mr8.1.2", "mr8.1.2",
"mr8.1", "mr8.1",
"mr7.5.3", "mr7.5.3",
@ -95,12 +118,17 @@ class ReleaseConfigTestCase(SimpleTestCase):
@patch.object(ReleaseConfig, "supported_releases") @patch.object(ReleaseConfig, "supported_releases")
def test_supported_releases_dict(self, sr): def test_supported_releases_dict(self, sr):
res_ok = [ res_ok = [
{"release": "trunk", "base": "master"}, {"release": "release-trunk-buster", "base": "master"},
{"release": "mr8.0", "base": "mr8.0"}, {"release": "mr8.0", "base": "mr8.0"},
{"release": "mr8.0.1", "base": "mr8.0"}, {"release": "mr8.0.1", "base": "mr8.0"},
{"release": "mr7.5.1", "base": "mr7.5"}, {"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() res = ReleaseConfig.supported_releases_dict()
self.assertListEqual(res, res_ok) self.assertListEqual(res, res_ok)
@ -119,6 +147,19 @@ class ReleaseConfigTestCase(SimpleTestCase):
self.assertEqual(rc.debian_release, "buster") self.assertEqual(rc.debian_release, "buster")
self.assertEqual(len(rc.projects), 73) 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): def test_release_value(self):
rc = ReleaseConfig("trunk") rc = ReleaseConfig("trunk")
self.assertEqual(rc.release, "trunk") self.assertEqual(rc.release, "trunk")

@ -40,6 +40,15 @@ project_url = (
copy_deps_url = base_url + "&release={release}&internal={internal}" copy_deps_url = base_url + "&release={release}&internal={internal}"
re_release = re.compile(r"^release-(mr[0-9]+\.[0-9]+(\.[0-9]+)?)$") 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_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): def get_simple_release(version):
@ -158,6 +167,15 @@ class ReleaseConfig(object):
return list_prj.pop(0) return list_prj.pop(0)
raise StopIteration 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 @classmethod
def supported_releases(cls): def supported_releases(cls):
skip_files = ["{}.yml".format(x) for x in settings.BUILD_RELEASES_SKIP] 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( for root, dirs, files in os.walk(
settings.BUILD_REPOS_SCRIPTS_CONFIG_DIR 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: for name in files:
path_name = Path(name) path_name = Path(name)
if path_name.suffix != ".yml": if path_name.suffix != ".yml":
continue continue
if name not in skip_files: if name not in skip_files:
res.append(Path(name).stem) res.append(path_name.stem)
res.sort(reverse=True) res.sort(reverse=True)
return res return res
@ -182,7 +209,10 @@ class ReleaseConfig(object):
for version in sr 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) filename = get_simple_release(name)
if filename is None: if filename is None:
filename = name filename = name
@ -190,12 +220,7 @@ class ReleaseConfig(object):
self.config_path = os.path.join( self.config_path = os.path.join(
settings.BUILD_REPOS_SCRIPTS_CONFIG_DIR, self.config_file settings.BUILD_REPOS_SCRIPTS_CONFIG_DIR, self.config_file
) )
try: self.config = self.load_config(self.config_path)
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))
try: try:
self.jenkins_jobs = self.config["jenkins-jobs"] self.jenkins_jobs = self.config["jenkins-jobs"]
except KeyError: except KeyError:
@ -241,6 +266,8 @@ class ReleaseConfig(object):
@property @property
def debian_release(self): def debian_release(self):
if self.distribution:
return self.distribution
return self.config["debian_release"] return self.config["debian_release"]
@property @property

@ -23,7 +23,7 @@ from repoapi.models import JenkinsBuildInfo as jbi
def index(request): def index(request):
context = {"releases": humansorted(jbi.objects.releases())} context = {"releases": humansorted(jbi.objects.releases(), reverse=True)}
return render(request, "panel/index.html", context) return render(request, "panel/index.html", context)

@ -69,7 +69,7 @@ def build_release(request, release):
) )
else: else:
build_releases = BuildRelease.objects.release( build_releases = BuildRelease.objects.release(
release_config.release release_config.release, release_config.debian_release
).order_by("-start_date") ).order_by("-start_date")
if build_releases.count() == 0: if build_releases.count() == 0:
done = True done = True

@ -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

@ -23,6 +23,7 @@ from urllib.parse import urlparse
import structlog import structlog
from django.db import models from django.db import models
from django.db.models import Q
from django.forms.models import model_to_dict from django.forms.models import model_to_dict
from debian import deb822 from debian import deb822
@ -62,7 +63,8 @@ class JenkinsBuildInfoManager(models.Manager):
def releases(self, flat=True): def releases(self, flat=True):
qs = self.get_queryset().exclude( 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() res = qs.filter(tag__isnull=False).values("param_release").distinct()
if res.exists(): if res.exists():
@ -70,6 +72,7 @@ class JenkinsBuildInfoManager(models.Manager):
return res.values_list("param_release", flat=True) return res.values_list("param_release", flat=True)
else: else:
return res.values("param_release") return res.values("param_release")
return []
def is_release(self, release): def is_release(self, release):
res = self.get_queryset().filter( res = self.get_queryset().filter(

@ -103,6 +103,14 @@ class JBIQueriesTestCase(BaseTest):
self.assertEqual(JenkinsBuildInfo.objects.count(), prev_count - 1) 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): class JBIQueriesUUIDTest(BaseTest):
fixtures = ["test_model_queries_uuid.json"] fixtures = ["test_model_queries_uuid.json"]
release = "release-mr8.1" release = "release-mr8.1"

Loading…
Cancel
Save