Store event id for buildsets in database

Having the zuul event id available in the database and also in the build
and buildset detail page makes debugging a lot easier.

Change-Id: Ia1e4aaf50fb28bb27cbcfcfc3b5a92bba88fc85e
This commit is contained in:
Simon Westphahl 2019-12-05 15:46:15 +01:00
parent 938ca7b8b4
commit e58e8224c0
7 changed files with 60 additions and 5 deletions

View File

@ -74,7 +74,7 @@ class TestSQLConnection(ZuulDBTestCase):
buildset_table = table_prefix + 'zuul_buildset' buildset_table = table_prefix + 'zuul_buildset'
build_table = table_prefix + 'zuul_build' build_table = table_prefix + 'zuul_build'
self.assertEqual(15, len(insp.get_columns(buildset_table))) self.assertEqual(16, len(insp.get_columns(buildset_table)))
self.assertEqual(10, len(insp.get_columns(build_table))) self.assertEqual(10, len(insp.get_columns(build_table)))
def test_sql_tables_created(self): def test_sql_tables_created(self):
@ -149,6 +149,7 @@ class TestSQLConnection(ZuulDBTestCase):
self.assertEqual( self.assertEqual(
'https://review.example.com/%d' % buildset0['change'], 'https://review.example.com/%d' % buildset0['change'],
buildset0['ref_url']) buildset0['ref_url'])
self.assertNotEqual(None, buildset0['event_id'])
buildset0_builds = conn.execute( buildset0_builds = conn.execute(
sa.sql.select([reporter.connection.zuul_build_table]).where( sa.sql.select([reporter.connection.zuul_build_table]).where(

View File

@ -30,7 +30,7 @@ class Buildset extends React.Component {
const { buildset } = this.props const { buildset } = this.props
const rows = [] const rows = []
const myColumns = [ const myColumns = [
'change', 'project', 'branch', 'pipeline', 'result', 'message' 'change', 'project', 'branch', 'pipeline', 'result', 'message', 'event_id'
] ]
const buildRows = [] const buildRows = []
const buildColumns = [ const buildColumns = [
@ -47,6 +47,9 @@ class Buildset extends React.Component {
</a> </a>
) )
} }
if (column === 'event_id') {
label = 'event id'
}
if (value) { if (value) {
rows.push({key: label, value: value}) rows.push({key: label, value: value})
} }

View File

@ -34,7 +34,7 @@ class Summary extends React.Component {
'job_name', 'result', 'buildset', 'voting', 'job_name', 'result', 'buildset', 'voting',
'pipeline', 'start_time', 'end_time', 'duration', 'pipeline', 'start_time', 'end_time', 'duration',
'project', 'branch', 'change', 'patchset', 'oldrev', 'newrev', 'project', 'branch', 'change', 'patchset', 'oldrev', 'newrev',
'ref', 'new_rev', 'ref_url', 'log_url'] 'ref', 'new_rev', 'ref_url', 'log_url', 'event_id']
if (!build.buildset) { if (!build.buildset) {
// Safely handle missing buildset information // Safely handle missing buildset information
@ -75,6 +75,9 @@ class Summary extends React.Component {
if (column === 'ref_url') { if (column === 'ref_url') {
label = 'ref url' label = 'ref url'
} }
if (column === 'event_id') {
label = 'event id'
}
if (value) { if (value) {
rows.push({key: label, value: value}) rows.push({key: label, value: value})
} }

View File

@ -0,0 +1,39 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""add event id column
Revision ID: 5f183546b39c
Revises: e0eda5d09eae
Create Date: 2019-12-05 13:33:30.155447
"""
# revision identifiers, used by Alembic.
revision = '5f183546b39c'
down_revision = 'e0eda5d09eae'
branch_labels = None
depends_on = None
from alembic import op
import sqlalchemy as sa
def upgrade(table_prefix=''):
op.add_column(
table_prefix + "zuul_buildset",
sa.Column("event_id", sa.String(255), nullable=True)
)
def downgrade():
raise Exception("Downgrades not supported")

View File

@ -58,8 +58,8 @@ class DatabaseSession(object):
def getBuilds(self, tenant=None, project=None, pipeline=None, def getBuilds(self, tenant=None, project=None, pipeline=None,
change=None, branch=None, patchset=None, ref=None, change=None, branch=None, patchset=None, ref=None,
newrev=None, uuid=None, job_name=None, voting=None, newrev=None, event_id=None, uuid=None, job_name=None,
node_name=None, result=None, provides=None, voting=None, node_name=None, result=None, provides=None,
limit=50, offset=0): limit=50, offset=0):
build_table = self.connection.zuul_build_table build_table = self.connection.zuul_build_table
@ -96,6 +96,7 @@ class DatabaseSession(object):
q = self.listFilter(q, buildset_table.c.patchset, patchset) q = self.listFilter(q, buildset_table.c.patchset, patchset)
q = self.listFilter(q, buildset_table.c.ref, ref) q = self.listFilter(q, buildset_table.c.ref, ref)
q = self.listFilter(q, buildset_table.c.newrev, newrev) q = self.listFilter(q, buildset_table.c.newrev, newrev)
q = self.listFilter(q, buildset_table.c.event_id, event_id)
q = self.listFilter(q, build_table.c.uuid, uuid) q = self.listFilter(q, build_table.c.uuid, uuid)
q = self.listFilter(q, build_table.c.job_name, job_name) q = self.listFilter(q, build_table.c.job_name, job_name)
q = self.listFilter(q, build_table.c.voting, voting) q = self.listFilter(q, build_table.c.voting, voting)
@ -275,6 +276,7 @@ class SQLConnection(BaseConnection):
result = sa.Column(sa.String(255)) result = sa.Column(sa.String(255))
message = sa.Column(sa.TEXT()) message = sa.Column(sa.TEXT())
tenant = sa.Column(sa.String(255)) tenant = sa.Column(sa.String(255))
event_id = sa.Column(sa.String(255), nullable=True)
def createBuild(self, *args, **kw): def createBuild(self, *args, **kw):
session = orm.session.Session.object_session(self) session = orm.session.Session.object_session(self)

View File

@ -37,6 +37,10 @@ class SQLReporter(BaseReporter):
log.warning("SQL reporter (%s) is disabled ", self) log.warning("SQL reporter (%s) is disabled ", self)
return return
event_id = None
if item.event is not None:
event_id = getattr(item.event, "zuul_event_id", None)
with self.connection.getSession() as db: with self.connection.getSession() as db:
db_buildset = db.createBuildSet( db_buildset = db.createBuildSet(
uuid=item.current_build_set.uuid, uuid=item.current_build_set.uuid,
@ -52,6 +56,7 @@ class SQLReporter(BaseReporter):
zuul_ref=item.current_build_set.ref, zuul_ref=item.current_build_set.ref,
ref_url=item.change.url, ref_url=item.change.url,
result=item.current_build_set.result, result=item.current_build_set.result,
event_id=event_id,
message=self._formatItemReport(item, with_jobs=False), message=self._formatItemReport(item, with_jobs=False),
) )
for job in item.getJobs(): for job in item.getJobs():

View File

@ -833,6 +833,7 @@ class ZuulWebAPI(object):
'ref': buildset.ref, 'ref': buildset.ref,
'newrev': buildset.newrev, 'newrev': buildset.newrev,
'ref_url': buildset.ref_url, 'ref_url': buildset.ref_url,
'event_id': buildset.event_id,
'buildset': { 'buildset': {
'uuid': buildset.uuid, 'uuid': buildset.uuid,
}, },
@ -909,6 +910,7 @@ class ZuulWebAPI(object):
'ref': buildset.ref, 'ref': buildset.ref,
'newrev': buildset.newrev, 'newrev': buildset.newrev,
'ref_url': buildset.ref_url, 'ref_url': buildset.ref_url,
'event_id': buildset.event_id,
} }
if builds: if builds:
ret['builds'] = [] ret['builds'] = []