diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8fa11737a4612be3ec73784469191880a28b7292..1c9d381f04f64acc52a22b8d0e2d949e101e6e36 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,25 +1,7 @@
-# This file is a template, and might need editing before it works on your project.
-# This is a sample GitLab CI/CD configuration file that should run without any modifications.
-# It demonstrates a basic 3 stage CI/CD pipeline. Instead of real tests or scripts,
-# it uses echo commands to simulate the pipeline execution.
-#
-# A pipeline is composed of independent jobs that run scripts, grouped into stages.
-# Stages run in sequential order, but jobs within stages run in parallel.
-#
-# For more information, see: https://docs.gitlab.com/ee/ci/yaml/index.html#stages
-#
-# You can copy and paste this template into a new `.gitlab-ci.yml` file.
-# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
-#
-# To contribute improvements to CI/CD templates, please follow the Development guide at:
-# https://docs.gitlab.com/ee/development/cicd/templates.html
-# This specific template is located at:
-# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Getting-Started.gitlab-ci.yml
-
-#default:
-#  tags:
-#    - docker
-#  image: python:3.10-slim-buster
+default:         # Set default
+  tags:
+    - docker
+  image: python:3.10-slim-buster
 
 stages:          # List of stages for jobs, and their order of execution
   - build
@@ -29,22 +11,27 @@ stages:          # List of stages for jobs, and their order of execution
 build-job:       # This job runs in the build stage, which runs first.
   stage: build
   script:
-    - echo "Compiling the code..."
-    - echo "Compile complete."
+    - pip install -r requirements.txt
+    - pip install -r requirements-dev.txt
+    - pip install -e .
 
 unit-test-job:   # This job runs in the test stage.
   stage: test    # It only starts when the job in the build stage completes successfully.
   script:
-    - echo "Running unit tests... This will take about 60 seconds."
-    - sleep 60
-    - echo "Code coverage is 90%"
+    - pip install -r requirements.txt
+    - pip install -r requirements-dev.txt
+    - pip install -e .
+    - coverage run --source readsequencer -m pytest
+    - coverage report -m
 
 lint-test-job:   # This job also runs in the test stage.
   stage: test    # It can run at the same time as unit-test-job (in parallel).
   script:
-    - echo "Linting code... This will take about 10 seconds."
-    - sleep 10
-    - echo "No lint issues found."
+    - pip install -r requirements.txt
+    - pip install -r requirements-dev.txt
+    - pip install -e .
+    #- flake8 --docstring-convention google readsequencer/ tests/
+    #- pylint readsequencer/ tests/
 
 deploy-job:      # This job runs in the deploy stage.
   stage: deploy  # It only runs when *both* jobs in the test stage complete successfully.
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bb3fee8e048b956725918f8fd8df3a557cffa3e7
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,2 @@
+Bio
+argparse
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 39b68b402d8f77d09a6446ace93303ab86598825..8a94d0d97f65a2f1a6dd9f9ce80635f5454f7fca 100644
--- a/setup.py
+++ b/setup.py
@@ -1,4 +1,8 @@
 from setuptools import setup, find_packages
+from pathlib import Path
+project_root_dir = Path(__file__).parent.resolve()
+with open(project_root_dir / "requirements.txt", "r", encoding="utf-8") as _file:
+    INSTALL_REQUIRES = _file.read().splitlines()
 
 setup(
     name='readsequencer',
@@ -9,6 +13,6 @@ setup(
     author_email='christoph.harmel@unibas.ch',
     description='Simulates sequencing with a specified read length from sequences specified by a FASTA file.',
     packages=find_packages(),
-    install_requires=['Bio','argparse'],
+    install_requires=INSTALL_REQUIRES,
     entry_points={'console_scripts': ['readsequencer=readsequencer.cli:main']}
 )