diff --git a/.gitignore b/.gitignore index 529ec7d8c9..46f27a2588 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ /.project /.pydevproject *.egg +specs/output diff --git a/jenkins/jobs/projects.yaml b/jenkins/jobs/projects.yaml index b16677234b..bc6d93834e 100644 --- a/jenkins/jobs/projects.yaml +++ b/jenkins/jobs/projects.yaml @@ -2034,6 +2034,7 @@ jobs: - gate-{name}-pep8 - gate-{name}-bashate + - generate-specs-site-jobs - project: name: puppet-github diff --git a/jenkins/jobs/specs-jobs.yaml b/jenkins/jobs/specs-jobs.yaml index cf01876d95..616b10ff25 100644 --- a/jenkins/jobs/specs-jobs.yaml +++ b/jenkins/jobs/specs-jobs.yaml @@ -32,3 +32,45 @@ - gate-{name}-docs - gate-{name}-python27 - '{name}-publish-specs' + + +- builder: + name: generate-specs-site + + builders: + - revoke-sudo + - gerrit-git-prep + - tox: + envlist: specs + +- job: + name: check-generate-specs-site + description: Render the specs sites templates without publishing them. + node: 'bare-precise || bare-trusty' + + builders: + - generate-specs-site + +- job: + name: publish-specs-site + description: Render the specs sites templates and publish them. + node: 'bare-precise || bare-trusty' + + builders: + - generate-specs-site + + publishers: + - scp: + site: 'static.openstack.org' + files: + - target: 'specs/' + source: '$ZUUL_PROJECT/specs/output/**' + keep-hierarchy: true + copy-after-failure: false + - console-log + +- job-group: + name: generate-specs-site-jobs + jobs: + - check-generate-specs-site + - publish-specs-site diff --git a/specs/generate_specs_site.py b/specs/generate_specs_site.py new file mode 100755 index 0000000000..77780faf43 --- /dev/null +++ b/specs/generate_specs_site.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python +# +# 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. +"""Read the specs.yaml file and generate the index.html and specs.opml files. +""" + +from __future__ import print_function + +import argparse +import os + +import jinja2 +import yaml + + +def render_template(template_filename, output_filename, template_context): + with open(template_filename, 'r') as f: + template = jinja2.Template(f.read()) + print('Writing %r' % output_filename) + with open(output_filename, 'w') as f: + f.write(template.render(**template_context)) + + +parser = argparse.ArgumentParser() +parser.add_argument('-v', '--verbose', + dest='verbose', + default=False, + action='store_true', + ) +parser.add_argument( + 'infile', + help='Path to specs/specs.yaml', +) +args = parser.parse_args() + +print('Reading project data from %r' % args.infile) +infile = yaml.load(open(args.infile, 'r')) +template_path = os.path.dirname(args.infile) + +template_context = { + 'projects': infile['projects'], + 'programs': infile['programs'], + 'all': infile['projects'] + infile['programs'], +} + +outdir = os.path.join(template_path, 'output') +if not os.path.exists(outdir): + os.makedirs(outdir) + + +for template_name, filename in [('index.html.tmpl', 'index.html'), + ('specs.opml.tmpl', 'specs.opml')]: + render_template(os.path.join(template_path, template_name), + os.path.join(outdir, filename), + template_context) diff --git a/specs/index.html b/specs/index.html.tmpl similarity index 54% rename from specs/index.html rename to specs/index.html.tmpl index 83b0d5e285..c2f63fdbc1 100644 --- a/specs/index.html +++ b/specs/index.html.tmpl @@ -113,102 +113,14 @@