TT#86350 release_dashboard: allow build release more than once

* for releases mrX.X and trunk when old builds are done
* add last_update info in the list of builds
* fix error when running tests on local docker

Change-Id: I4912aa00f1a09141ff5d9babfb7b09217097c3d4
changes/40/41840/2
Victor Seva 5 years ago
parent 7d83594c98
commit 0eafac88ff

@ -26,7 +26,7 @@
projectname: kamailio
jobname: kamailio-get-code
buildnumber: 23
date: 2020-02-22 04:15:40.614682+00:00
date: 2020-02-22 04:20:40.614682+00:00
result: SUCCESS
job_url: https://jenkins-dev.mgm.sipwise.com/job/kamailio-get-code/
gerrit_patchset: none_might-be-direct-push
@ -68,7 +68,7 @@
projectname: release-copy-debs-yml
jobname: release-copy-debs-yml
buildnumber: 23
date: 2020-02-23 04:15:40.614682+00:00
date: 2020-02-23 04:17:40.614682+00:00
result: SUCCESS
job_url: https://jenkins-dev.mgm.sipwise.com/job/release-copy-debs-yml/
gerrit_patchset: none_might-be-direct-push

@ -112,6 +112,12 @@ class BuildRelease(models.Model):
build_resume.delay(self.id)
@property
def last_update(self):
job = BuildRelease.objects.jbi(self.uuid).order_by("-date").first()
if job:
return job.date
@property
def done(self):
if self.built_projects is None:

@ -1,4 +1,4 @@
# Copyright (C) 2017 The Sipwise Team - http://sipwise.com
# Copyright (C) 2017-2020 The Sipwise Team - http://sipwise.com
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
@ -59,47 +59,43 @@ class BuildReleaseManagerTestCase(BaseTest):
list(BuildRelease.objects.releases_with_builds()), ["mr8.1"]
)
def test_last_update(self, dlf):
br = BuildRelease.objects.get(uuid=self.release_uuid)
job = JenkinsBuildInfo.objects.get(id=4)
self.assertEqual(br.last_update, job.date)
class BuildReleaseTestCase(BaseTest):
fixtures = [
"test_models",
]
release_uuid = "dbe569f7-eab6-4532-a6d1-d31fb559649b"
def test_distribution(self):
build = BuildRelease.objects.get(
uuid="dbe569f7-eab6-4532-a6d1-d31fb559649b"
)
build = BuildRelease.objects.get(uuid=self.release_uuid)
self.assertEqual(build.distribution, "buster")
def test_projects_list(self):
build = BuildRelease.objects.get(
uuid="dbe569f7-eab6-4532-a6d1-d31fb559649b"
)
build = BuildRelease.objects.get(uuid=self.release_uuid)
self.assertCountEqual(
build.projects_list,
["kamailio", "lua-ngcp-kamailio", "ngcp-panel"],
)
def test_built_projects_list(self):
build = BuildRelease.objects.get(
uuid="dbe569f7-eab6-4532-a6d1-d31fb559649b"
)
build = BuildRelease.objects.get(uuid=self.release_uuid)
self.assertCountEqual(
build.built_projects_list, ["kamailio", "lua-ngcp-kamailio"],
)
def test_queued_projects_list(self):
build = BuildRelease.objects.get(
uuid="dbe569f7-eab6-4532-a6d1-d31fb559649b"
)
build = BuildRelease.objects.get(uuid=self.release_uuid)
self.assertCountEqual(
build.queued_projects_list, ["ngcp-panel"],
)
def test_config(self):
build = BuildRelease.objects.get(
uuid="dbe569f7-eab6-4532-a6d1-d31fb559649b"
)
build = BuildRelease.objects.get(uuid=self.release_uuid)
config = build.config
self.assertIsNotNone(config)
self.assertIs(config, build.config)
@ -109,9 +105,7 @@ class BuildReleaseTestCase(BaseTest):
self.assertEqual(build.branch_or_tag, "branch/master")
def test_branch_or_tag_mrXX(self):
build = BuildRelease.objects.get(
uuid="dbe569f7-eab6-4532-a6d1-d31fb559649b"
)
build = BuildRelease.objects.get(uuid=self.release_uuid)
self.assertEqual(build.branch_or_tag, "branch/mr8.1")
def test_branch_or_tag_mrXXX(self):
@ -147,6 +141,10 @@ class BuildReleaseStepsTest(BaseTest):
self.jbi = MagicMock()
self.jbi.result = "SUCCESS"
def test_done_empty(self):
self.assertIsNone(self.br.built_projects)
self.assertFalse(self.br.done)
def test_append_built_fist(self):
self.br.built_projects = "release-copy-debs-yml"
self.jbi.projectname = "data-hal"
@ -156,6 +154,7 @@ class BuildReleaseStepsTest(BaseTest):
self.br.built_projects, "release-copy-debs-yml,data-hal"
)
self.assertEqual(self.br.pool_size, 0)
self.assertFalse(self.br.done)
def test_append_built_empty(self):
self.jbi.projectname = "data-hal"
@ -163,6 +162,7 @@ class BuildReleaseStepsTest(BaseTest):
self.assertTrue(self.br.append_built(self.jbi))
self.assertEqual(self.br.built_projects, "data-hal")
self.assertEqual(self.br.pool_size, 0)
self.assertFalse(self.br.done)
def test_append_built(self):
self.br.built_projects = "data-hal"
@ -172,6 +172,7 @@ class BuildReleaseStepsTest(BaseTest):
self.assertTrue(self.br.append_built(self.jbi))
self.assertEqual(self.br.built_projects, "data-hal,libinewrate")
self.assertEqual(self.br.pool_size, 1)
self.assertFalse(self.br.done)
def test_append_built_dup(self):
self.br.built_projects = "data-hal"
@ -197,6 +198,7 @@ class BuildReleaseStepsTest(BaseTest):
self.assertIsNone(self.br.built_projects)
self.assertEqual(self.br.failed_projects, "data-hal")
self.assertEqual(self.br.pool_size, 0)
self.assertFalse(self.br.done)
def test_append_built_fail(self):
self.br.built_projects = "data-hal"
@ -273,6 +275,7 @@ class BuildReleaseStepsTest(BaseTest):
self.jbi.jobname = "ngcp-schema-repos"
self.assertTrue(self.br.append_built(self.jbi))
self.assertEqual(self.br.next, "asterisk-voicemail")
self.assertFalse(self.br.done)
def test_next_build_deps_stop(self):
build_deps = [
@ -295,6 +298,7 @@ class BuildReleaseStepsTest(BaseTest):
i += 1
except IndexError:
self.assertIsNone(_next)
self.assertFalse(self.br.done)
def test_next_last(self):
pl = self.br.projects_list[:-1]
@ -311,6 +315,7 @@ class BuildReleaseStepsTest(BaseTest):
self.jbi.jobname = "{}-repos".format(self.jbi.projectname)
self.assertTrue(self.br.append_built(self.jbi))
self.assertIsNone(self.br.next)
self.assertTrue(self.br.done)
def test_next_stop(self):
self.br.built_projects = "release-copy-debs-yml,{}".format(
@ -358,7 +363,7 @@ class JBIManageTest(BaseTest):
def test_jbi_manage_ok_release_job(self, build_resume, dl):
br = BuildRelease.objects.get(uuid=self.release_uuid)
self.assertEqual(br.pool_size, 0)
JenkinsBuildInfo.objects.create(
job = JenkinsBuildInfo.objects.create(
job_url="http://fake.local/job/release-copy-debs-yml/",
projectname="release-copy-debs-yml",
jobname="release-copy-debs-yml",
@ -371,6 +376,7 @@ class JBIManageTest(BaseTest):
br = BuildRelease.objects.get(pk=br.pk)
self.assertEqual(br.built_projects, "release-copy-debs-yml")
build_resume.delay.assert_called_once_with(br.pk)
self.assertEqual(br.last_update, job.date)
def test_jbi_manage_skip(self, build_resume, dl):
br = BuildRelease.objects.get(uuid=self.release_uuid)

@ -27,7 +27,7 @@
<form method="POST" class="form-inline">
{% csrf_token %}
<button type="submit" class="btn btn-primary" id="build_button"
{% if build_releases %}disabled="disabled"{% endif %}>Build</button>
{% if not done %}disabled="disabled"{% endif %}>Build</button>
</form>
</td>
</tr>
@ -37,12 +37,14 @@
<tr>
<th>UUID</th>
<th>Started at</th>
<th>Last update at</th>
<th>Action</th>
</tr>
{% for br in build_releases %}
<tr class="success build_release" id="br_{{ br.id }}">
<td><a href="{% url 'panel:release-uuid' _uuid=br.uuid %}">{{ br.uuid }}</a></td>
<td>{{ br.start_date }}</td>
<td>{{ br.last_update }}</td>
<td>
<button type="button" id="refresh_{{ br.id }}"
onclick="click_refresh_projects(event, '{{ br.id }}')"
@ -73,6 +75,16 @@
{% endblock %}
{% block extrajs %}
<script type="text/javascript">
$( document ).ready(function() {
var release = '{{ config.release }}';
var builds = {{ build_releases.count }};
if (builds > 0 && release.match(/^release-mr[0-9]+\.[0-9]+\.[0-9]+$/)) {
$( "#build_button" ).attr("disabled", "disabled");
console.debug("mrX.X.X release, can't be built twice");
}
});
function click_delete(e, id) {
delete_build_release(id);
e.preventDefault();

@ -68,12 +68,21 @@ def build_release(request, release):
reverse("panel:release-uuid", args=(release_uuid,))
)
else:
build_releases = BuildRelease.objects.filter(
release=release_config.release
)
if build_releases.count() == 0:
done = True
else:
done = False
for b in build_releases.all():
if b.done:
done = True
context = {
"config": release_config,
"build_releases": BuildRelease.objects.filter(
release=release_config.release
),
"build_releases": build_releases,
"build_deps": list(release_config.build_deps.keys()),
"done": done,
}
return render(request, "release_dashboard/build_release.html", context)

@ -1,4 +1,4 @@
# Copyright (C) 2017 The Sipwise Team - http://sipwise.com
# Copyright (C) 2017-2020 The Sipwise Team - http://sipwise.com
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
@ -13,7 +13,8 @@
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
import os
import shutil
from distutils.dir_util import mkpath
from distutils.dir_util import remove_tree
from tempfile import mkdtemp
from django.test import override_settings
@ -30,14 +31,13 @@ class BaseTest(TestCase):
def setUp(self):
from django.conf import settings
if not os.path.exists(settings.JBI_BASEDIR):
os.makedirs(settings.JBI_BASEDIR)
mkpath(settings.JBI_BASEDIR, verbose=True)
def tearDown(self):
from django.conf import settings
if os.path.exists(settings.JBI_BASEDIR):
shutil.rmtree(settings.JBI_BASEDIR)
remove_tree(settings.JBI_BASEDIR, verbose=True)
class APIAuthenticatedTestCase(BaseTest, APITestCase):

@ -1,6 +1,8 @@
#!/bin/bash
dfile=$(dirname "$0")/t/Dockerfile
repoapi_tag=${1:-latest}
repoapi_image=docker.mgm.sipwise.com/repoapi-buster:${repoapi_tag}
docker_name=$(sed -ne 's/^# DOCKER_NAME=\(.\+\)$/\1/p;Tn;q;:n' "${dfile}" || true)
repoapi_image=docker.mgm.sipwise.com/${docker_name}:${repoapi_tag}
docker run -d --rm \
--hostname repoapi-rabbit --name repoapi-rabbit rabbitmq:3

Loading…
Cancel
Save