| .. |
| SPDX-FileCopyrightText: © 2020 Open Networking Foundation <support@opennetworking.org> |
| SPDX-License-Identifier: Apache-2.0 |
| |
| Static Jenkins Site Generator (SJSG) |
| ==================================== |
| |
| To-Do |
| ----- |
| |
| scrape.yaml: |
| |
| - Add more metadata (links, specs, etc.) |
| |
| templates: |
| |
| - Organization of results by metadata (ex: list all products by a |
| Vendor, all products by Type, etc) |
| |
| static files: |
| |
| - Add images of products |
| |
| buildcollector.py: |
| |
| - Regex support in filters |
| - Use correct functions to build file paths, not just string concat |
| |
| siterender.py: |
| |
| - ? |
| |
| Theory of Operation |
| ------------------- |
| |
| This tool has two parts: |
| |
| 1. ``buildcollector.py``, which reads a configuration file containing metadata |
| and describing Jenkins jobs, then retrieves information about those jobs |
| from the Jenkins API and stores that metadata, extracted data, and job |
| artifacts in directory structure. |
| |
| 2. ``siterender.py``, which reads the data from the directory structure and |
| builds static HTML site using Jinja2 templates. |
| |
| Running the scripts |
| ------------------- |
| |
| Make sure you have a working Python 3.6 or later instance, and ``virtualenv`` |
| installed. |
| |
| Run ``make site``. Scrape and render will both be run, and site will be |
| generated in the ``site/`` subdirectory. |
| |
| Run ``make help`` for information on other Makefile targets. |
| |
| Changing the look and feel of the Site |
| -------------------------------------- |
| |
| Modify the templates in ``templates/``. These are `Jinja2 |
| <https://jinja.palletsprojects.com/en/2.11.x/templates/>`_ format files. |
| |
| Static content is kept in ``static/``, and is copied into ``site/`` as a part |
| of the site render. |
| |
| To view the site locally, run ``make serve``, then use a web browser to go to |
| `http://localhost:8000 <http://localhost:8000>`_. |
| |
| Scrape Files |
| ------------ |
| |
| For each Jenkins job you want to scrape, you need to create a Scrape File. The |
| default scrape file is at ``scrape.yaml``. All data is required unless |
| speicifed as optional. |
| |
| This file is in YAML format, and contains information about the job(s) to |
| scrape. You can put multiple YAML documents within one file, separated with the |
| ``---`` document start line. |
| |
| These keys are required in the Scrape File: |
| |
| - ``product_name`` (string): Human readable product name |
| |
| - ``onf_project`` (string): ONF Project name |
| |
| - ``jenkins_jobs`` (list): list of groups of jobs |
| |
| - ``group`` (string): Name of group of jobs. Used mainly for maintaining |
| version separation |
| |
| - ``jenkins_url`` (string): Bare URL to the Jenkins instance for this group - |
| ex: ``https://jenkins.opencord.org`` |
| |
| - ``credentials`` (string, optional): Path to a credentials YAML file with |
| Jenkins API Tokens, if trying to access private jobs on the server. See |
| ``credentials.yaml.example`` for examples. |
| |
| - ``jobs`` (list of dicts): List of jobs to be pulled for this |
| |
| - ``name`` (string): Job name in Jenkins |
| |
| - ``name_override`` (string, optional): Override for name shown in the |
| output, used to keep job names private. |
| |
| - ``extract`` (dictionary): Name keys and JSONPath values, which are extracted |
| from the individual Job output JSON files and put in the output. |
| |
| - ``filter`` (dictionary, optional): Set of name keys and literal values used to filter |
| which builds are included for this product. After the ``extract`` step is |
| run, the for each key in filter the extracted values are compared with the |
| literal value, and if they match, then the build is retained. |
| |
| The JSONpath library used is `jsonpath-ng |
| <https://github.com/h2non/jsonpath-ng>`_, which seems to be the most regularly |
| maintained Python implementation. |
| |
| Arbitrary variables can also be included in the Scrape File, and will be merged |
| into to the output of every JSON file generated by the collector. This can and |
| should include "marketing friendly" information used to modify the Jinja2 |
| output - for example, links to product pages, names for static images, etc. |
| |
| The Scrape File also be used to set default values that are only replaced when |
| extracted data isn't available - when a JSONPath query returns no results, it |
| will contain an empty list, which is ignored in the merge. If an extracted |
| value is found, that value will replace the value given in the Scrape File. |
| |
| Design Consideration |
| -------------------- |
| |
| Metadata addition is needed to avoid adding that metadata to the Jenkins jobs. |
| |
| Filesystem storage was used because of arbitrary artifacts, and to reduce the |
| number of API calls, especially when filtering the same list of builds with |
| multiple products. Raw job output is kept in ``jobs/`` by default. Processed |
| job output is kept in ``builds/`` on a per-product basis. |
| |
| Jenkins infrastructure is always changing: |
| |
| - Jobs are Added, Renamed, or Removed |
| - Naming schemes may not match up with marketing names |
| - Data should be retained even if the job is deleted |
| - Fields will differ between products and projects |
| |
| Tests |
| ----- |
| |
| ``make test`` will check YAML, static check python, and run tox tests. |
| Currently there are no unit tests, but everything is in place to add them. |