commit:     2dc7f260e99203e183d352601c6a479ae482697b
Author:     Magnus Granberg <zorry <AT> gentoo <DOT> org>
AuthorDate: Sat Feb 20 18:39:19 2021 +0000
Commit:     Magnus Granberg <zorry <AT> gentoo <DOT> org>
CommitDate: Sat Feb 20 18:39:19 2021 +0000
URL:        
https://gitweb.gentoo.org/proj/tinderbox-cluster.git/commit/?id=2dc7f260

Add RunEmerge and CheckEmergeLogs

Signed-off-by: Magnus Granberg <zorry <AT> gentoo.org>

 buildbot_gentoo_ci/config/buildfactorys.py |  21 +---
 buildbot_gentoo_ci/db/model.py             |  11 ++
 buildbot_gentoo_ci/db/projects.py          |  23 +++++
 buildbot_gentoo_ci/steps/builders.py       | 155 ++++++++++++++++++++++++++++-
 buildbot_gentoo_ci/steps/update_db.py      |   2 +-
 5 files changed, 192 insertions(+), 20 deletions(-)

diff --git a/buildbot_gentoo_ci/config/buildfactorys.py 
b/buildbot_gentoo_ci/config/buildfactorys.py
index 2916847..3c77762 100644
--- a/buildbot_gentoo_ci/config/buildfactorys.py
+++ b/buildbot_gentoo_ci/config/buildfactorys.py
@@ -115,31 +115,20 @@ def run_build_request():
     # run --regen if needed on repo
     # update packages before any tests
     # run pretend on packages update on worker
-    shell_commad_list = [
-                    'emerge',
-                    '-uDNv',
-                    '--changed-deps',
-                    '--changed-use',
-                    '--pretend',
-                    '@world'
-                    ]
-    f.addStep(buildbot_steps.SetPropertyFromCommandNewStyle(
-                        command=shell_commad_list,
-                        strip=True,
-                        extract_fn=builders.PersOutputOfEmerge,
-                        workdir='/'
-                        ))
+    f.addStep(builders.RunEmerge(step='pre-update'))
     #   look at the log to see if we need to do stuff
     #   run update package on worker
+    f.addStep(builders.RunEmerge(step='update'))
     #   check log
     # run pretend @preserved-rebuild if needed
-    #   look at the log to see if we need to do stuff
-    #   run @preserved-rebuild
+    f.addStep(builders.RunEmerge(step='preserved-libs'))
     #   check log
     # run depclean if set
     #   depclean pretend
+    f.addStep(builders.RunEmerge(step='pre-depclean'))
     #   look at the log to see if we need to do stuff
     #   depclean
+    f.addStep(builders.RunEmerge(step='depclean'))
     #   check log
     # setup make.conf if build id has changes make.conf as dict from 
SetMakeConf
     # setup package.* env if build id has changes

diff --git a/buildbot_gentoo_ci/db/model.py b/buildbot_gentoo_ci/db/model.py
index 4c5e04c..0a2c145 100644
--- a/buildbot_gentoo_ci/db/model.py
+++ b/buildbot_gentoo_ci/db/model.py
@@ -161,6 +161,17 @@ class Model(base.DBConnectorComponent):
         sa.Column('value', sa.String(255), nullable=False),
     )
 
+    projects_emerge_options = sautils.Table(
+        "projects_emerge_options", metadata,
+        sa.Column('id', sa.Integer, primary_key=True),
+        sa.Column('project_uuid', sa.String(36),
+                  sa.ForeignKey('projects.uuid', ondelete='CASCADE'),
+                  nullable=False),
+        sa.Column('oneshot', sa.Boolean, default=True),
+        sa.Column('depclean', sa.Boolean, default=True),
+        sa.Column('preserved_libs', sa.Boolean, default=True),
+    )
+
     keywords = sautils.Table(
         "keywords", metadata,
         # unique uuid per keyword

diff --git a/buildbot_gentoo_ci/db/projects.py 
b/buildbot_gentoo_ci/db/projects.py
index 1f19a00..eb8f727 100644
--- a/buildbot_gentoo_ci/db/projects.py
+++ b/buildbot_gentoo_ci/db/projects.py
@@ -130,6 +130,20 @@ class 
ProjectsConnectorComponent(base.DBConnectorComponent):
         res = yield self.db.pool.do(thd)
         return res
 
+    @defer.inlineCallbacks
+    def getProjectEmergeOptionsByUuid(self, uuid):
+        def thd(conn):
+            tbl = self.db.model.projects_emerge_options
+            q = tbl.select()
+            q = q.where(tbl.c.project_uuid == uuid)
+            res = conn.execute(q)
+            row = res.fetchone()
+            if not row:
+                return None
+            return self._row2dict_projects_emerge_options(conn, row)
+        res = yield self.db.pool.do(thd)
+        return res
+
     def _row2dict(self, conn, row):
         return dict(
             uuid=row.uuid,
@@ -170,3 +184,12 @@ class 
ProjectsConnectorComponent(base.DBConnectorComponent):
             value=row.value,
             build_id=0
             )
+
+    def _row2dict_projects_emerge_options(self, conn, row):
+        return dict(
+            id=row.id,
+            project_uuid=row.project_uuid,
+            oneshot=row.oneshot,
+            depclean=row.depclean,
+            preserved_libs=row.preserved_libs
+            )

diff --git a/buildbot_gentoo_ci/steps/builders.py 
b/buildbot_gentoo_ci/steps/builders.py
index 862f0d4..c0567c1 100644
--- a/buildbot_gentoo_ci/steps/builders.py
+++ b/buildbot_gentoo_ci/steps/builders.py
@@ -15,13 +15,15 @@ from buildbot.plugins import steps
 def PersOutputOfEmerge(rc, stdout, stderr):
     emerge_output = {}
     emerge_output['rc'] = rc
+    emerge_output['preserved_libs'] = False
+    emerge_output['depclean'] = False
     package_dict = {}
     print(stderr)
+    # split the lines
     for line in stdout.split('\n'):
         # package list
         subdict = {}
-        if line.startswith('[ebuild'):
-            # split the line
+        if line.startswith('[ebuild') or line.startswith('[binary'):
             # if binaries
             if line.startswith('[ebuild'):
                 subdict['binary'] = False
@@ -57,7 +59,18 @@ def PersOutputOfEmerge(rc, stdout, stderr):
                 subdict['python_targets'] = None
             # CPU_FLAGS_X86 list
             package_dict[cpv] = subdict
-        #FIXME: Handling of stderr output
+        if line.startswith('>>>'):
+            #FIXME: Handling of >>> output
+            pass
+        if line.startswith('!!!'):
+            #FIXME: Handling of !!! output
+            if line.startswith('!!! existing preserved libs'):
+                pass
+        #FIXME: Handling of depclean output dict of packages that get removed 
or saved
+    # split the lines
+    #FIXME: Handling of stderr output
+    for line in stderr.split('\n'):
+        pass
     return {
         'emerge_output' : emerge_output
         }
@@ -154,6 +167,8 @@ class SetupPropertys(BuildStep):
         print(projectrepository_data)
         project_data = yield 
self.gentooci.db.projects.getProjectByUuid(projectrepository_data['project_uuid'])
         self.setProperty('project_data', project_data, 'project_data')
+        self.setProperty('preserved_libs', False, 'preserved-libs')
+        self.setProperty('depclean', False, 'depclean')
         return SUCCESS
 
 class SetMakeProfile(BuildStep):
@@ -311,6 +326,7 @@ class SetMakeConf(BuildStep):
                 makeconf_variable_list.append('--rebuilt-binaries=y')
                 makeconf_variable_list.append('--usepkg=y')
                 makeconf_variable_list.append('--binpkg-respect-use=y')
+                makeconf_variable_list.append('--binpkg-changed-deps=y')
                 makeconf_variable_list.append('--nospinner')
                 makeconf_variable_list.append('--color=n')
                 makeconf_variable_list.append('--ask=n')
@@ -366,3 +382,136 @@ class SetMakeConf(BuildStep):
                                 workdir='/etc/portage/')
             ])
         return SUCCESS
+
+class RunEmerge(BuildStep):
+
+    name = 'RunEmerge'
+    description = 'Running'
+    descriptionDone = 'Ran'
+    descriptionSuffix = None
+    haltOnFailure = True
+    flunkOnFailure = True
+
+    def __init__(self, step=None,**kwargs):
+        self.step = step
+        super().__init__(**kwargs)
+
+    @defer.inlineCallbacks
+    def run(self):
+        self.gentooci = 
self.master.namedServices['services'].namedServices['gentooci']
+        project_data = self.getProperty('project_data')
+        projects_emerge_options = yield 
self.gentooci.db.projects.getProjectEmergeOptionsByUuid(project_data['uuid'])
+        shell_commad_list = [
+                    'emerge',
+                    '-v'
+                    ]
+        aftersteps_list = []
+        if self.step == 'pre-update':
+            shell_commad_list.append('-uDN')
+            shell_commad_list.append('--changed-deps')
+            shell_commad_list.append('--changed-use')
+            shell_commad_list.append('--pretend')
+            shell_commad_list.append('@world')
+            aftersteps_list.append(
+                steps.SetPropertyFromCommandNewStyle(
+                        command=shell_commad_list,
+                        strip=True,
+                        extract_fn=PersOutputOfEmerge,
+                        workdir='/'
+                ))
+            aftersteps_list.append(CheckEmergeLogs('pre-update'))
+
+        if self.step == 'update':
+            shell_commad_list.append('-uDNq')
+            shell_commad_list.append('--changed-deps')
+            shell_commad_list.append('--changed-use')
+            shell_commad_list.append('@world')
+            aftersteps_list.append(
+                steps.SetPropertyFromCommandNewStyle(
+                        command=shell_commad_list,
+                        strip=True,
+                        extract_fn=PersOutputOfEmerge,
+                        workdir='/',
+                        timeout=None
+                ))
+            aftersteps_list.append(CheckEmergeLogs('update'))
+
+        if self.step == 'preserved-libs' and 
self.getProperty('preserved_libs'):
+            shell_commad_list.append('-q')
+            shell_commad_list.append('@preserved-rebuild')
+            aftersteps_list.append(
+                steps.SetPropertyFromCommandNewStyle(
+                        command=shell_commad_list,
+                        strip=True,
+                        extract_fn=PersOutputOfEmerge,
+                        workdir='/',
+                        timeout=None
+                ))
+            aftersteps_list.append(CheckEmergeLogs('preserved-libs'))
+            self.setProperty('preserved_libs', False, 'preserved-libs')
+
+        if self.step == 'pre-depclean' and projects_emerge_options['depclean']:
+            shell_commad_list.append('--pretend')
+            shell_commad_list.append('--depclean')
+            aftersteps_list.append(
+                steps.SetPropertyFromCommandNewStyle(
+                        command=shell_commad_list,
+                        strip=True,
+                        extract_fn=PersOutputOfEmerge,
+                        workdir='/'
+                ))
+            aftersteps_list.append(CheckEmergeLogs('depclean'))
+            self.setProperty('depclean', False, 'depclean')
+
+        if self.step == 'depclean' and self.getProperty('depclean') and 
projects_emerge_options['depclean']:
+            shell_commad_list.append('-q')
+            shell_commad_list.append('--depclean')
+            aftersteps_list.append(
+                steps.SetPropertyFromCommandNewStyle(
+                        command=shell_commad_list,
+                        strip=True,
+                        extract_fn=PersOutputOfEmerge,
+                        workdir='/'
+                ))
+            aftersteps_list.append(CheckEmergeLogs('depclean'))
+        if not self.step is None:
+            yield self.build.addStepsAfterCurrentStep(aftersteps_list)
+        return SUCCESS
+
+class CheckEmergeLogs(BuildStep):
+
+    name = 'CheckLogs'
+    description = 'Running'
+    descriptionDone = 'Ran'
+    descriptionSuffix = None
+    haltOnFailure = True
+    flunkOnFailure = True
+
+    def __init__(self, step=None,**kwargs):
+        self.step = step
+        super().__init__(**kwargs)
+
+    @defer.inlineCallbacks
+    def run(self):
+        self.gentooci = 
self.master.namedServices['services'].namedServices['gentooci']
+        project_data = self.getProperty('project_data')
+        projects_emerge_options = yield 
self.gentooci.db.projects.getProjectEmergeOptionsByUuid(project_data['uuid'])
+        emerge_output = self.getProperty('emerge_output')
+        shell_commad_list = [
+                    'emerge',
+                    '-v'
+                    ]
+        aftersteps_list = []
+
+        #FIXME: Prosees the logs and do stuff
+        # preserved-libs
+        if emerge_output['preserved_libs'] and 
projects_emerge_options['preserved_libs']:
+            self.setProperty('preserved_libs', True, 'preserved-libs')
+        # depclean
+        # FIXME: check if don't remove needed stuff.
+        if emerge_output['depclean'] and projects_emerge_options['depclean']:
+            self.setProperty('depclean', True, 'depclean')
+
+        if not self.step is None:
+            yield self.build.addStepsAfterCurrentStep(aftersteps_list)
+        return SUCCESS

diff --git a/buildbot_gentoo_ci/steps/update_db.py 
b/buildbot_gentoo_ci/steps/update_db.py
index ee2ba88..3f20cb9 100644
--- a/buildbot_gentoo_ci/steps/update_db.py
+++ b/buildbot_gentoo_ci/steps/update_db.py
@@ -124,7 +124,7 @@ class CheckCPVGentooCiProject(BuildStep):
     def run(self):
         #self.cpv_changes = self.getProperty("cpv_changes")
         self.cpv_changes = []
-        self.cpv_changes.append('dev-python/django-3.1.5')
+        self.cpv_changes.append('dev-python/django-3.1.7')
         self.cpv_changes.append('dev-python/scrypt-0.8.16')
         print(self.cpv_changes)
         print(self.getProperty("repository_data"))

Reply via email to