comparison Jenkinsfile @ 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
children f65f8acaca84
comparison
equal deleted inserted replaced
6535:7790b34a0cef 6536:8d788789b38a
1 node {
2 def activatevirtualenv = ''
3 if (isUnix()) {
4 activatevirtualenv = '. venv/bin/activate'
5 } else {
6 activatevirtualenv = 'call venv\\Scripts\\activate.bat'
7 }
8
9 stage('checkout') {
10 checkout scm
11 if (isUnix()) {
12 sh 'hg --config extensions.purge= purge --all'
13 } else {
14 bat 'hg --config extensions.purge= purge --all'
15 }
16 }
17 stage('virtual env') {
18 def virtualenvscript = """virtualenv venv
19 $activatevirtualenv
20 python -m pip install --upgrade pip
21 pip install --upgrade setuptools
22 pip install --upgrade pylint
23 pip install --upgrade pytest-cov
24 """
25 if (isUnix()) {
26 virtualenvscript += """
27 pip install --upgrade python-ldap
28 pip install --upgrade python-pam
29 """
30 sh virtualenvscript
31 } else {
32 bat virtualenvscript
33 }
34 }
35 stage('setup') {
36 def virtualenvscript = """$activatevirtualenv
37 pip install --upgrade -e .
38 pip install -r dev_requirements.txt
39 python setup.py compile_catalog
40 """
41 if (isUnix()) {
42 sh virtualenvscript
43 } else {
44 bat virtualenvscript
45 }
46 stash name: 'kallithea', useDefaultExcludes: false
47 }
48 stage('pylint') {
49 sh script: """$activatevirtualenv
50 pylint -j 0 --disable=C -f parseable kallithea > pylint.out
51 """, returnStatus: true
52 archiveArtifacts 'pylint.out'
53 try {
54 step([$class: 'WarningsPublisher', canComputeNew: false, canResolveRelativePaths: false, defaultEncoding: '', excludePattern: '', healthy: '', includePattern: '', messagesPattern: '', parserConfigurations: [[parserName: 'PyLint', pattern: 'pylint.out']], unHealthy: ''])
55 } catch (UnsupportedOperationException exc) {
56 echo "You need to install the 'Warnings Plug-in' to display the pylint report."
57 currentBuild.result = 'UNSTABLE'
58 echo "Caught: ${exc}"
59 }
60 }
61 def pytests = [:]
62 pytests['sqlite'] = {
63 ws {
64 unstash name: 'kallithea'
65 sh 'hg revert kallithea/tests/test.ini'
66 if (isUnix()) {
67 sh script: """$activatevirtualenv
68 hg revert kallithea/tests/test.ini
69 py.test -p no:sugar --cov-config .coveragerc --junit-xml=pytest_sqlite.xml --cov=kallithea --cov-report xml
70 """, returnStatus: true
71 } else {
72 bat script: """$activatevirtualenv
73 py.test -p no:sugar --cov-config .coveragerc --junit-xml=pytest_sqlite.xml --cov=kallithea --cov-report xml
74 """, returnStatus: true
75 }
76 sh 'sed --in-place "s/\\(classname=[\'\\"]\\)/\\1SQLITE./g" pytest_sqlite.xml'
77 archiveArtifacts 'pytest_sqlite.xml'
78 junit 'pytest_sqlite.xml'
79 try {
80 step([$class: 'CoberturaPublisher', autoUpdateHealth: false, autoUpdateStability: false, coberturaReportFile: 'coverage.xml', failNoReports: false, failUnhealthy: false, failUnstable: false, maxNumberOfBuilds: 0, onlyStable: false, zoomCoverageChart: false])
81 } catch (UnsupportedOperationException exc) {
82 echo "You need to install the pipeline compatible 'CoberturaPublisher Plug-in' to display the coverage report."
83 currentBuild.result = 'UNSTABLE'
84 echo "Caught: ${exc}"
85 }
86 }
87 }
88 if (isUnix()) {
89 pytests['de'] = {
90 ws {
91 unstash name: 'kallithea'
92 sh 'hg revert kallithea/tests/test.ini'
93 withEnv(['LANG=de_DE.UTF-8',
94 'LANGUAGE=de',
95 'LC_ADDRESS=de_DE.UTF-8',
96 'LC_IDENTIFICATION=de_DE.UTF-8',
97 'LC_MEASUREMENT=de_DE.UTF-8',
98 'LC_MONETARY=de_DE.UTF-8',
99 'LC_NAME=de_DE.UTF-8',
100 'LC_NUMERIC=de_DE.UTF-8',
101 'LC_PAPER=de_DE.UTF-8',
102 'LC_TELEPHONE=de_DE.UTF-8',
103 'LC_TIME=de_DE.UTF-8',
104 ]) {
105 sh script: """$activatevirtualenv
106 py.test -p no:sugar --cov-config .coveragerc --junit-xml=pytest_de.xml --cov=kallithea --cov-report xml
107 """, returnStatus: true
108 }
109 sh 'sed --in-place "s/\\(classname=[\'\\"]\\)/\\1DE./g" pytest_de.xml'
110 archiveArtifacts 'pytest_de.xml'
111 junit 'pytest_de.xml'
112 }
113 }
114 pytests['mysql'] = {
115 ws {
116 unstash name: 'kallithea'
117 sh 'hg revert kallithea/tests/test.ini'
118 sh """$activatevirtualenv
119 pip install --upgrade MySQL-python
120 """
121 withEnv(['TEST_DB=mysql://kallithea:kallithea@jenkins_mysql/kallithea_test?charset=utf8']) {
122 if (isUnix()) {
123 sh script: """$activatevirtualenv
124 py.test -p no:sugar --cov-config .coveragerc --junit-xml=pytest_mysql.xml --cov=kallithea --cov-report xml
125 """, returnStatus: true
126 } else {
127 bat script: """$activatevirtualenv
128 py.test -p no:sugar --cov-config .coveragerc --junit-xml=pytest_mysql.xml --cov=kallithea --cov-report xml
129 """, returnStatus: true
130 }
131 }
132 sh 'sed --in-place "s/\\(classname=[\'\\"]\\)/\\1MYSQL./g" pytest_mysql.xml'
133 archiveArtifacts 'pytest_mysql.xml'
134 junit 'pytest_mysql.xml'
135 }
136 }
137 pytests['postgresql'] = {
138 ws {
139 unstash name: 'kallithea'
140 sh 'hg revert kallithea/tests/test.ini'
141 sh 'sed -i.bak s/^sqlalchemy\\.url.*$/sqlalchemy.url=postgresql:\\\\/\\\\/kallithea:kallithea@jenkins_postgresql\\\\/kallithea_test/g kallithea/tests/test.ini'
142 sh """$activatevirtualenv
143 pip install --upgrade psycopg2
144 """
145 withEnv(['TEST_DB=postgresql://kallithea:kallithea@jenkins_postgresql/kallithea_test']) {
146 if (isUnix()) {
147 sh script: """$activatevirtualenv
148 py.test -p no:sugar --cov-config .coveragerc --junit-xml=pytest_postgresql.xml --cov=kallithea --cov-report xml
149 """, returnStatus: true
150 } else {
151 bat script: """$activatevirtualenv
152 py.test -p no:sugar --cov-config .coveragerc --junit-xml=pytest_postgresql.xml --cov=kallithea --cov-report xml
153 """, returnStatus: true
154 }
155 }
156 sh 'sed --in-place "s/\\(classname=[\'\\"]\\)/\\1POSTGRES./g" pytest_postgresql.xml'
157 archiveArtifacts 'pytest_postgresql.xml'
158 junit 'pytest_postgresql.xml'
159 }
160 }
161 }
162 stage('Tests') {
163 parallel pytests
164 }
165 }