diff --git a/scripts/jenkins/clang-log-parser.rules b/scripts/jenkins/clang-log-parser.rules
new file mode 100644
index 0000000000000000000000000000000000000000..f14556f8570a24c6a395304d7c5be0f6a4fbd537
--- /dev/null
+++ b/scripts/jenkins/clang-log-parser.rules
@@ -0,0 +1,15 @@
+# Workflow stages used for grouping
+start /stage:/
+
+# CMake
+warning /CMake Warning/
+error /CMake Error/
+
+# CTest
+error \[*][*][*]Failed\
+
+# Clang
+
+# Clang sanitizer
+error /: runtime error:/
+error /==ERROR:/
diff --git a/scripts/jenkins/clang.groovy b/scripts/jenkins/clang.groovy
new file mode 100644
index 0000000000000000000000000000000000000000..90773b8915b57b6f6788f11d8931d3cc44268c83
--- /dev/null
+++ b/scripts/jenkins/clang.groovy
@@ -0,0 +1,46 @@
+node('docker')
+{
+	// Checks out into subdirectory ogs
+	stage 'Checkout'
+	dir('ogs') {
+ 		checkout scm
+ 	}
+
+
+	// Multiple configurations are build in parallel
+	parallel linux: {
+		docker.image('ogs6/clang-ogs-base:latest').inside
+		{
+			catchError {
+				build 'build', '-DOGS_ADDRESS_SANITIZER=ON -DOGS_UNDEFINED_BEHAVIOR_SANITIZER=ON', ''
+
+				stage 'Unit tests'
+				sh '''cd build
+			          rm -rf tests/testrunner.xml
+			          bin/testrunner --gtest_output=xml:./tests/testrunner.xml'''
+
+				stage 'End-to-end tests'
+				sh '''cd build
+			          make ctest'''
+			}
+		}
+		step([$class: 'LogParserPublisher', failBuildOnError: true, unstableOnWarning: true,
+			projectRulePath: 'ogs/scripts/jenkins/clang-log-parser.rules', useProjectRule: true])
+	}
+
+	step([$class: 'JUnitResultArchiver',
+		testResults: 'build/tests/testrunner.xml,build_win/tests/testrunner.xml'])
+
+	archive 'build*/*.tar.gz,build_win*/*.zip'
+} // end node
+
+
+def build(buildDir, cmakeOptions, target) {
+	sh "rm -rf ${buildDir} && mkdir ${buildDir}"
+
+	stage 'Configure'
+	sh "cd ${buildDir} && cmake ../ogs ${cmakeOptions}"
+
+	stage 'Build'
+	sh "cd ${buildDir} && make -j 4 ${target}"
+}