Mercurial > kallithea
changeset 6536:8d788789b38a
tests: add Jenkinsfile for automatic creation of Jenkins projects for testing Kallithea itself
This is the new way of how to build and run tests with jenkins.
It runs pylint and py.test with 4 different settings:
1. default
2. with German language settings
3. with MySQL DB
4. with PostgreSQL DB
A major advantage of this new Jenkinsfile approach is that Jenkins will be able
to automatically create new projects for each branch (or pull request) that
contains a jenkinsfile. There is thus no need for maintaining multiple jenkins
projects.
author | domruf <dominikruf@gmail.com> |
---|---|
date | Sun, 05 Mar 2017 17:06:48 +0100 |
parents | 7790b34a0cef |
children | 0dbf225439ed |
files | Jenkinsfile |
diffstat | 1 files changed, 165 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Jenkinsfile Sun Mar 05 17:06:48 2017 +0100 @@ -0,0 +1,165 @@ +node { + def activatevirtualenv = '' + if (isUnix()) { + activatevirtualenv = '. venv/bin/activate' + } else { + activatevirtualenv = 'call venv\\Scripts\\activate.bat' + } + + stage('checkout') { + checkout scm + if (isUnix()) { + sh 'hg --config extensions.purge= purge --all' + } else { + bat 'hg --config extensions.purge= purge --all' + } + } + stage('virtual env') { + def virtualenvscript = """virtualenv venv + $activatevirtualenv + python -m pip install --upgrade pip + pip install --upgrade setuptools + pip install --upgrade pylint + pip install --upgrade pytest-cov + """ + if (isUnix()) { + virtualenvscript += """ + pip install --upgrade python-ldap + pip install --upgrade python-pam + """ + sh virtualenvscript + } else { + bat virtualenvscript + } + } + stage('setup') { + def virtualenvscript = """$activatevirtualenv + pip install --upgrade -e . + pip install -r dev_requirements.txt + python setup.py compile_catalog + """ + if (isUnix()) { + sh virtualenvscript + } else { + bat virtualenvscript + } + stash name: 'kallithea', useDefaultExcludes: false + } + stage('pylint') { + sh script: """$activatevirtualenv + pylint -j 0 --disable=C -f parseable kallithea > pylint.out + """, returnStatus: true + archiveArtifacts 'pylint.out' + try { + step([$class: 'WarningsPublisher', canComputeNew: false, canResolveRelativePaths: false, defaultEncoding: '', excludePattern: '', healthy: '', includePattern: '', messagesPattern: '', parserConfigurations: [[parserName: 'PyLint', pattern: 'pylint.out']], unHealthy: '']) + } catch (UnsupportedOperationException exc) { + echo "You need to install the 'Warnings Plug-in' to display the pylint report." + currentBuild.result = 'UNSTABLE' + echo "Caught: ${exc}" + } + } + def pytests = [:] + pytests['sqlite'] = { + ws { + unstash name: 'kallithea' + sh 'hg revert kallithea/tests/test.ini' + if (isUnix()) { + sh script: """$activatevirtualenv + hg revert kallithea/tests/test.ini + py.test -p no:sugar --cov-config .coveragerc --junit-xml=pytest_sqlite.xml --cov=kallithea --cov-report xml + """, returnStatus: true + } else { + bat script: """$activatevirtualenv + py.test -p no:sugar --cov-config .coveragerc --junit-xml=pytest_sqlite.xml --cov=kallithea --cov-report xml + """, returnStatus: true + } + sh 'sed --in-place "s/\\(classname=[\'\\"]\\)/\\1SQLITE./g" pytest_sqlite.xml' + archiveArtifacts 'pytest_sqlite.xml' + junit 'pytest_sqlite.xml' + try { + step([$class: 'CoberturaPublisher', autoUpdateHealth: false, autoUpdateStability: false, coberturaReportFile: 'coverage.xml', failNoReports: false, failUnhealthy: false, failUnstable: false, maxNumberOfBuilds: 0, onlyStable: false, zoomCoverageChart: false]) + } catch (UnsupportedOperationException exc) { + echo "You need to install the pipeline compatible 'CoberturaPublisher Plug-in' to display the coverage report." + currentBuild.result = 'UNSTABLE' + echo "Caught: ${exc}" + } + } + } + if (isUnix()) { + pytests['de'] = { + ws { + unstash name: 'kallithea' + sh 'hg revert kallithea/tests/test.ini' + withEnv(['LANG=de_DE.UTF-8', + 'LANGUAGE=de', + 'LC_ADDRESS=de_DE.UTF-8', + 'LC_IDENTIFICATION=de_DE.UTF-8', + 'LC_MEASUREMENT=de_DE.UTF-8', + 'LC_MONETARY=de_DE.UTF-8', + 'LC_NAME=de_DE.UTF-8', + 'LC_NUMERIC=de_DE.UTF-8', + 'LC_PAPER=de_DE.UTF-8', + 'LC_TELEPHONE=de_DE.UTF-8', + 'LC_TIME=de_DE.UTF-8', + ]) { + sh script: """$activatevirtualenv + py.test -p no:sugar --cov-config .coveragerc --junit-xml=pytest_de.xml --cov=kallithea --cov-report xml + """, returnStatus: true + } + sh 'sed --in-place "s/\\(classname=[\'\\"]\\)/\\1DE./g" pytest_de.xml' + archiveArtifacts 'pytest_de.xml' + junit 'pytest_de.xml' + } + } + pytests['mysql'] = { + ws { + unstash name: 'kallithea' + sh 'hg revert kallithea/tests/test.ini' + sh """$activatevirtualenv + pip install --upgrade MySQL-python + """ + withEnv(['TEST_DB=mysql://kallithea:kallithea@jenkins_mysql/kallithea_test?charset=utf8']) { + if (isUnix()) { + sh script: """$activatevirtualenv + py.test -p no:sugar --cov-config .coveragerc --junit-xml=pytest_mysql.xml --cov=kallithea --cov-report xml + """, returnStatus: true + } else { + bat script: """$activatevirtualenv + py.test -p no:sugar --cov-config .coveragerc --junit-xml=pytest_mysql.xml --cov=kallithea --cov-report xml + """, returnStatus: true + } + } + sh 'sed --in-place "s/\\(classname=[\'\\"]\\)/\\1MYSQL./g" pytest_mysql.xml' + archiveArtifacts 'pytest_mysql.xml' + junit 'pytest_mysql.xml' + } + } + pytests['postgresql'] = { + ws { + unstash name: 'kallithea' + sh 'hg revert kallithea/tests/test.ini' + sh 'sed -i.bak s/^sqlalchemy\\.url.*$/sqlalchemy.url=postgresql:\\\\/\\\\/kallithea:kallithea@jenkins_postgresql\\\\/kallithea_test/g kallithea/tests/test.ini' + sh """$activatevirtualenv + pip install --upgrade psycopg2 + """ + withEnv(['TEST_DB=postgresql://kallithea:kallithea@jenkins_postgresql/kallithea_test']) { + if (isUnix()) { + sh script: """$activatevirtualenv + py.test -p no:sugar --cov-config .coveragerc --junit-xml=pytest_postgresql.xml --cov=kallithea --cov-report xml + """, returnStatus: true + } else { + bat script: """$activatevirtualenv + py.test -p no:sugar --cov-config .coveragerc --junit-xml=pytest_postgresql.xml --cov=kallithea --cov-report xml + """, returnStatus: true + } + } + sh 'sed --in-place "s/\\(classname=[\'\\"]\\)/\\1POSTGRES./g" pytest_postgresql.xml' + archiveArtifacts 'pytest_postgresql.xml' + junit 'pytest_postgresql.xml' + } + } + } + stage('Tests') { + parallel pytests + } +}