TT#1951 hotfix notes for workfront

* release-tools-runner sends a note
  "hotfix <projectname> <version> triggered"

* TODO: how to be sure that version reaches
  public release ??

Change-Id: Ib220f36d642172d8c89f4df35543193be16d37ce
changes/26/7326/8
Victor Seva 9 years ago committed by Víctor Seva
parent 80970c9270
commit d85f9e0af7

1
debian/control vendored

@ -13,6 +13,7 @@ Section: python
Architecture: all
Depends: make,
python,
python-debian,
virtualenv,
sqlite3,
uwsgi-plugin-python,

@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-07-26 12:58
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='WorkfrontNoteInfo',
fields=[
('id', models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name='ID')),
('workfront_id', models.CharField(max_length=50)),
('projectname', models.CharField(max_length=50)),
('version', models.CharField(max_length=50)),
],
),
migrations.AlterUniqueTogether(
name='workfrontnoteinfo',
unique_together=set(
[('workfront_id', 'projectname', 'version')]),
),
]

@ -0,0 +1,48 @@
# Copyright (C) 2015 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
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
# 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 logging
import re
from django.db import models
from django.db.models.signals import post_save
from django.conf import settings
logger = logging.getLogger(__name__)
workfront_re = re.compile(r"TT#(\d+)")
class WorkfrontNoteInfo(models.Model):
workfront_id = models.CharField(max_length=50, null=False)
projectname = models.CharField(max_length=50, null=False)
version = models.CharField(max_length=50, null=False)
class Meta:
unique_together = [
"workfront_id",
"projectname",
"version"
]
@staticmethod
def getIds(change):
"""
parses text searching for Workfront TT# ocurrences
returns a list of IDs
"""
if change:
res = workfront_re.findall(change)
return set(res)
else:
return set()

@ -0,0 +1,32 @@
# Copyright (C) 2016 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
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
from __future__ import absolute_import
import logging
from celery import shared_task
from django.conf import settings
from .utils import parse_changelog, create_note
from repoapi.models import JenkinsBuildInfo
logger = logging.getLogger(__name__)
@shared_task(ignore_result=True)
def hotfix_released(jbi_id, path):
jbi = JenkinsBuildInfo.objects.get(pk=jbi_id)
logger.info('hotfix_released[%s] %s', jbi, path)
wids, changelog = parse_changelog(path)
for wid in wids:
create_note(wid, jbi.projectname, changelog.full_version)

@ -0,0 +1,94 @@
# Copyright (C) 2015 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
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
# 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 django.test import TestCase, override_settings
from django.conf import settings
from mock import patch, call, mock_open
from hotfix import tasks, utils, models
from repoapi.models import JenkinsBuildInfo
debian_changelog = """ngcp-fake (3.8.7.4+0~mr3.8.7.4) unstable; urgency=medium
[ Kirill Solomko ]
* [ee3c706] MT#21499 add mysql replication options
[ Victor Seva ]
* [aabb345] TT#345 fake comment
* [aabb123] MT#8989 TT#123 fake comment
[ Sipwise Jenkins Builder ]
-- whatever <jenkins@sipwise.com> Fri, 22 Jul 2016 17:29:27 +0200
"""
@override_settings(CELERY_EAGER_PROPAGATES_EXCEPTIONS=True)
class TestHotfixReleased(TestCase):
def get_defaults(self):
defaults = {
'tag': "edc90cd9-37f3-4613-9748-ed05a32031c2",
'projectname': "fake",
'jobname': "release-tools-runner",
'buildnumber': 1,
'result': "SUCCESS",
'job_url': "https://jenkins.mgm.sipwise.com/job/real-fake-gerrit/",
'param_tag': "none",
'param_branch': "mr4.5",
'param_release': "none",
'param_distribution': "wheezy",
'param_ppa': "gerrit_MT10339_review2054",
'git_commit_msg': "7fg4567 TT#0001 whatever",
}
return defaults
@patch('__builtin__.open', mock_open(read_data=debian_changelog))
def test_parse_changelog(self):
ids, changelog = utils.parse_changelog("/tmp/fake.txt")
self.assertItemsEqual(ids, ["345", "123"])
self.assertEquals(changelog.full_version, "3.8.7.4+0~mr3.8.7.4")
self.assertEquals(changelog.package, "ngcp-fake")
@patch('__builtin__.open', mock_open(read_data=debian_changelog))
@patch('repoapi.utils.dlfile')
@patch('repoapi.utils.workfront_note_send')
def test_hotfixreleased(self, wns, dlfile):
param = self.get_defaults()
jbi = JenkinsBuildInfo.objects.create(**param)
tasks.hotfix_released.delay(jbi.pk, "/tmp/fake.txt")
projectname = "fake"
version = "3.8.7.4+0~mr3.8.7.4"
gri = models.WorkfrontNoteInfo.objects.filter(
projectname=projectname,
version=version)
self.assertEquals(gri.count(), 2)
gri = models.WorkfrontNoteInfo.objects.filter(
workfront_id="345",
projectname=projectname,
version=version)
self.assertEquals(gri.count(), 1)
msg = "hotfix %s %s triggered" % (projectname, version)
calls = [call("345", msg), ]
gri = models.WorkfrontNoteInfo.objects.filter(
workfront_id="123",
projectname=projectname,
version=version)
self.assertEquals(gri.count(), 1)
msg = "hotfix %s %s triggered" % (projectname, version)
calls.append(call("123", msg))
wns.assert_has_calls(calls)

@ -0,0 +1,44 @@
# Copyright (C) 2016 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
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
from __future__ import absolute_import
import logging
from debian.changelog import Changelog
from .models import WorkfrontNoteInfo
from repoapi import utils
logger = logging.getLogger(__name__)
def parse_changelog(path):
changelog = Changelog()
with open(path, 'r') as file_changelog:
changelog.parse_changelog(file_changelog.read())
set_ids = set()
for block in changelog:
for change in block.changes():
set_ids = set_ids.union(WorkfrontNoteInfo.getIds(change))
return (set_ids, changelog)
def create_note(wid, projectname, version):
wni = WorkfrontNoteInfo.objects
note, created = wni.get_or_create(
workfront_id=wid,
projectname=projectname,
version=version)
if created:
msg = "hotfix %s %s triggered" % (projectname, version)
utils.workfront_note_send(wid, msg)

@ -28,3 +28,8 @@ app = Celery('repoapi')
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task()
def jbi_parse_hotfix(jbi_id, path):
app.send_task('hotfix_released', jbi_id, path)

@ -146,4 +146,6 @@ class JenkinsBuildInfo(models.Model):
def jbi_manage(sender, **kwargs):
if kwargs["created"]:
instance = kwargs["instance"]
get_jbi_files.delay(instance.jobname, instance.buildnumber)
get_jbi_files.delay(instance.pk,
instance.jobname,
instance.buildnumber)

@ -23,6 +23,7 @@ BASE_DIR = os.path.dirname(
# django-jenkins
PROJECT_APPS = [
'repoapi',
'hotfix',
'panel',
]
@ -142,3 +143,5 @@ CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend'
HOTFIX_ARTIFACT = 'debian_changelog.txt'

@ -16,8 +16,10 @@ from __future__ import absolute_import
import json
import logging
from os.path import basename
from celery import shared_task
from django.conf import settings
from .celery import jbi_parse_hotfix
from .utils import jenkins_get_console, jenkins_get_job, jenkins_get_artifact
from .utils import jenkins_get_env
@ -25,12 +27,14 @@ logger = logging.getLogger(__name__)
@shared_task(ignore_result=True)
def jbi_get_artifact(jobname, buildnumber, artifact_info):
jenkins_get_artifact(jobname, buildnumber, artifact_info)
def jbi_get_artifact(jbi_id, jobname, buildnumber, artifact_info):
path = jenkins_get_artifact(jobname, buildnumber, artifact_info)
if basename(path) == settings.HOTFIX_ARTIFACT:
jbi_parse_hotfix.delay(jbi_id, path)
@shared_task(ignore_result=True)
def get_jbi_files(jobname, buildnumber):
def get_jbi_files(jbi_id, jobname, buildnumber):
jenkins_get_console(jobname, buildnumber)
jenkins_get_env(jobname, buildnumber)
path = jenkins_get_job(jobname, buildnumber)
@ -39,6 +43,6 @@ def get_jbi_files(jobname, buildnumber):
data = json.load(data_file)
logger.debug("job_info:%s", data)
for artifact in data['artifacts']:
jbi_get_artifact.delay(jobname, buildnumber, artifact)
jbi_get_artifact.delay(jbi_id, jobname, buildnumber, artifact)
else:
logger.debug("skip artifacts download for jobname: %s", jobname)

@ -8,7 +8,8 @@ FROM docker.mgm.sipwise.com/sipwise-jessie:latest
ENV REFRESHED_AT 2016-08-02
RUN apt-get update
RUN apt-get install --assume-yes python2.7 python2.7-dev python-distribute python-pip git screen
RUN apt-get install --assume-yes python2.7 python2.7-dev \
python-distribute python-pip python-debian git screen
# Get pip to download and install requirements:
COPY dev.txt test.txt common.txt /tmp/

Loading…
Cancel
Save