]> git.openstreetmap.org Git - nominatim.git/blob - .github/workflows/ci-tests.yml
release 5.2.0.post7
[nominatim.git] / .github / workflows / ci-tests.yml
1 name: CI Tests
2
3 on: [ push, pull_request ]
4
5 jobs:
6     create-archive:
7         runs-on: ubuntu-latest
8
9         steps:
10             - uses: actions/checkout@v4
11               with:
12                 submodules: true
13
14             - uses: actions/cache@v4
15               with:
16                   path: |
17                      data/country_osm_grid.sql.gz
18                   key: nominatim-country-data-1
19
20             - name: Package tarball
21               run: |
22                   if [ ! -f data/country_osm_grid.sql.gz ]; then
23                       wget --no-verbose -O data/country_osm_grid.sql.gz https://www.nominatim.org/data/country_grid.sql.gz
24                   fi
25                   cd ..
26                   tar czf nominatim-src.tar.bz2 Nominatim
27                   mv nominatim-src.tar.bz2 Nominatim
28
29             - name: 'Upload Artifact'
30               uses: actions/upload-artifact@v4
31               with:
32                   name: full-source
33                   path: nominatim-src.tar.bz2
34                   retention-days: 1
35
36     tests:
37         needs: create-archive
38         strategy:
39             matrix:
40                 flavour: ["ubuntu-22", "ubuntu-24"]
41                 include:
42                     - flavour: ubuntu-22
43                       ubuntu: 22
44                       postgresql: 12
45                       lua: '5.1'
46                       dependencies: pip
47                       python: '3.9'
48                     - flavour: ubuntu-24
49                       ubuntu: 24
50                       postgresql: 18
51                       lua: '5.3'
52                       dependencies: apt
53                       python: 'builtin'
54
55         runs-on: ubuntu-${{ matrix.ubuntu }}.04
56
57         steps:
58             - uses: actions/download-artifact@v4
59               with:
60                   name: full-source
61
62             - name: Unpack Nominatim
63               run: tar xf nominatim-src.tar.bz2
64
65             - uses: ./Nominatim/.github/actions/setup-postgresql
66               with:
67                   postgresql-version: ${{ matrix.postgresql }}
68
69             - uses: ./Nominatim/.github/actions/build-nominatim
70               with:
71                   dependencies: ${{ matrix.dependencies }}
72
73             - uses: actions/cache@v4
74               with:
75                   path: |
76                      /usr/local/bin/osm2pgsql
77                   key: osm2pgsql-bin-22-1
78               if: matrix.ubuntu == '22'
79
80             - name: Set up Python
81               uses: actions/setup-python@v5
82               with:
83                   python-version: ${{ matrix.python }}
84               if: matrix.python != 'builtin'
85
86             - name: Compile osm2pgsql
87               run: |
88                   if [ ! -f /usr/local/bin/osm2pgsql ]; then
89                       sudo apt-get install -y -qq libboost-system-dev libboost-filesystem-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libproj-dev libicu-dev liblua${LUA_VERSION}-dev lua-dkjson nlohmann-json3-dev 
90                       mkdir osm2pgsql-build
91                       cd osm2pgsql-build
92                       git clone https://github.com/osm2pgsql-dev/osm2pgsql
93                       mkdir build
94                       cd build
95                       cmake ../osm2pgsql
96                       make
97                       sudo make install
98                       cd ../..
99                       rm -rf osm2pgsql-build
100                   else
101                       sudo apt-get install -y -qq libexpat1 liblua${LUA_VERSION}
102                   fi
103               if: matrix.ubuntu == '22'
104               env:
105                   LUA_VERSION: ${{ matrix.lua }}
106
107             - name: Install test prerequisites (apt)
108               run: sudo apt-get install -y -qq python3-pytest python3-pytest-asyncio uvicorn python3-falcon python3-aiosqlite python3-pyosmium
109               if: matrix.dependencies == 'apt'
110
111             - name: Install test prerequisites (pip)
112               run: ./venv/bin/pip install pytest-asyncio falcon starlette asgi_lifespan aiosqlite osmium uvicorn
113               if: matrix.dependencies == 'pip'
114
115             - name: Install test prerequisites
116               run: ./venv/bin/pip install pytest-bdd
117
118             - name: Install latest flake8
119               run: ./venv/bin/pip install -U flake8
120
121             - name: Python linting
122               run: ../venv/bin/python -m flake8 src test/python test/bdd
123               working-directory: Nominatim
124
125             - name: Install mypy and typechecking info
126               run: ./venv/bin/pip install -U mypy types-PyYAML types-jinja2 types-psutil types-requests types-ujson types-Pygments typing-extensions
127               if: matrix.dependencies == 'pip'
128
129             - name: Python static typechecking
130               run: ../venv/bin/python -m mypy --strict --python-version 3.9 src
131               working-directory: Nominatim
132               if: matrix.dependencies == 'pip'
133
134             - name: Python unit tests
135               run: ../venv/bin/python -m pytest test/python
136               working-directory: Nominatim
137
138             - name: BDD tests
139               run: |
140                   ../venv/bin/python -m pytest test/bdd --nominatim-purge
141               working-directory: Nominatim
142
143     install:
144         runs-on: ubuntu-latest
145         needs: create-archive
146
147         strategy:
148             matrix:
149                 name: [Ubuntu-22, Ubuntu-24]
150                 include:
151                     - name: Ubuntu-22
152                       image: "ubuntu:22.04"
153                       ubuntu: 22
154                       install_mode: install-apache
155                     - name: Ubuntu-24
156                       image: "ubuntu:24.04"
157                       ubuntu: 24
158                       install_mode: install-apache
159
160         container:
161             image: ${{ matrix.image }}
162             env:
163                 LANG: en_US.UTF-8
164
165         defaults:
166             run:
167                 shell: sudo -Hu nominatim bash --noprofile --norc -eo pipefail {0}
168
169         steps:
170             - name: Prepare container (Ubuntu)
171               run: |
172                   export APT_LISTCHANGES_FRONTEND=none
173                   export DEBIAN_FRONTEND=noninteractive
174                   apt-get update -qq
175                   apt-get install -y git sudo wget
176                   ln -snf /usr/share/zoneinfo/$CONTAINER_TIMEZONE /etc/localtime && echo $CONTAINER_TIMEZONE > /etc/timezone
177               shell: bash
178
179             - name: Setup import user
180               run: |
181                   useradd -m nominatim
182                   echo 'nominatim   ALL=(ALL:ALL) NOPASSWD: ALL' > /etc/sudoers.d/nominiatim
183                   echo "/home/nominatim/Nominatim/vagrant/Install-on-${OS}.sh no $INSTALL_MODE" > /home/nominatim/vagrant.sh
184               shell: bash
185               env:
186                 OS: ${{ matrix.name }}
187                 INSTALL_MODE: ${{ matrix.install_mode }}
188
189             - uses: actions/download-artifact@v4
190               with:
191                   name: full-source
192                   path: /home/nominatim
193
194             - name: Install Nominatim
195               run: |
196                 export USERNAME=nominatim
197                 export USERHOME=/home/nominatim
198                 export NOSYSTEMD=yes
199                 export HAVE_SELINUX=no
200                 tar xf nominatim-src.tar.bz2
201                 . vagrant.sh
202               working-directory: /home/nominatim
203
204             - name: Prepare import environment
205               run: |
206                   mv Nominatim/test/testdb/apidb-test-data.pbf test.pbf
207                   rm -rf Nominatim
208                   mkdir data-env-reverse
209               working-directory: /home/nominatim
210
211             - name: Add nominatim to path
212               run: |
213                 sudo ln -s /home/nominatim/nominatim-venv/bin/nominatim /usr/local/bin/nominatim
214
215             - name: Need lua binary
216               run: |
217                 sudo apt-get install -y lua5.4 lua-dkjson
218
219             - name: Print version
220               run: nominatim --version
221               working-directory: /home/nominatim/nominatim-project
222
223             - name: Print taginfo
224               run: lua ./nominatim-venv/lib/*/site-packages/nominatim_db/resources/lib-lua/taginfo.lua
225               working-directory: /home/nominatim
226
227             - name: Collect host OS information
228               run: nominatim admin --collect-os-info
229               working-directory: /home/nominatim/nominatim-project
230
231             - name: Import
232               run: nominatim import --osm-file ../test.pbf
233               working-directory: /home/nominatim/nominatim-project
234
235             - name: Import special phrases
236               run: nominatim special-phrases --import-from-wiki
237               working-directory: /home/nominatim/nominatim-project
238
239             - name: Check full import
240               run: nominatim admin --check-database
241               working-directory: /home/nominatim/nominatim-project
242
243             - name: Warm up database
244               run: nominatim admin --warm
245               working-directory: /home/nominatim/nominatim-project
246
247             - name: Install osmium
248               run: |
249                   /home/nominatim/nominatim-venv/bin/pip install osmium
250
251             - name: Run update
252               run: |
253                   nominatim replication --init
254                   NOMINATIM_REPLICATION_MAX_DIFF=1 nominatim replication --once
255               working-directory: /home/nominatim/nominatim-project
256
257             - name: Clean up database
258               run: nominatim refresh --postcodes --word-tokens
259               working-directory: /home/nominatim/nominatim-project
260
261             - name: Run reverse-only import
262               run : |
263                   echo 'NOMINATIM_DATABASE_DSN="pgsql:dbname=reverse"' >> .env
264                   nominatim import --osm-file ../test.pbf --reverse-only --no-updates
265               working-directory: /home/nominatim/data-env-reverse
266
267             - name: Check reverse-only import
268               run: nominatim admin --check-database
269               working-directory: /home/nominatim/data-env-reverse
270
271             - name: Clean up database (reverse-only import)
272               run: nominatim refresh --postcodes --word-tokens
273               working-directory: /home/nominatim/nominatim-project
274
275     install-no-superuser:
276       runs-on: ubuntu-24.04
277       needs: create-archive
278
279       steps:
280           - uses: actions/download-artifact@v4
281             with:
282                 name: full-source
283
284           - name: Unpack Nominatim
285             run: tar xf nominatim-src.tar.bz2
286
287           - uses: ./Nominatim/.github/actions/setup-postgresql
288             with:
289                 postgresql-version: 16
290
291           - uses: ./Nominatim/.github/actions/build-nominatim
292
293           - name: Prepare import environment
294             run: |
295                 mv Nominatim/test/testdb/apidb-test-data.pbf test.pbf
296                 rm -rf Nominatim
297
298           - name: Prepare Database
299             run: |
300                 ./venv/bin/nominatim import --prepare-database
301
302           - name: Create import user
303             run: |
304                 sudo -u postgres createuser osm-import
305                 psql -d nominatim -c "ALTER USER \"osm-import\" WITH PASSWORD 'osm-import'"
306                 psql -d nominatim -c 'GRANT CREATE ON SCHEMA public TO "osm-import"'
307
308           - name: Run import
309             run: |
310                 NOMINATIM_DATABASE_DSN="pgsql:host=127.0.0.1;dbname=nominatim;user=osm-import;password=osm-import" ./venv/bin/nominatim import --continue import-from-file --osm-file test.pbf
311
312           - name: Check full import
313             run: ./venv/bin/nominatim admin --check-database
314
315     migrate:
316       runs-on: ubuntu-24.04
317       needs: create-archive
318
319       steps:
320           - uses: actions/download-artifact@v4
321             with:
322                 name: full-source
323
324           - name: Unpack Nominatim
325             run: tar xf nominatim-src.tar.bz2
326
327           - uses: ./Nominatim/.github/actions/setup-postgresql
328             with:
329                 postgresql-version: 18
330
331           - name: Install Python dependencies
332             run: |
333               sudo apt-get install --no-install-recommends virtualenv osm2pgsql
334
335           - name: Install Nominatim master version
336             run: |
337               virtualenv master
338               cd Nominatim
339               ../master/bin/pip install packaging/nominatim-db
340
341           - name: Install Nominatim from pypi
342             run: |
343               virtualenv release
344               ./release/bin/pip install nominatim-db
345
346           - name: Import Nominatim database using release
347             run: |
348               ./release/bin/nominatim import --osm-file Nominatim/test/testdb/apidb-test-data.pbf
349               ./release/bin/nominatim add-data --file Nominatim/test/testdb/additional_api_test.data.osm
350
351           - name: Migrate to master version
352             run: |
353               ./master/bin/nominatim admin --migrate
354               ./release/bin/nominatim add-data --file Nominatim/test/testdb/additional_api_test.data.osm
355
356     codespell:
357       runs-on: ubuntu-latest
358       steps:
359           - uses: codespell-project/actions-codespell@v2
360             with:
361                 only_warn: 1