Files
@ cbf524e4c1a3
Branch filter:
Location: kallithea/Jenkinsfile
cbf524e4c1a3
7.3 KiB
text/plain
utils: remove Session after we are done using it in set_app_settings
When the Kallithea WSGI application or celeryd is started, TurboGears
app_config.make_base_app calls Kallithea app_cfg.setup_configuration which runs
utils.set_app_settings. That function will read settings from the database and
store them in the global config. It uses a database session which is created on
demand, but this session was not dismissed but left around for the next thing
that asked for a database session. MySQL will by default close connections
after 1 hour, so when celery tried to run a task after 1 hour of inactivity, it
could fail because of the closed connection.
utils.set_app_settings must thus remove the Session after use, just like
auth.set_available_permissions do.
This will thus fix for example some MySQL connection problems seen with Celery.
When the Kallithea WSGI application or celeryd is started, TurboGears
app_config.make_base_app calls Kallithea app_cfg.setup_configuration which runs
utils.set_app_settings. That function will read settings from the database and
store them in the global config. It uses a database session which is created on
demand, but this session was not dismissed but left around for the next thing
that asked for a database session. MySQL will by default close connections
after 1 hour, so when celery tried to run a task after 1 hour of inactivity, it
could fail because of the closed connection.
utils.set_app_settings must thus remove the Session after use, just like
auth.set_available_permissions do.
This will thus fix for example some MySQL connection problems seen with Celery.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | def createvirtualenv = ''
def activatevirtualenv = ''
node {
if (isUnix()) {
createvirtualenv = 'rm -r $JENKINS_HOME/venv/$JOB_NAME || true && virtualenv $JENKINS_HOME/venv/$JOB_NAME'
activatevirtualenv = '. $JENKINS_HOME/venv/$JOB_NAME/bin/activate'
} else {
createvirtualenv = 'rmdir /s /q %JENKINS_HOME%\\venv\\%JOB_NAME% || true && virtualenv %JENKINS_HOME%\\venv\\%JOB_NAME%'
activatevirtualenv = 'call %JENKINS_HOME%\\venv\\%JOB_NAME%\\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 = """$createvirtualenv
$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 (java.lang.IllegalArgumentException 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'] = {
node {
ws {
deleteDir()
unstash name: 'kallithea'
if (isUnix()) {
sh script: """$activatevirtualenv
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 (java.lang.IllegalArgumentException exc) {
echo "You need to install the pipeline compatible 'CoberturaPublisher Plug-in' to display the coverage report."
currentBuild.result = 'UNSTABLE'
echo "Caught: ${exc}"
}
}
}
}
pytests['de'] = {
node {
if (isUnix()) {
ws {
deleteDir()
unstash name: 'kallithea'
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'] = {
node {
if (isUnix()) {
ws {
deleteDir()
unstash name: 'kallithea'
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'] = {
node {
if (isUnix()) {
ws {
deleteDir()
unstash name: 'kallithea'
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
}
|