Add tox checks
These were copied from the upstream checks: https://git.openstack.org/cgit/openstack-infra/project-config/tree/ layout-checks.py was modified to skip check_merge_template()
This commit is contained in:
parent
d35f5072f4
commit
b933e7945b
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
.DS_Store
|
||||
*.swp
|
||||
*~
|
||||
*.pyc
|
||||
.tox/
|
||||
.test/
|
||||
/.project
|
||||
/.pydevproject
|
||||
*.egg
|
||||
specs/output
|
4
.gitreview
Normal file
4
.gitreview
Normal file
@ -0,0 +1,4 @@
|
||||
[gerrit]
|
||||
host=review.openstack.org
|
||||
port=29418
|
||||
project=openstack-infra/project-config-example.git
|
2
test-requirements.txt
Normal file
2
test-requirements.txt
Normal file
@ -0,0 +1,2 @@
|
||||
hacking>=0.10,<0.11
|
||||
bashate>=0.2
|
67
tools/jenkins-projects-checks.py
Executable file
67
tools/jenkins-projects-checks.py
Executable file
@ -0,0 +1,67 @@
|
||||
#! /usr/bin/env python
|
||||
|
||||
# Copyright 2014 SUSE Linux Products GmbH
|
||||
#
|
||||
# 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.
|
||||
|
||||
import sys
|
||||
|
||||
|
||||
def normalize(s):
|
||||
"Normalize string for comparison."
|
||||
return s.lower().replace("_", "-")
|
||||
|
||||
|
||||
def check_sections():
|
||||
"""Check that the projects are in alphabetical order per section
|
||||
and that indenting looks correct"""
|
||||
|
||||
# Note that the file has different sections and we need to check
|
||||
# entries within these sections only
|
||||
errors = False
|
||||
last = ""
|
||||
count = 1
|
||||
for line in open('jenkins/jobs/projects.yaml', 'r'):
|
||||
if line.startswith('# Section:'):
|
||||
last = ""
|
||||
section = line[10:].strip()
|
||||
print("Checking section '%s'" % section)
|
||||
if line.startswith(' name: '):
|
||||
i = line.find(' name: ')
|
||||
current = line[i + 7:].strip()
|
||||
if normalize(last) > normalize(current):
|
||||
print(" Wrong alphabetical order: %(last)s, %(current)s" %
|
||||
{"last": last, "current": current})
|
||||
errors = True
|
||||
last = current
|
||||
if (len(line) - len(line.lstrip(' '))) % 2 != 0:
|
||||
print("Line %(count)s not indented by multiple of 2:\n\t%(line)s" %
|
||||
{"count": count, "line": line})
|
||||
errors = True
|
||||
|
||||
count = count+1
|
||||
|
||||
return errors
|
||||
|
||||
|
||||
def check_all():
|
||||
errors = check_sections()
|
||||
|
||||
if errors:
|
||||
print("Found errors in jenkins/jobs/projects.yaml!")
|
||||
else:
|
||||
print("No errors found in jenkins/jobs/projects.yaml!")
|
||||
return errors
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(check_all())
|
105
tools/layout-checks.py
Executable file
105
tools/layout-checks.py
Executable file
@ -0,0 +1,105 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# Copyright 2014 OpenStack Foundation
|
||||
# Copyright 2014 SUSE Linux Products GmbH
|
||||
#
|
||||
# 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.
|
||||
|
||||
import yaml
|
||||
import sys
|
||||
|
||||
layout = yaml.load(open('zuul/layout.yaml'))
|
||||
|
||||
|
||||
def check_merge_template():
|
||||
"""Check that each job has a merge-check template."""
|
||||
|
||||
errors = False
|
||||
print("\nChecking for usage of merge template")
|
||||
print("====================================")
|
||||
for project in layout['projects']:
|
||||
if project['name'] == 'z/tempest':
|
||||
continue
|
||||
try:
|
||||
correct = False
|
||||
for template in project['template']:
|
||||
if template['name'] == 'merge-check':
|
||||
correct = True
|
||||
if not correct:
|
||||
raise
|
||||
except:
|
||||
print("Project %s has no merge-check template" % project['name'])
|
||||
errors = True
|
||||
return errors
|
||||
|
||||
|
||||
def normalize(s):
|
||||
"Normalize string for comparison."
|
||||
return s.lower().replace("_", "-")
|
||||
|
||||
|
||||
def check_sections():
|
||||
"""Check that the projects are in alphabetical order per section."""
|
||||
|
||||
print("Checking sections for alphabetical order")
|
||||
print("========================================")
|
||||
# Note that the file has different sections and we need to sort
|
||||
# entries within these sections.
|
||||
errors = False
|
||||
# Skip all entries before the first section header
|
||||
firstEntry = True
|
||||
last = ""
|
||||
for line in open('zuul/layout.yaml', 'r'):
|
||||
if line.startswith('# Section:'):
|
||||
last = ""
|
||||
section = line[10:].strip()
|
||||
print("Checking section '%s'" % section)
|
||||
firstEntry = False
|
||||
if line.startswith(' - name: ') and not firstEntry:
|
||||
current = line[10:].strip()
|
||||
if (normalize(last) > normalize(current) and
|
||||
last != 'z/tempest'):
|
||||
print(" Wrong alphabetical order: %(last)s, %(current)s" %
|
||||
{"last": last, "current": current})
|
||||
errors = True
|
||||
last = current
|
||||
return errors
|
||||
|
||||
def check_formatting():
|
||||
errors = False
|
||||
count = 1
|
||||
|
||||
print("Checking indents")
|
||||
print("================")
|
||||
|
||||
for line in open('zuul/layout.yaml', 'r'):
|
||||
if (len(line) - len(line.lstrip(' '))) % 2 != 0:
|
||||
print("Line %(count)s not indented by multiple of 2:\n\t%(line)s" %
|
||||
{"count": count, "line": line})
|
||||
errors = True
|
||||
count = count + 1
|
||||
|
||||
return errors
|
||||
|
||||
def check_all():
|
||||
errors = check_sections()
|
||||
errors = check_formatting() or errors
|
||||
|
||||
if errors:
|
||||
print("\nFound errors in layout.yaml!")
|
||||
else:
|
||||
print("\nNo errors found in layout.yaml!")
|
||||
return errors
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(check_all())
|
4
tools/run-bashate.sh
Executable file
4
tools/run-bashate.sh
Executable file
@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
|
||||
ROOT=$(readlink -fn $(dirname $0)/.. )
|
||||
find $ROOT -not -wholename \*.tox/\* -and -not -wholename \*.test/\* -and \( -name \*.sh -or -name \*rc -or -name functions\* \) -print0 | xargs -0 bashate -v
|
54
tools/run-compare-xml.sh
Executable file
54
tools/run-compare-xml.sh
Executable file
@ -0,0 +1,54 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
# Copyright (c) 2012, AT&T Labs, Yun Mao <yunmao@gmail.com>
|
||||
# All Rights Reserved.
|
||||
# Copyright 2012 Hewlett-Packard Development Company, L.P.
|
||||
#
|
||||
# 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.
|
||||
|
||||
rm -fr .test
|
||||
mkdir .test
|
||||
cd .test
|
||||
/usr/zuul-env/bin/zuul-cloner -m ../tools/run-compare-clonemap.yaml --cache-dir /opt/git git://git.openstack.org openstack-infra/jenkins-job-builder
|
||||
cd jenkins-job-builder
|
||||
# These are $WORKSPACE/.test/jenkins-job-builder/.test/...
|
||||
mkdir -p .test/old/config
|
||||
mkdir -p .test/old/out
|
||||
mkdir -p .test/new/config
|
||||
mkdir -p .test/new/out
|
||||
cd ../..
|
||||
|
||||
GITHEAD=$(git rev-parse HEAD)
|
||||
|
||||
# First generate output from HEAD~1
|
||||
git checkout HEAD~1
|
||||
cp jenkins/jobs/* .test/jenkins-job-builder/.test/old/config
|
||||
|
||||
# Then use that as a reference to compare against HEAD
|
||||
git checkout $GITHEAD
|
||||
cp jenkins/jobs/* .test/jenkins-job-builder/.test/new/config
|
||||
|
||||
cd .test/jenkins-job-builder
|
||||
|
||||
tox -e compare-xml-old
|
||||
tox -e compare-xml-new
|
||||
|
||||
diff -r -N -u .test/old/out .test/new/out
|
||||
CHANGED=$? # 0 == same ; 1 == different ; 2 == error
|
||||
|
||||
echo
|
||||
echo "You are in detached HEAD mode. If you are a developer"
|
||||
echo "and not very familiar with git, you might want to do"
|
||||
echo "'git checkout branch-name' to go back to your branch."
|
||||
|
||||
exit $CHANGED
|
35
tools/run-layout.sh
Executable file
35
tools/run-layout.sh
Executable file
@ -0,0 +1,35 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
# Copyright 2013 OpenStack Foundation
|
||||
#
|
||||
# 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.
|
||||
|
||||
mkdir -p .test
|
||||
cd .test
|
||||
[ -d zuul ] || git clone https://git.openstack.org/openstack-infra/zuul --depth 1
|
||||
[ -d jenkins-job-builder ] || git clone https://git.openstack.org/openstack-infra/jenkins-job-builder --depth 1
|
||||
cd jenkins-job-builder
|
||||
# These are $WORKSPACE/.test/jenkins-job-builder/.test/...
|
||||
mkdir -p .test/new/config
|
||||
mkdir -p .test/new/out
|
||||
cd ../..
|
||||
|
||||
cp jenkins/jobs/* .test/jenkins-job-builder/.test/new/config
|
||||
cd .test/jenkins-job-builder
|
||||
tox -e compare-xml-new
|
||||
|
||||
cd ..
|
||||
find jenkins-job-builder/.test/new/out/ -printf "%f\n" > job-list.txt
|
||||
|
||||
cd zuul
|
||||
tox -e venv -- zuul-server -c etc/zuul.conf-sample -l ../../zuul/layout.yaml -t ../job-list.txt
|
44
tox.ini
Normal file
44
tox.ini
Normal file
@ -0,0 +1,44 @@
|
||||
[tox]
|
||||
minversion = 1.6
|
||||
envlist = pep8,jjb,jenkins-project,zuul
|
||||
skipsdist = True
|
||||
|
||||
[testenv]
|
||||
deps = -r{toxinidir}/test-requirements.txt
|
||||
|
||||
[testenv:pep8]
|
||||
commands =
|
||||
flake8
|
||||
{toxinidir}/tools/run-bashate.sh
|
||||
|
||||
[testenv:venv]
|
||||
commands = {posargs}
|
||||
|
||||
[flake8]
|
||||
show-source = True
|
||||
exclude = .tox,.test
|
||||
ignore = E125,H
|
||||
select = H231
|
||||
|
||||
[testenv:jjb]
|
||||
basepython = python2.7
|
||||
deps = jenkins-job-builder
|
||||
whitelist_externals =
|
||||
mkdir
|
||||
rm
|
||||
commands =
|
||||
rm -rf {envdir}/tmp
|
||||
mkdir -p {envdir}/tmp
|
||||
jenkins-jobs -l debug test -o {envdir}/tmp jenkins/jobs
|
||||
|
||||
[testenv:jenkins-project]
|
||||
deps =
|
||||
commands =
|
||||
{toxinidir}/tools/jenkins-projects-checks.py
|
||||
|
||||
[testenv:zuul]
|
||||
basepython = python2.7
|
||||
deps = PyYAML
|
||||
commands =
|
||||
{toxinidir}/tools/run-layout.sh
|
||||
{toxinidir}/tools/layout-checks.py
|
Loading…
x
Reference in New Issue
Block a user