diff --git a/pipeline-scripts/build_and_push_docker_image.sh b/pipeline-scripts/build_and_push_docker_image.sh
new file mode 100755
index 0000000000000000000000000000000000000000..e36a7aaf85ab066d923cb37e9eab5b5b03b6bec8
--- /dev/null
+++ b/pipeline-scripts/build_and_push_docker_image.sh
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+
+export IMAGE_TAG=$($SCRIPT_DIR/get_tag_version.sh)
+export DOCKER_REGISTRY_IMAGE=$DOCKER_REGISTRY_IMAGE
+
+if [[ "$CI_COMMIT_REF_NAME" == "main" ]]; then
+  profile="main"
+elif [[ "$CI_COMMIT_REF_NAME" == "release" ]]; then
+  profile="release"
+else
+  profile="dev"
+fi
+run_mvn.sh spring-boot:build-image -DskipTests -Dmaven.wagon.http.retryHandler.count=3 -P $profile -Ddocker.publishRegistry.username=${NEXUS_USER} -Ddocker.publishRegistry.password=${NEXUS_PASSWORD}
diff --git a/pipeline-scripts/build_maven_project.sh b/pipeline-scripts/build_maven_project.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f4ff7592b05799d458312da3bdeb1484910ca49c
--- /dev/null
+++ b/pipeline-scripts/build_maven_project.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+run_mvn.sh clean install -Dmaven.wagon.http.retryHandler.count=3 -DelasticTests.disabled=true
\ No newline at end of file
diff --git a/pipeline-scripts/check_version.sh b/pipeline-scripts/check_version.sh
new file mode 100755
index 0000000000000000000000000000000000000000..6edafe4a96f44f617670e7a88f20f060908e2025
--- /dev/null
+++ b/pipeline-scripts/check_version.sh
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+release_regex='\d+.\d+.\d+'
+snapshot_regex='\d+.\d+.\d+-SNAPSHOT'
+rootVersion=$(run_mvn.sh help:evaluate -Dexpression=project.version -q -DforceStdout)
+
+if [[ "$CI_COMMIT_REF_NAME" == "release" ]]; then
+    if ! [[ "$rootVersion" =~ $release_regex ]]; then
+        echo "Keine Release Version für Branch $CI_COMMIT_REF_NAME."
+        exit 1
+    fi
+else
+    if ! [[ "$rootVersion" =~ $snapshot_regex ]]; then
+        echo "Keine Snapshot Version für Branch $CI_COMMIT_REF_NAME."
+        exit 1
+    fi
+fi
\ No newline at end of file
diff --git a/pipeline-scripts/configure_helm.sh b/pipeline-scripts/configure_helm.sh
new file mode 100755
index 0000000000000000000000000000000000000000..65fd54f05a7381285a3dc3c8249bce2a5f912985
--- /dev/null
+++ b/pipeline-scripts/configure_helm.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+
+## install helm
+apk add --no-cache helm curl
+helm plugin install https://github.com/helm-unittest/helm-unittest.git
\ No newline at end of file
diff --git a/pipeline-scripts/configure_maven.sh b/pipeline-scripts/configure_maven.sh
new file mode 100755
index 0000000000000000000000000000000000000000..c08519befa614d2a6c52d6e45bf4f11584b1497f
--- /dev/null
+++ b/pipeline-scripts/configure_maven.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+## create maven settings file
+echo "${MAVEN_SETTINGS_BASE64}" | base64 -d > "${CI_PROJECT_DIR}/settings.xml"
+
+mv $SCRIPT_DIR/run_mvn.sh /usr/bin
\ No newline at end of file
diff --git a/pipeline-scripts/configure_python.sh b/pipeline-scripts/configure_python.sh
new file mode 100755
index 0000000000000000000000000000000000000000..0bddcc69f5dac3c30fc86f159d55b4ddd1c9df44
--- /dev/null
+++ b/pipeline-scripts/configure_python.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+apk add --no-cache python3 py3-pip
+# install pyyaml in a virtual environment
+python3 -m venv $PYTHON_VENV_PATH
+. $PYTHON_VENV_PATH/bin/activate
+pip3 install pyyaml
\ No newline at end of file
diff --git a/pipeline-scripts/deploy_maven_artifact.sh b/pipeline-scripts/deploy_maven_artifact.sh
new file mode 100755
index 0000000000000000000000000000000000000000..e6c4ef80d488932e9297ce9fe4e58376ca43eddd
--- /dev/null
+++ b/pipeline-scripts/deploy_maven_artifact.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+
+jar_version=$(run_mvn.sh help:evaluate -Dexpression=project.version -q -DforceStdout | sed "s/SNAPSHOT/${CI_COMMIT_REF_NAME:0:20}-SNAPSHOT/")
+run_mvn.sh versions:set -DnewVersion=$jar_version -DprocessAllModules=true
+run_mvn.sh deploy -DskipTests -Dmaven.wagon.http.retryHandler.count=3
\ No newline at end of file
diff --git a/pipeline-scripts/deploy_sbom_to_dependency_track.sh b/pipeline-scripts/deploy_sbom_to_dependency_track.sh
new file mode 100755
index 0000000000000000000000000000000000000000..2047443d8651ac439b95ab6ec7bfdb1fefbdead3
--- /dev/null
+++ b/pipeline-scripts/deploy_sbom_to_dependency_track.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+
+image_tag=$($SCRIPT_DIR/get_tag_version.sh)
+run_mvn.sh -P ci-build package -DskipTests
+run_mvn.sh io.github.pmckeown:dependency-track-maven-plugin:upload-bom -Ddependency-track.apiKey=$dependency_track_api_key -Ddependency-track.projectVersion=$image_tag -Ddependency-track.dependencyTrackBaseUrl=https://dependency-track.ozg-sh.de
diff --git a/pipeline-scripts/get_tag_version.sh b/pipeline-scripts/get_tag_version.sh
new file mode 100755
index 0000000000000000000000000000000000000000..15d7220f9361810474538205b4f2006a2a067f4c
--- /dev/null
+++ b/pipeline-scripts/get_tag_version.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+printf $(run_mvn.sh help:evaluate -Dexpression=project.version -q -DforceStdout | sed "s/SNAPSHOT/${CI_COMMIT_REF_NAME:0:20}-SNAPSHOT-${CI_PIPELINE_ID}/")
\ No newline at end of file
diff --git a/pipeline-scripts/perform_gitops_rollout.sh b/pipeline-scripts/perform_gitops_rollout.sh
new file mode 100755
index 0000000000000000000000000000000000000000..34dd6841cd7ede595f57048b6cb92b77b7f9dc90
--- /dev/null
+++ b/pipeline-scripts/perform_gitops_rollout.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+
+clone_gitops_repo() {
+  git clone https://$GITEA_USER:$GITEA_PASSWORD@git.ozg-sh.de/ozgcloud-devops/gitops.git
+  cd gitops
+}
+
+environment="$1"
+service_name="$2"
+service_value=$(echo $service_name | sed  "s/-/_/g")
+new_version=$($SCRIPT_DIR/get_tag_version.sh)
+
+clone_gitops_repo
+. $PYTHON_VENV_PATH/bin/activate
+python3 $SCRIPT_DIR/set_version.py "$environment/application/values/$service_name-values.yaml" "$service_value" "$new_version" || exit 1
+
+git add $environment/application/values/$service_name-values.yaml
+git commit -m "gitlab rollout $environment $service_name version $new_version"
+git push https://$GITEA_USER:$GITEA_PASSWORD@git.ozg-sh.de/ozgcloud-devops/gitops.git
\ No newline at end of file
diff --git a/pipeline-scripts/run_mvn.sh b/pipeline-scripts/run_mvn.sh
new file mode 100755
index 0000000000000000000000000000000000000000..cabd0f0c726d3c1bc58874b065c003c8f587fef6
--- /dev/null
+++ b/pipeline-scripts/run_mvn.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+mvn -s "${CI_PROJECT_DIR}/settings.xml" -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn --no-transfer-progress "$@"
+if [[ "$?" -ne 0 ]] ; then
+  echo 'Maven command failed!'; exit 1
+fi
diff --git a/pipeline-scripts/set_version.py b/pipeline-scripts/set_version.py
new file mode 100755
index 0000000000000000000000000000000000000000..51f1beaff21c9f6670fd3a3086deb8131bb60e14
--- /dev/null
+++ b/pipeline-scripts/set_version.py
@@ -0,0 +1,16 @@
+#!/usr/bin/python3
+
+import yaml
+import sys
+
+values_file = sys.argv[1]
+service_name = sys.argv[2]
+new_version = sys.argv[3]
+
+with open(values_file) as file:
+    ymldoc = yaml.safe_load(file)
+    ymldoc[service_name]['image']['tag'] = new_version
+    ymldoc[service_name]['helm']['version'] = new_version
+
+with open(values_file, "w") as ostream:
+    yaml.dump(ymldoc, ostream, default_flow_style=False, sort_keys=False)
\ No newline at end of file
diff --git a/pipeline-scripts/test_build_deploy_helm_chart.sh b/pipeline-scripts/test_build_deploy_helm_chart.sh
new file mode 100755
index 0000000000000000000000000000000000000000..5d2e91951da02aa61a8cf56aa0a7619ef8794a63
--- /dev/null
+++ b/pipeline-scripts/test_build_deploy_helm_chart.sh
@@ -0,0 +1,15 @@
+#!/usr/bin/env bash
+
+service_name="$1"
+
+helm_chart_version=$($SCRIPT_DIR/get_tag_version.sh)
+./run_helm_test.sh
+cd src/main/helm
+helm package --version=$helm_chart_version .
+
+if [[ "$CI_COMMIT_REF_NAME" == "release" ]]; then
+  repository=ozg-base-apps
+else
+  repository=ozg-base-apps-snapshot
+fi
+curl -u $NEXUS_USER:$NEXUS_PASSWORD -F file=@$service_name-$helm_chart_version.tgz https://nexus.ozg-sh.de/service/rest/v1/components?repository=$repository
diff --git a/set_up_scripts.sh b/set_up_scripts.sh
new file mode 100644
index 0000000000000000000000000000000000000000..abfb2366378006c57fe8961838ea317918dfe9f2
--- /dev/null
+++ b/set_up_scripts.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+source_dir=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+export SCRIPT_DIR="$source_dir/pipeline-scripts"
\ No newline at end of file