Skip to content

Commit 53b77bc

Browse files
authored
Added Docker-based building and testing method (#363)
* Build with Docker * Use CUSTOM_DEFINES for Mapnik building * Only run `install-package-and-test.yml` if etc, utils or YAML file have changed
1 parent 4e8334e commit 53b77bc

25 files changed

Lines changed: 1372 additions & 18 deletions

.dockerignore

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
*
2+
!cmake
3+
!CMakeLists.txt
4+
!docs/man
5+
!etc/apache2/renderd-example-map.conf
6+
!etc/apache2/tile.load.in
7+
!etc/renderd/renderd.conf.in
8+
!includes
9+
!src
10+
!tests
11+
!utils/example-map

.github/actions/dependencies/build-and-install/mapnik/action.yml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ runs:
3131
- name: Build `Mapnik`
3232
run: |
3333
# Export variables
34+
export CUSTOM_DEFINES="-DACCEPT_USE_OF_DEPRECATED_PROJ_API_H=1"
3435
export GDAL_DATA=/usr/share/gdal
3536
export JOBS=${JOBS:-$(nproc)}
3637
export PROJ_LIB=/usr/share/proj
@@ -41,8 +42,12 @@ runs:
4142
4243
# Configure & build
4344
./configure \
44-
CC=${CC:-gcc} \
45-
CXX=${CXX:-g++} \
45+
CC="${CC:-gcc}" \
46+
CUSTOM_CFLAGS="${CUSTOM_CFLAGS:-}" \
47+
CUSTOM_CXXFLAGS="${CUSTOM_CXXFLAGS:-}" \
48+
CUSTOM_DEFINES="${CUSTOM_DEFINES:-}" \
49+
CUSTOM_LDFLAGS="${CUSTOM_LDFLAGS:-}" \
50+
CXX="${CXX:-g++}" \
4651
FAST=True \
4752
OPTIMIZATION=0 \
4853
PREFIX="/usr"
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
---
2+
name: Docker Image Build
3+
4+
on:
5+
pull_request:
6+
push:
7+
paths:
8+
- "docker/**"
9+
- ".github/workflows/docker-image-build.yml"
10+
11+
jobs:
12+
docker-image-build:
13+
name: Build & Test (${{ matrix.service-name }})
14+
runs-on: ubuntu-latest
15+
strategy:
16+
matrix:
17+
service-name:
18+
- centos-7
19+
- centos-stream-8
20+
- centos-stream-9
21+
- debian-11
22+
- debian-12
23+
- debian-testing
24+
- fedora-38
25+
- fedora-39
26+
- fedora-rawhide
27+
- opensuse-leap-15
28+
- opensuse-tumbleweed
29+
- ubuntu-20.04
30+
- ubuntu-22.04
31+
- ubuntu-devel
32+
fail-fast: false
33+
steps:
34+
- name: Checkout repository
35+
uses: actions/checkout@v4
36+
37+
- name: Build & Start
38+
run: docker compose up --build --detach ${{ matrix.service-name }}
39+
working-directory: docker
40+
41+
- name: Test
42+
run: |
43+
until $(curl --fail --output tile.png --silent http://localhost:8081/tiles/renderd-example/9/297/191.png); do
44+
echo 'Sleeping 5s';
45+
sleep 5;
46+
done
47+
echo 'dbf26531286e844a3a9735cdd193598dca78d22f77cafe5824bcaf17f88cbb08 tile.png' | sha256sum --check
48+
timeout-minutes: 1
49+
50+
- name: Show logs
51+
if: failure()
52+
run: docker compose logs
53+
working-directory: docker
54+
55+
- name: Stop
56+
if: success() || failure()
57+
run: docker compose down --volumes
58+
working-directory: docker

.github/workflows/flawfinder-analysis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
name: flawfinder
2+
name: Flawfinder Analysis
33

44
on:
55
pull_request:

.github/workflows/install-package-and-test.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@
22
name: Install Package & Test
33

44
on:
5-
- push
5+
pull_request:
6+
push:
7+
paths:
8+
- "etc/**"
9+
- "utils/**"
10+
- ".github/workflows/install-package-and-test.yml"
611

712
jobs:
813
install-package-and-test:

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ if(EXISTS "/etc/os-release")
220220
elseif(DISTRO_ID MATCHES "freebsd")
221221
set(TILE_LOAD_DIRECTORY "${HTTPD_SYSCONFDIR}/modules.d")
222222
set(TILE_LOAD_FILENAME "080_tile.conf")
223-
elseif(DISTRO_ID MATCHES "opensuse-leap")
223+
elseif(DISTRO_ID MATCHES "opensuse-leap|opensuse-tumbleweed")
224224
set(TILE_LOAD_DIRECTORY "${HTTPD_SYSCONFDIR}/conf.d")
225225
set(TILE_LOAD_FILENAME "mod_tile.conf")
226226
endif()

docker/.env

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
COMPOSE_PROJECT_NAME=mod_tile

docker/README.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Docker-based building & testing
2+
3+
For your convenience, we have provided a Docker-based building and testing method to help get started with development & testing.
4+
5+
### The following distributions are currently supported:
6+
7+
- centos-7 _(CentOS 7)_ [[Dockerfile](/docker/centos/7/Dockerfile)]
8+
- centos-stream-8 _(CentOS Stream 8)_ [[Dockerfile](/docker/centos/stream/Dockerfile)]
9+
- centos-stream-9 _(CentOS Stream 9)_ [[Dockerfile](/docker/centos/stream/Dockerfile)]
10+
- debian-10 _(Debian 10)_ [[Dockerfile](/docker/debian/Dockerfile)]
11+
- debian-11 _(Debian 11)_ [[Dockerfile](/docker/debian/Dockerfile)]
12+
- debian-12 _(Debian 12)_ [[Dockerfile](/docker/debian/Dockerfile)]
13+
- debian-testing _(Debian Testing)_ [[Dockerfile](/docker/debian/Dockerfile)]
14+
- fedora-34 _(Fedora 34)_ [[Dockerfile](/docker/fedora/Dockerfile)]
15+
- fedora-35 _(Fedora 35)_ [[Dockerfile](/docker/fedora/Dockerfile)]
16+
- fedora-36 _(Fedora 36)_ [[Dockerfile](/docker/fedora/Dockerfile)]
17+
- fedora-37 _(Fedora 37)_ [[Dockerfile](/docker/fedora/Dockerfile)]
18+
- fedora-38 _(Fedora 38)_ [[Dockerfile](/docker/fedora/Dockerfile)]
19+
- fedora-39 _(Fedora 39)_ [[Dockerfile](/docker/fedora/Dockerfile)]
20+
- fedora-rawhide _(Fedora Rawhide)_ [[Dockerfile](/docker/fedora/Dockerfile)]
21+
- opensuse-leap-15 _(openSUSE Leap 15)_ [[Dockerfile](/docker/opensuse/Dockerfile)]
22+
- opensuse-tumbleweed _(openSUSE Tumbleweed)_ [[Dockerfile](/docker/opensuse/Dockerfile)]
23+
- ubuntu-20.04 _(Ubuntu 20.04)_ [[Dockerfile](/docker/ubuntu/Dockerfile)]
24+
- ubuntu-22.04 _(Ubuntu 22.04)_ [[Dockerfile](/docker/ubuntu/Dockerfile)]
25+
- ubuntu-devel _(Ubuntu Devel)_ [[Dockerfile](/docker/ubuntu/Dockerfile)]
26+
27+
### Requirements:
28+
29+
- [Docker](https://docs.docker.com/get-docker/)
30+
- [Docker Compose](https://github.com/docker/compose)
31+
32+
### Usage:
33+
34+
```shell
35+
$ # Use any "{distribution}" value from the list above
36+
$ # I.E. docker-compose up --build ubuntu-devel
37+
$ cd docker
38+
$ docker-compose up --build {distribution}
39+
```
40+
41+
Then you can visit: `http://localhost:8081/renderd-example-map`

docker/centos/7/Dockerfile

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
# Arguments
2+
ARG mapnik_version=3.1.0
3+
4+
# Mapnik Builder
5+
FROM centos:centos7 as mapnik-builder
6+
7+
## Arguments
8+
ARG mapnik_version
9+
10+
## Install mapnik-builder dependencies
11+
RUN --mount=id=centos:centos7-/var/cache/yum,target=/var/cache/yum,type=cache,sharing=locked \
12+
ulimit -n 40000; \
13+
echo "install_weak_deps=0" >> /etc/yum.conf && \
14+
sed --in-place 's/keepcache=0/keepcache=1/g' /etc/yum.conf && \
15+
yum --assumeyes install epel-release centos-release-scl && \
16+
yum --assumeyes upgrade && \
17+
yum --assumeyes install \
18+
boost169-devel \
19+
bzip2 \
20+
cairo-devel \
21+
freetype-devel \
22+
devtoolset-9-gcc \
23+
devtoolset-9-gcc-c++ \
24+
gdal-devel \
25+
harfbuzz-devel \
26+
libicu-devel \
27+
libjpeg-devel \
28+
libpng-devel \
29+
libtiff-devel \
30+
libwebp-devel \
31+
libxml2-devel \
32+
make \
33+
patch \
34+
postgresql-devel \
35+
proj-devel \
36+
python3 \
37+
sqlite-devel \
38+
tar \
39+
zlib-devel
40+
41+
## Download, Build & Install `Mapnik`
42+
WORKDIR /tmp/mapnik_src
43+
RUN --mount=id=centos:centos7-mapnik:${mapnik_version},target=/tmp/mapnik_src,type=cache \
44+
export DESTDIR="/tmp/mapnik"; \
45+
export GDAL_DATA="$(gdal-config --datadir)"; \
46+
export JOBS="$(nproc)"; \
47+
export PROJ_LIB="/usr/share/proj"; \
48+
export PYTHON="python3"; \
49+
mkdir --parents ${GDAL_DATA} ${PROJ_LIB}; \
50+
if [ ! -f SConstruct ]; then \
51+
curl --silent --location https://github.com/mapnik/mapnik/releases/download/v${mapnik_version}/mapnik-v${mapnik_version}.tar.bz2 \
52+
| tar --extract --bzip2 --strip-components=1 --file=-; \
53+
sed -i 's#BOOST_APPEND = match.groups()\[0\]#BOOST_APPEND = ""#g' SConstruct; \
54+
fi; \
55+
source /opt/rh/devtoolset-9/enable; \
56+
export CUSTOM_DEFINES="-DACCEPT_USE_OF_DEPRECATED_PROJ_API_H=1"; \
57+
export CUSTOM_LDFLAGS="-L/usr/lib64/boost169"; \
58+
bash configure \
59+
CPP_TESTS=False \
60+
CUSTOM_CFLAGS="${CUSTOM_CFLAGS:-}" \
61+
CUSTOM_CXXFLAGS="${CUSTOM_CXXFLAGS:-}" \
62+
CUSTOM_DEFINES="${CUSTOM_DEFINES:-}" \
63+
CUSTOM_LDFLAGS="${CUSTOM_LDFLAGS:-}" \
64+
DEMO=False \
65+
DESTDIR="${DESTDIR}" \
66+
FAST=True \
67+
INPUT_PLUGINS=all \
68+
LIBDIR_SCHEMA=lib64 \
69+
OPTIMIZATION=2 \
70+
PREFIX=/usr \
71+
SVG2PNG=True \
72+
XMLPARSER=libxml2 && \
73+
make PYTHON="${PYTHON}" && \
74+
make install PYTHON="${PYTHON}"
75+
76+
# Builder
77+
FROM centos:centos7 as builder
78+
79+
## Install builder dependencies
80+
RUN --mount=id=centos:centos7-/var/cache/yum,target=/var/cache/yum,type=cache,sharing=locked \
81+
ulimit -n 40000; \
82+
echo "install_weak_deps=0" >> /etc/yum.conf && \
83+
sed --in-place 's/keepcache=0/keepcache=1/g' /etc/yum.conf && \
84+
yum --assumeyes install epel-release && \
85+
yum --assumeyes upgrade && \
86+
yum --assumeyes install \
87+
boost169-devel \
88+
cairo-devel \
89+
cmake3 \
90+
gcc \
91+
gcc-c++ \
92+
gdal \
93+
glib2-devel \
94+
harfbuzz-devel \
95+
httpd-devel \
96+
iniparser-devel \
97+
libcurl-devel \
98+
libicu-devel \
99+
libjpeg \
100+
libmemcached-devel \
101+
librados2-devel \
102+
libtiff \
103+
libwebp \
104+
make \
105+
proj
106+
107+
## Copy files from builder(s)
108+
### Mapnik
109+
COPY --from=mapnik-builder /tmp/mapnik /
110+
111+
## Build, Test & Install `mod_tile`
112+
COPY . /tmp/mod_tile_src
113+
WORKDIR /tmp/mod_tile_build
114+
RUN export CMAKE_BUILD_PARALLEL_LEVEL=$(nproc) && \
115+
export CFLAGS="-I/usr/include/boost169" && \
116+
export CXXFLAGS="-I/usr/include/boost169" && \
117+
cmake3 -B . -S /tmp/mod_tile_src \
118+
-DCMAKE_BUILD_TYPE:STRING=Release \
119+
-DENABLE_TESTS:BOOL=ON && \
120+
cmake3 --build .
121+
RUN export DESTDIR=/tmp/mod_tile && \
122+
ctest3 --output-on-failure && \
123+
(cmake3 --install . --prefix /usr --strip || make DESTDIR=${DESTDIR} install/strip) && \
124+
mv /tmp/mod_tile/var/run /tmp/mod_tile/run
125+
126+
# Runner
127+
FROM centos:centos7 as runner
128+
129+
## Install runner dependencies
130+
RUN --mount=id=centos:centos7-/var/cache/yum,target=/var/cache/yum,type=cache,sharing=locked \
131+
ulimit -n 40000; \
132+
echo "install_weak_deps=0" >> /etc/yum.conf && \
133+
sed --in-place 's/keepcache=0/keepcache=1/g' /etc/yum.conf && \
134+
yum --assumeyes install epel-release && \
135+
yum --assumeyes upgrade && \
136+
yum --assumeyes install \
137+
boost169-filesystem \
138+
boost169-program-options \
139+
boost169-regex \
140+
cairo \
141+
gdal \
142+
harfbuzz \
143+
httpd \
144+
iniparser \
145+
libicu \
146+
libmemcached \
147+
librados2 \
148+
libtiff \
149+
libwebp \
150+
proj
151+
152+
## Copy files from builder(s)
153+
### Mapnik
154+
COPY --from=mapnik-builder /tmp/mapnik /
155+
### mod_tile
156+
COPY --from=builder /tmp/mod_tile /
157+
COPY --chown=apache:apache --from=builder \
158+
/tmp/mod_tile_src/utils/example-map \
159+
/usr/share/renderd/example-map
160+
COPY --from=builder \
161+
/tmp/mod_tile_src/etc/apache2/renderd-example-map.conf \
162+
/etc/httpd/conf.d/renderd-example-map.conf
163+
164+
## Add configuration
165+
RUN printf '\n[example-map]\nURI=/tiles/renderd-example\nXML=/usr/share/renderd/example-map/mapnik.xml\n' >> /etc/renderd.conf
166+
RUN printf '\n[example-map-jpg]\nTYPE=jpg image/jpeg jpeg\nURI=/tiles/renderd-example-jpg\nXML=/usr/share/renderd/example-map/mapnik.xml\n' >> /etc/renderd.conf
167+
RUN printf '\n[example-map-png256]\nTYPE=png image/png png256\nURI=/tiles/renderd-example-png256\nXML=/usr/share/renderd/example-map/mapnik.xml\n' >> /etc/renderd.conf
168+
RUN printf '\n[example-map-png32]\nTYPE=png image/png png32\nURI=/tiles/renderd-example-png32\nXML=/usr/share/renderd/example-map/mapnik.xml\n' >> /etc/renderd.conf
169+
RUN printf '\n[example-map-webp]\nTYPE=webp image/webp webp\nURI=/tiles/renderd-example-webp\nXML=/usr/share/renderd/example-map/mapnik.xml\n' >> /etc/renderd.conf
170+
171+
## Start services
172+
CMD httpd -e debug -k start; \
173+
G_MESSAGES_DEBUG=${G_MESSAGES_DEBUG:-info} renderd --foreground

0 commit comments

Comments
 (0)