jenkins-bot has submitted this change and it was merged.

Change subject: Use generic phpunit job for extensions with dependencies
......................................................................


Use generic phpunit job for extensions with dependencies

We use a custom zuul function that stores the mapping of extensions to
their dependencies and adds them to an environment variable when the job
is triggered.

Currently only configured for the "Thanks" extension for testing.

Bug: T96690
Change-Id: I37c92630fa7809caeead0c15353aaad1a399eb17
---
M jjb/mediawiki-extensions.yaml
M tests/fakes.py
A tests/test_zuul_ext_dependencies.py
A zuul/ext_dependencies.py
M zuul/layout.yaml
5 files changed, 112 insertions(+), 0 deletions(-)

Approvals:
  Legoktm: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/jjb/mediawiki-extensions.yaml b/jjb/mediawiki-extensions.yaml
index 07d282f..750558a 100644
--- a/jjb/mediawiki-extensions.yaml
+++ b/jjb/mediawiki-extensions.yaml
@@ -90,6 +90,7 @@
              $ZUUL_PROJECT
      - mw-install-mysql
      - shell: "echo $ZUUL_PROJECT > src/extensions_load.txt"
+     - shell: "echo -e $EXT_DEPENDENCIES >> src/extensions_load.txt"
      - mw-apply-settings
      - mw-run-update-script
 
diff --git a/tests/fakes.py b/tests/fakes.py
index 9499843..a2526fa 100644
--- a/tests/fakes.py
+++ b/tests/fakes.py
@@ -12,3 +12,9 @@
 
     def __init__(self, *args, **kwargs):
         self.change = FakeChange(*args, **kwargs)
+
+
+class FakeJob(object):
+
+    def __init__(self, name):
+        self.name = name
diff --git a/tests/test_zuul_ext_dependencies.py 
b/tests/test_zuul_ext_dependencies.py
new file mode 100644
index 0000000..9269b54
--- /dev/null
+++ b/tests/test_zuul_ext_dependencies.py
@@ -0,0 +1,50 @@
+import os
+import unittest
+
+from fakes import FakeJob
+
+dependencies = {}  # defined for flake8
+set_ext_dependencies = None  # defined for flake8
+# Import function
+execfile(os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    '../zuul/ext_dependencies.py'))
+
+
+class TestExtDependencies(unittest.TestCase):
+    def assertHasDependencies(self, params):
+        self.assertIn('EXT_DEPENDENCIES', params)
+
+    def assertMissingDependencies(self, params):
+        self.assertNotIn('EXT_DEPENDENCIES', params)
+
+    def fetch_dependencies(self, job_name=None, project=None):
+        if project:
+            params = {'ZUUL_PROJECT': project}
+        else:
+            params = {'ZUUL_PROJECT': 'mediawiki/extensions/Example'}
+        job = FakeJob(job_name if job_name else 'mwext-testextension-hhvm')
+        set_ext_dependencies(None, job, params)
+        return params
+
+    def test_resolvable_dependencies(self):
+        """verifies that we can resolve all of the dependencies"""
+        for ext_name in dependencies:
+            self.assertHasDependencies(self.fetch_dependencies(
+                project='mediawiki/extensions/' + ext_name))
+
+    def test_job_name(self):
+        self.assertHasDependencies(self.fetch_dependencies(
+            job_name='mwext-testextension-hhvm'))
+        self.assertMissingDependencies(self.fetch_dependencies(
+            job_name='mediawiki-core-phplint'))
+
+    def test_zuul_project_name(self):
+        self.assertHasDependencies(self.fetch_dependencies(
+            project='mediawiki/extensions/Example'))
+        self.assertMissingDependencies(self.fetch_dependencies(
+            project='mediawiki/extensions'))
+        self.assertMissingDependencies(self.fetch_dependencies(
+            project='mediawiki/extensions/Example/vendor'))
+        self.assertMissingDependencies(self.fetch_dependencies(
+            project='foo/bar/baz'))
diff --git a/zuul/ext_dependencies.py b/zuul/ext_dependencies.py
new file mode 100644
index 0000000..e4a5b13
--- /dev/null
+++ b/zuul/ext_dependencies.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python2
+
+dependencies = {
+    'Flow': ['AbuseFilter', 'CheckUser', 'Mantle',
+             'MobileFrontend', 'SpamBlacklist', 'Echo', 'EventLogging'],
+    'Thanks': ['Echo', 'Flow'],
+}
+
+
+def set_ext_dependencies(item, job, params):
+    """
+    Reads dependencies from the yaml file and adds them as a parameter
+    :type item: zuul.model.QueueItem
+    :type job: zuul.model.Job
+    :type params: dict
+    """
+    if not job.name.startswith(('mwext-testextension', 'mwext-qunit')):
+        return
+
+    if not params['ZUUL_PROJECT'].startswith('mediawiki/extensions/'):
+        return
+    # mediawiki/extensions/FooBar
+    split = params['ZUUL_PROJECT'].split('/')
+    if len(split) != 3:
+        # mediawiki/extensions/FooBar/blah
+        # mediawiki/extensions
+        return
+
+    # FooBar
+    ext_name = split[-1]
+    deps = get_dependencies(ext_name, dependencies)
+    # Export with a literal \n character and have bash expand it later
+    params['EXT_DEPENDENCIES'] = '\\n'.join(sorted(deps))
+
+
+def get_dependencies(ext_name, mapping):
+    """
+    Get the full set of dependencies required by an extension
+    :param ext_name: extension name
+    :param mapping: mapping of extensions to their dependencies
+    :return: set of dependencies, recursively processed
+    """
+    deps = set()
+    if ext_name in mapping:
+        for dep in mapping[ext_name]:
+            deps.add(dep)
+            # TODO: Max recursion limit?
+            deps = deps.union(get_dependencies(dep, mapping))
+    return deps
diff --git a/zuul/layout.yaml b/zuul/layout.yaml
index 0b02314..b973fae 100644
--- a/zuul/layout.yaml
+++ b/zuul/layout.yaml
@@ -18,6 +18,7 @@
 
 includes:
   - python-file: 'doc_functions.py'
+  - python-file: 'ext_dependencies.py'
 
 pipelines:
   # Terminology:
@@ -501,6 +502,8 @@
 
   - name: ^.*-publish$
     parameter-function: set_doc_subpath
+  - name: ^mwext-(testextension|qunit).*?
+    parameter-function: set_ext_dependencies
 
   # Experiment for analytics/kraken repository
   - name: analytics-kraken
@@ -6531,6 +6534,9 @@
       - name: extension-qunit-and-mobile
       - name: extension-unittests
       - name: npm
+    experimental:
+      - mwext-testextension-zend
+      - mwext-testextension-hhvm
 
   - name: mediawiki/extensions/TimedMediaHandler
     template:

-- 
To view, visit https://gerrit.wikimedia.org/r/207132
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I37c92630fa7809caeead0c15353aaad1a399eb17
Gerrit-PatchSet: 3
Gerrit-Project: integration/config
Gerrit-Branch: master
Gerrit-Owner: Legoktm <legoktm.wikipe...@gmail.com>
Gerrit-Reviewer: Hashar <has...@free.fr>
Gerrit-Reviewer: Legoktm <legoktm.wikipe...@gmail.com>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to