Skip to content

Commit

Permalink
Merge pull request #1 from Smoothex/main
Browse files Browse the repository at this point in the history
Project maintenance
  • Loading branch information
a01wielo authored Jan 22, 2024
2 parents ae7291a + 45198ff commit 1ee8727
Show file tree
Hide file tree
Showing 39 changed files with 417 additions and 26 deletions.
5 changes: 5 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
## What this PR does
*

## Related Issues
*
34 changes: 34 additions & 0 deletions .github/workflows/build-and-push.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: Build and push image to AWS ECR

on:
push:
branches: [ "develop" ]

jobs:
build-and-push:
name: Build and Push to ECR
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}

- name: Login to AWS ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2

- name: Build, tag and push image to AWS ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
ECR_REPOSITORY: test
IMAGE_TAG: testtag
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
106 changes: 106 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
name: Unit and integration tests

on:
push:
branches: [ "*" ]
pull_request:
branches: [ "main" ]

jobs:
unit-tests:
env:
POSTGRES_HOST: localhost
POSTGRES_PORT: 5432
POSTGRES_USER: ${{ secrets.POSTGRES_USER }}
POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }}
POSTGRES_DB: routing
PYTHONFAULTHANDLER: 1
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
lfs: true

- name: Checkout LFS objects (map files)
run: git lfs checkout

- name: Set up Python 3.9.16
uses: actions/setup-python@v3
with:
python-version: 3.9.16

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -e ./routing
pip install -r requirements.txt
- name: Run unit tests
run: |
cd routing
python -m unittest -v
integration-tests:
needs: [unit-tests]
env:
POSTGRES_HOST: localhost
POSTGRES_PORT: 5432
POSTGRES_USER: ${{ secrets.POSTGRES_USER }}
POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }}
POSTGRES_DB: routing
runs-on: ubuntu-latest
services:
postgres:
image: postgis/postgis:13-master
env:
POSTGRES_USER: ${{ secrets.POSTGRES_USER }}
POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }}
POSTGRES_DB: routing
ports:
- 5432:5432
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5

rabbitmq:
image: rabbitmq:3.9-alpine
env:
RABBITMQ_USERNAME: ${{ secrets.RABBITMQ_USERNAME }}
RABBITMQ_PASSWORD: ${{ secrets.RABBITMQ_PASSWORD }}
RABBITMQ_HOST: localhost
RABBITMQ_VHOST: /
ports:
- 5672:5672
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
lfs: true

- name: Checkout LFS objects (map files)
run: git lfs checkout

- name: Set up Python 3.9.16
uses: actions/setup-python@v3
with:
python-version: 3.9.16

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -e ./routing
pip install -r requirements.txt
- name: Run migration
run: |
cd Routing_Api
python manage.py migrate
python manage.py migrate Mobis
- name: Run integration tests
run: |
cd Routing_Api
python manage.py test -v 2 --keepdb --noinput
env:
SECRET_KEY: ${{ secrets.DJANGO_SECRET_KEY }}
REST_THROTTLINGRATE_ANON: 300
REST_THROTTLINGRATE_USER: 100
9 changes: 7 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,16 @@ Routing_Api/db.sqlite3
*.suo
*.user

# Python enviroments
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
04_API/Routing_Api/Routing_Api/Routing_Api/Mobis/lib/
.idea/
*.p
routing/test_profile_stats_dump.txt
routing/test_profile_graph.png
routing/test_profile_stats_cumtime.txt
Expand Down
19 changes: 19 additions & 0 deletions Celerybeat.dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
FROM python:3.9.16

WORKDIR /routing
COPY routing ./
RUN python -m compileall .
RUN pip install --no-cache-dir .

WORKDIR /www
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

WORKDIR /www
COPY Routing_Api ./
RUN python -m compileall .

ENV PYTHONUNBUFFERED 1
ENV IS_CELERY_APP yes

ENTRYPOINT ["celery", "-A", "Routing_Api", "beat", "-l", "INFO"]
19 changes: 19 additions & 0 deletions Celeryworker.dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
FROM python:3.9.7

WORKDIR /routing
COPY routing ./
RUN python -m compileall .
RUN pip install --no-cache-dir .

WORKDIR /www
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

WORKDIR /www
COPY Routing_Api ./
RUN python -m compileall .

ENV PYTHONUNBUFFERED 1
ENV IS_CELERY_APP yes

ENTRYPOINT ["celery", "-A", "Routing_Api", "worker", "-l", "INFO"]
22 changes: 22 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
FROM python:3.9.16

WORKDIR /routing
COPY routing ./
RUN python -m compileall .
RUN pip install --no-cache-dir .

WORKDIR /www
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

WORKDIR /maps
COPY maps .

WORKDIR /www
COPY Routing_Api ./
RUN python -m compileall .

ENV PYTHONUNBUFFERED 1

# default timeout of 30 sec may be too low
ENTRYPOINT ["gunicorn", "Routing_Api.wsgi", "--bind", "0.0.0.0:8080", "-k", "gevent", "--timeout", "180"]
37 changes: 17 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
![Unit and integration tests](https://github.com/Smoothex/erzmobil-routing/actions/workflows/tests.yml/badge.svg)

![Image build](https://github.com/Smoothex/erzmobil-routing/actions/workflows/build-and-push.yml/badge.svg)

# bUSnow-routing

In dieser Datei soll skizziert werden, wie die Entwicklung des Routing-Service abläuft (Stand 07/2023).

## Inhaltsverzeichnis

- [Algemeine Informationen](#algemeine-informationen)
- [Dokumentation früherer Entwicklungsphasen: Gitlab-Wiki](#dokumentation-früherer-entwicklungsphasen-gitlab-wiki)
- [Allgmeines Infos zu Entwicklungstools](#allgmeines-infos-zu-entwicklungstools)
- [Gitlab-Repo](#gitlab-repo)
- [Gitlab-Pipeline CI/CD](#gitlab-pipeline-cicd)
- [Aufgabenplanung/Tickets](#aufgabenplanungtickets)
- [Allgemeine Infos zu Entwicklungstools](#allgemeine-infos-zu-entwicklungstools)
- [GitHub-Repo](#github-repo)
- [GitHub Actions](#github-actions)
- [Algorithmen-Entwicklung in Python](#algorithmen-entwicklung-in-python)
- [Entwickeln und Debuggen](#entwickeln-und-debuggen)
- [Docker aufräumen](#docker-aufräumen)
Expand All @@ -32,21 +34,17 @@ In dieser Datei soll skizziert werden, wie die Entwicklung des Routing-Service a

Das Routing ist Teil des Backends und zuständig für die Berechnung und Otpimierung von Routen. Die eigentliche Datenverwaltung findet in einem anderen Service des Backend (Order-Service - Directus) statt.

## Dokumentation früherer Entwicklungsphasen: Gitlab-Wiki

Infomationen früherer Entwicklungsphasen (vor 2021) findet man im Gitlab-Wiki des ursprünglichen Repos.

## Allgmeines Infos zu Entwicklungstools
## Allgemeine Infos zu Entwicklungstools

### Gitlab-Repo
### GitHub-Repo

Der Quellcode für das Routing ist in diesem Gitlab-Projekt abgelegt.
Der Quellcode für das Routing ist in diesem GitHub-Projekt abgelegt.

* Achtung: die Karten-Daten im Ordner `Maps` sind im GIT-LFS (Large-FileStorage), man muss sichergehen, dass die Daten heruntergeladen wurden, ansonsten können die Tests nicht funktionieren, Workaround: Daten manuell aus Gitlab downloaden
* Achtung: die Karten-Daten im Ordner `Maps` sind im GIT-LFS (Large-FileStorage), man muss sichergehen, dass die Daten heruntergeladen wurden, ansonsten können die Tests nicht funktionieren, Workaround: Daten manuell aus GitHub downloaden

### Gitlab-Pipeline CI/CD
### GitHub Actions

Es wurde eine Gitlab-Pipeline aufgebaut, die:
Es wurde eine GitHub Actions Pipeline aufgebaut, die:

- bei jedem Commit alle Tests durchlaufen lässt
- bei jedem Merge in den Hauptzweig die neuen Images fürs Routing baut
Expand All @@ -65,7 +63,7 @@ Der Routing-Algorithmus ist in Python programmiert. Für die Lösung des Optimie

Als Online-Routingservice wurde mit `OSRM` experimentiert, teilweise können die Algorithmen auf `ORSM` zugreifen. Dafür kann man entweder den öffentlichen `OSRM`-Testserver nutzen (langsam!) oder man baut sich eine eigene Instanz (performanter!).

Die Datenbankentwicklung erfolgt mit dem sehr mächtigen Paket `Django`. Als Messaging-Service wird `RabbitMQ` verwendet. Als Datenbank fungiert `PostgreSQL`.
Die Datenbankentwicklung erfolgt mit dem Python-basierten Framework `Django`. Als Messaging-Service wird `RabbitMQ` verwendet. Als Datenbank fungiert `PostgreSQL`.

Für nebenläufige Tasks (z.B. Wartungsaufgaben im Routing-Backend) werden `celery-beat` und `celery-worker` genutzt.

Expand Down Expand Up @@ -137,7 +135,7 @@ Mit diesem Container hat man einen lokalen Routing-Server um die Api etc. zu tes
```
http://localhost:8080/routes/?startLatitude=50.684529404859774&startLongitude=12.80551264237144&stopLatitude=50.64192430537674&stopLongitude=12.81952450226538&time=2022-01-21T11%3A30%3A00%2B01%3A00&isDeparture=true&seatNumber=1&seatNumberWheelchair=0&routeId=0&routeId=0&suggestAlternatives=later
```
Damit dieser Container richtig arbeiten könnte, müsste aber lokal auch das Backend zur Verfügung gestellt werden. Ansonsten sind die Testmöglichkeiten beschränkt. Es ist möglich, das Directus-Backend anzuschließen. Alternativ für Testzwecke mit dem (nicht mehr unterstüzten) C#-Backend experimentieren.
Damit dieser Container richtig arbeiten könnte, müsste aber lokal auch das Backend zur Verfügung gestellt werden. Ansonsten sind die Testmöglichkeiten beschränkt. Es ist möglich, das Directus-Backend anzuschließen.

**Tester-Container**
```
Expand All @@ -158,7 +156,7 @@ Hiermit werden die nebenläufigen Tasks gestartet, siehe tasks.py.

### Integrationstests
* der Docker-Container "tester" führt nach dem Start die Tests aus, die Logs kann man sich in VisualStudioCode mit dem Docker-Plugin anschauen oder auch in Docker selbst
* die CI-Pipeline in Gitlab führt die Integrationstests aus
* die CI-Pipeline von GitHub Actions führt die Integrationstests aus

### Lokales Entwicklen, Debuggen und Unit-Tests

Expand All @@ -171,8 +169,7 @@ Hiermit werden die nebenläufigen Tasks gestartet, siehe tasks.py.
```
py -3.9-64 -m pip install -r requirements.txt
```
* Achtung: in Firmen-Netzwerk-Zugang über Direct Access muss man darauf achten, dass die Umgebungsvariablen für den Proxy NICHT gesetzt sind, sonst funktioniert pip install nicht
* bei Zugang mit AnyConnect kann es nötig sein, die Verbindung zu trennen
* Achtung: in Firmen-Netzwerk-Zugang über DirectAccess muss man darauf achten, dass die Umgebungsvariablen für den Proxy NICHT gesetzt sind, sonst funktioniert pip install nicht

* optional: Umgebungsvariablen in Console laden aus Datei: env.bat - scheint im Normalfall nicht nötig zu sein
* Integrationstests können theoretisch gestartet werden mit
Expand Down
3 changes: 2 additions & 1 deletion Routing_Api/Routing_Api/Mobis/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -990,7 +990,8 @@ def test_valid_request_return_gps(self):
timeElapsed = time.time() - timeStarted

# OSRM performance much better than self managed maps
self.assertGreater(0.5, timeElapsed)
# increase time because it might take a bit longer in the CI pipeline
self.assertGreater(1.5, timeElapsed)

self.assertEqual(response1.status_code, 200)
self.assertEqual(response2.status_code, 200)
Expand Down
1 change: 1 addition & 0 deletions Routing_Api/Routing_Api/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/

SECRET_KEY = os.environ.get('SECRET_KEY')

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = BUSNOW_ENVIRONMENT == 'DEBUGGING'
Expand Down
Loading

0 comments on commit 1ee8727

Please sign in to comment.