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