From d019e596b7ad520655467872addea8b485db203e Mon Sep 17 00:00:00 2001
From: Martin Weise <martin.weise@tuwien.ac.at>
Date: Fri, 19 Jan 2024 15:23:22 +0100
Subject: [PATCH] Updated README and scripts

---
 .gitlab/logo.png              | Bin 0 -> 11815 bytes
 .scripts/docker-prune.sh      |   5 ----
 Makefile                      |   6 ++--
 README.md                     |  50 ++++++++++++++++++++++++++++++++--
 bin/build-docker.sh           |   4 +++
 {.scripts => bin}/teardown.sh |   0
 bin/test.sh                   |  12 ++++++++
 requirements.txt              |   8 ------
 8 files changed, 66 insertions(+), 19 deletions(-)
 create mode 100644 .gitlab/logo.png
 delete mode 100755 .scripts/docker-prune.sh
 create mode 100644 bin/build-docker.sh
 rename {.scripts => bin}/teardown.sh (100%)
 create mode 100644 bin/test.sh
 delete mode 100644 requirements.txt

diff --git a/.gitlab/logo.png b/.gitlab/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..d34412dab6e6be0ae66e8c9f35f42c0a7bcf437e
GIT binary patch
literal 11815
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

literal 0
HcmV?d00001

diff --git a/.scripts/docker-prune.sh b/.scripts/docker-prune.sh
deleted file mode 100755
index c82dc1b674..0000000000
--- a/.scripts/docker-prune.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/bash
-if [[ "$CI_COMMIT_BRANCH" =~ (dev|master) ]]; then
-  echo "pruning for branch ${CI_COMMIT_BRANCH} ..."
-  docker system prune -f -a --volumes
-fi
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 5f39f77cc7..79f8d5e104 100644
--- a/Makefile
+++ b/Makefile
@@ -28,9 +28,7 @@ build-analyse-service:
 	bash ./dbrepo-analyse-service/build.sh
 
 build-docker:
-	docker build --network=host -t dbrepo-metadata-service:build --target build dbrepo-metadata-service
-	docker build --network=host -t dbrepo-data-service:build --target build dbrepo-data-service
-	docker compose build --parallel
+	bash ./bin/build-docker.sh
 
 build-frontend:
 	yarn --cwd ./dbrepo-ui install --legacy-peer-deps
@@ -220,7 +218,7 @@ test-clients:
 test: test-backend test-frontend
 
 teardown:
-	./.scripts/teardown.sh
+	./bin/teardown.sh
 
 docs: build-docker
 	docker compose up -d || docker compose down
diff --git a/README.md b/README.md
index 4b38972edd..98b4d3798f 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@
 [![license](.gitlab/license.svg)](https://opensource.org/licenses/Apache-2.0)
 [![release](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/badges/release.svg)](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags)
 
-<img src="./dbrepo-ui/static/logo.png" alt="DBREPO &mdash; Repository for Data in Databases" width="200" />
+![DBRepo &mdash; Repository for Data in Databases](./.gitlab/logo.png)
 
 ## tl;dr
 
@@ -14,16 +14,62 @@ with:
 curl -sSL https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/install.sh | bash
 ```
 
+## Run
+
+tbd
+
 ## Documentation
 
 Find a system description, component documentation and endpoint documentation 
 online: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/.
 
-## Contribute
+## Development
 
 Contributions are always welcome and encouraged, please read the [contribution overview](./CONTRIBUTING.md) and
 contact [Prof. Andreas Rauber](http://www.ifs.tuwien.ac.at/~andi/) or [Martin Weise](https://ec.tuwien.ac.at/~weise/).
 
+### Build
+
+Install the build dependencies under Debian 
+12 ([Instructions for Docker Engine](https://docs.docker.com/engine/install/debian/#install-using-the-repository)):
+
+```console
+$ apt install -y bash maven openjdk-17-jdk nodejs && npm install --global yarn
+$ node --version
+v18.19.0
+```
+
+Build the Docker containers:
+
+```console
+./bin/build-docker.sh
+```
+
+### Test
+
+Install the [build dependencies](#build) as they also cover the test dependencies.
+
+Test the backend and frontend:
+
+```console
+./bin/test.sh
+```
+
+## Run
+
+After [building the docker containers](#build) you can run them using the default `docker-compose.yml` in the root of
+the sourcecode directory. This starts all services in the background (as daemons hence the `-d` flag).
+
+```console
+$ docker compose up -d
+```
+
+Optionally view all logs in real-time:
+
+```console
+$ docker compose logs -f
+```
+
 ## Acknowledgements
 
 We want to thank the following organizations:
diff --git a/bin/build-docker.sh b/bin/build-docker.sh
new file mode 100644
index 0000000000..e58ec77e3c
--- /dev/null
+++ b/bin/build-docker.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+docker build -t dbrepo-metadata-service:build --target build dbrepo-metadata-service
+docker build -t dbrepo-data-service:build --target build dbrepo-data-service
+docker compose build --parallel
\ No newline at end of file
diff --git a/.scripts/teardown.sh b/bin/teardown.sh
similarity index 100%
rename from .scripts/teardown.sh
rename to bin/teardown.sh
diff --git a/bin/test.sh b/bin/test.sh
new file mode 100644
index 0000000000..765ecaf6b7
--- /dev/null
+++ b/bin/test.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+mvn -f ./dbrepo-metadata-service/pom.xml clean install -DskipTests
+# test java services
+mvn -f ./dbrepo-metadata-service/pom.xml clean test verify
+mvn -f ./dbrepo-data-service/pom.xml clean test verify
+# test python services
+bash ./dbrepo-analyse-service/test.sh
+bash ./dbrepo-search-service/test.sh
+# test ui
+yarn --cwd ./dbrepo-ui install
+yarn --cwd ./dbrepo-ui run test:unit
+yarn --cwd ./dbrepo-ui run coverage
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index c7dd197a44..0000000000
--- a/requirements.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-mkdocs==1.4.3
-mkdocs-material==9.1.17
-mkdocs-with-pdf==0.9.3
-mkdocs-material-extensions>=1.0.3
-requests>=2.27.0
-py-dotenv>=0.1
-python-dotenv==1.0.0
-requests==2.31.0
\ No newline at end of file
-- 
GitLab