-
Notifications
You must be signed in to change notification settings - Fork 11
344 lines (301 loc) · 14 KB
/
ci-test.yml
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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
# merged in python-package.yml workflow
# reference docs:
# https://blog.deepjyoti30.dev/tests-github-python
# https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
# https://github.com/pypa/twine/blob/main/.github/workflows/main.yml
name: roundup-ci
on:
push:
# skip if github.ref is 'refs/heads/maint-1.6'
# aka github.ref_name of 'maint-1.6'
# see https://github.com/orgs/community/discussions/26253
# for mechanism to control matrix based on branch
branches: [ "*", '!maint-1.6' ]
# pull_request:
# branches: [ "master" ]
schedule:
# monthly build/check
- cron: '23 17 1 * *'
workflow_dispatch:
inputs:
debug_enabled:
type: boolean
description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)'
required: false
default: false
# GITHUB_TOKEN only has read repo context.
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
test:
name: CI build test
#runs-on: ubuntu-latest
# use below if running on multiple OS's.
runs-on: ${{ matrix.os }}
if: "!contains(github.event.head_commit.message, 'no-github-ci')"
strategy:
fail-fast: false
max-parallel: 4
matrix:
# Run in all these versions of Python
python-version:
# - "2.7"
- "3.13"
# - 3.6 run via include on ubuntu 20.04
# - "3.7"
- "3.8"
# - "3.9"
- "3.10"
- "3.11"
- "3.12"
# use for multiple os or ubuntu versions
#os: [ubuntu-latest, macos-latest, windows-latest]
# ubuntu latest 22.04 12/2022
os: [ubuntu-latest, ubuntu-20.04]
# if the ones above fail. fail the build
experimental: [ false ]
include:
# example: if 3.13 fails the jobs still succeeds
# allow-prereleases in setup-python allows alpha/beta
# releases to run
#- python-version: 3.13
# os: ubuntu-22.04
# experimental: true
# 3.6 not available on new 22.04 runners, so run on 20.04 ubuntu
- python-version: 3.6
os: ubuntu-20.04
exclude:
# skip all python versions on 20.04 except explicitly included
- os: ubuntu-20.04
# run the finalizer for coveralls even if one or more
# experimental matrix runs fail.
# moving it above strategy produces unexpected value false
# moving it below (here) produces unexpected value ''.
# continue-on-error: ${{ matrix.experimental }}
env:
# get colorized pytest output even without a controlling tty
PYTEST_ADDOPTS: "--color=yes"
# OS: ${{ matrix.os }}
PYTHON_VERSION: ${{ matrix.python-version }}
steps:
# Checkout the latest code from the repo
- name: Checkout source
# example directives:
# disable step
# if: {{ false }}
# continue running if step fails
# continue-on-error: true
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
# Setup version of Python to use
- name: Set Up Python ${{ matrix.python-version }}
uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
cache: 'pip'
- name: Install build tools - setuptools
run: pip install setuptools
# Display the Python version being used
- name: Display Python and key module versions
run: |
python -c "import sys; print('python version: ', sys.version)"
python -c "import sqlite3; print('sqlite version: ', sqlite3.sqlite_version)"
python -c "import setuptools; print('setuptools version: ', setuptools.__version__);"
- name: Update pip
run: python -m pip install --upgrade pip
# note pytest-env is not needed for redis password as there is
# no password on CI's redis.
- name: Install pytest and other packages needed for running tests
run: pip install flake8 hypothesis mock pytest pytest-cov requests sphinx-tabs
# https://github.com/mxschmitt/action-tmate
# allow remote ssh into the CI container. I need this to debug
# some xfail cases
- name: Setup tmate session
uses: mxschmitt/action-tmate@v3
if: ${{ github.event_name == 'workflow_dispatch' && inputs.debug_enabled }}
timeout-minutes: 10
with:
limit-access-to-actor: true
- name: run flake8 - abort for syntax error, otherwise warn only
run: |
# stop the build for Python syntax errors or undefined names
# talgettext is a utility function ignore it.
flake8 roundup --count --select=E9,F63,F7,F82 --show-source --statistics --extend-exclude talgettext.py
# exit-zero treats all errors as warnings.
# The GitHub editor is 127 chars wide
flake8 roundup --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
# Install the databases
- name: Install mysql/mariadb
run: |
#set -xv
# mysql is pre-installed and active but this is the install command
# sudo apt-get install mysql-server mysql-client
# set up mysql database
sudo sed -i -e '/^\[mysqld\]/,/^\[mysql/s/^#* *max_allowed_packet.*/max_allowed_packet = 500M/' /etc/mysql/mysql.conf.d/mysqld.cnf; sleep 3
#tail -n +0 /etc/mysql/my.cnf /etc/mysql/mysql.conf.d/mysqld.cnf
#grep max_allowed /etc/mysql/mysql.conf.d/mysqld.cnf
#ls /etc/mysql/conf.d/ /etc/mysql/mysql.conf.d/
#sleep 5
# try to improve performance speed by disabling some ACID
# settings and change some layout defaults.
sudo sed -i -e '$a\innodb_flush_log_at_trx_commit = 2' /etc/mysql/mysql.conf.d/mysqld.cnf
sudo sed -i -e '$a\innodb_file_per_table = OFF' /etc/mysql/mysql.conf.d/mysqld.cnf
sudo sed -i -e '$a\innodb_doublewrite=OFF' /etc/mysql/mysql.conf.d/mysqld.cnf
sudo sed -i -e '$a\innodb_fast_shutdown=2' /etc/mysql/mysql.conf.d/mysqld.cnf
sudo sed -i -e '$a\innodb_log_file_size=1048576' /etc/mysql/mysql.conf.d/mysqld.cnf
sudo sed -i -e '$a\innodb_flush_method=O_DIRECT' /etc/mysql/mysql.conf.d/mysqld.cnf
sudo sed -i -e '$a\innodb_log_buffer_size=3M' /etc/mysql/mysql.conf.d/mysqld.cnf
sudo sed -i -e '$a\innodb_buffer_pool_size=180M' /etc/mysql/mysql.conf.d/mysqld.cnf
sleep 3
sudo service mysql restart
#sleep 10
#ps -ef | grep mysqld
#sudo netstat -anp | grep mysqld
sudo mysql -u root -proot -e 'CREATE USER "rounduptest"@"localhost" IDENTIFIED WITH mysql_native_password BY "rounduptest"; GRANT ALL on rounduptest.* TO "rounduptest"@"localhost";'
- name: Install postgres
run: |
sudo apt-get update && sudo apt-get install postgresql
# Disable fsync, full page writes for speed,
# don't care about data durability when testing
sudo sed -i -e '$a\fsync = off' /etc/postgresql/*/*/postgresql.conf
sudo sed -i -e '$a\full_page_writes = off' /etc/postgresql/*/*/postgresql.conf
sudo sed -i -e '$a\synchronous_commit = off' /etc/postgresql/*/*/postgresql.conf
sudo service postgresql restart; sleep 10
# set up postgresql database
sudo -u postgres psql -c "CREATE ROLE rounduptest WITH CREATEDB LOGIN PASSWORD 'rounduptest';" -U postgres
sudo -u postgres psql -c "CREATE ROLE rounduptest_schema LOGIN PASSWORD 'rounduptest';" -U postgres
sudo -u postgres psql -c "CREATE DATABASE rounduptest_schema;" -U postgres
sudo -u postgres psql -c "GRANT CREATE ON DATABASE rounduptest_schema TO rounduptest_schema;" -U postgres
- name: install redis
run: |
sudo apt-get install redis
pip install redis
- name: Install python db libraries
run: |
pip install mysqlclient
pip install psycopg2
- name: Install auxiliary packages
run: |
sudo apt-get install swig gpgsm libgpgme-dev
# pygments for markdown2 to highlight code blocks
pip install markdown2 pygments
# docutils for ReStructuredText
pip install beautifulsoup4 brotli docutils gpg jinja2 \
mistune==0.8.4 pyjwt pytz whoosh
- name: Install aux packages that need versions differences
# if zstd fails install, keep going with test, don't abort
run: |
set -xv
pip install zstd || true
if [[ "$PYTHON_VERSION" != "2."* ]]; then
pip install Markdown; fi
- name: Install xapian
if: matrix.python-version != '3.13'
run: |
set -xv
sudo apt-get install libxapian-dev
# Sphinx required to build the xapian python bindings. Use 1.8.5 on
# older python and newest on newer.
if [[ $PYTHON_VERSION == "2."* ]]; then pip install sphinx==1.8.5; fi
if [[ $PYTHON_VERSION == '3.'* ]] ; then pip install sphinx; fi
if [[ $PYTHON_VERSION != "3.13" ]]; then
XAPIAN_VER=$(dpkg -l libxapian-dev | tail -n 1 | awk '{print $3}' | cut -d '-' -f 1); echo $XAPIAN_VER;
else
XAPIAN_VER="1.4.25"; echo $XAPIAN_VER;
fi
cd /tmp
curl -s -O https://oligarchy.co.uk/xapian/$XAPIAN_VER/xapian-bindings-$XAPIAN_VER.tar.xz
tar -Jxvf xapian-bindings-$XAPIAN_VER.tar.xz
cd xapian-bindings-$XAPIAN_VER/
if [[ $PYTHON_VERSION == "2."* ]]; then ./configure --prefix=$VIRTUAL_ENV --with-python --disable-documentation; fi
# edit the configure script.
# distutils.sysconfig.get_config_vars('SO') doesn't work for
# 3.11 or newer.
# Change distutils.sysconfig... to just sysconfig and SO
# to EXT_SUFFIX to get valid value.
if [[ $PYTHON_VERSION == "3."* ]]; then \
cp configure configure.FCS; \
sed -i \
-e '/PYTHON3_SO=/s/distutils\.//g' \
-e '/PYTHON3_SO=/s/"SO"/"EXT_SUFFIX"/g' \
-e '/PYTHON3_CACHE_TAG=/s/imp;print(imp.get_tag())/sys;print(sys.implementation.cache_tag)/' \
-e '/PYTHON3_CACHE_OPT1_EXT=/s/imp\.get_tag()/sys.implementation.cache_tag/g' \
-e '/PYTHON3_CACHE_OPT1_EXT=/s/imp\b/importlib/g' \
configure; \
diff -u configure.FCS configure || true; \
./configure --prefix=$VIRTUAL_ENV --with-python3 --disable-documentation; \
fi
case "$PYTHON_VERSION" in "3.13") echo skipping xapian build;; *) make && sudo make install; esac
- name: Test build roundup and install locale so lang tests work.
run: |
sudo apt-get install gettext
python setup.py build
(cd locale; make local_install; ls -lR locale/de/LC_MESSAGES)
# Run the tests using pytest with test files in tests directory.
- name: Run tests
run: |
if [[ "$PYTHON_VERSION" != "2."* ]]; then
pytest -r a \
--durations=20 \
-W default \
-W "ignore:SelectableGroups:DeprecationWarning" \
-W "ignore:the imp module:DeprecationWarning:gpg.gpgme:15" \
-W "ignore:'U' mode::docutils.io" \
-W "ignore:unclosed:ResourceWarning:roundup.roundup.demo" \
-W "ignore:unclosed file:ResourceWarning:enum" \
-v test/ --cov=roundup
if [[ "$PYTHON_VERSION" != "3.6" ]]; then
# coverage before 3.6 doesn't support lcov output
coverage lcov
fi
else
# python2 case
pytest -v -r a --durations=20 test/ --cov=roundup
fi
- name: Build docs
run: python ./setup.py build_doc
- name: Upload coverage to Codecov
# see: https://github.com/codecov/codecov-action#usage
uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # v3.1.5
with:
verbose: true
token: ${{ secrets.CODECOV_TOKEN }}
- name: Upload coverage to Coveralls
# python 2.7 and 3.6 versions of coverage can't produce lcov files.
if: matrix.python-version != '2.7' && matrix.python-version != '3.6'
uses: coverallsapp/github-action@3dfc5567390f6fa9267c0ee9c251e4c8c3f18949 # v2.2.3
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
path-to-lcov: coverage.lcov
parallel: run-{{ matrix.python-version }}-{{ matrix.os }}
#- name: test docker build current version ubuntu-latest
# if: matrix.python-version == '3.10' && matrix.os == 'ubuntu-latest'
# run: |
# docker build -t roundup-app-dev -f scripts/Docker/Dockerfile .
# mkdir tracker; chmod 777 tracker
# docker run -d --rm -p 9017:8080 \
# -v $PWD/tracker:/usr/src/app/tracker \
# roundup-app-dev:latest demo
# expect 200
# curl --fail http://localhost:9017/demo/ > /dev/null
#- name: test docker build released pip version
# run: |
# docker build -t roundup-app-rel --build-arg="source=pypi" \
# -f scripts/Docker/Dockerfile .
- name: run benchmarks
if: "contains(github.event.head_commit.message, 'benchmark')"
run: INCI=1 python test/benchmark.py
# in parallel build coveralls requires a finish step
finish:
needs: test
runs-on: ubuntu-latest
if: "!contains(github.event.head_commit.message, 'no-github-ci')"
steps:
- name: Coveralls Finished
uses: coverallsapp/github-action@3dfc5567390f6fa9267c0ee9c251e4c8c3f18949 # v2.2.3
with:
github-token: ${{ secrets.github_token }}
parallel-finished: true