diff --git a/vars/backendServicePipeline.groovy b/vars/backendServicePipeline.groovy
index e0dba6e3c7ff85d03d6e482a3d81fded25f88e08..581554d5a5a9aaba028281168c9898401dbb4630 100644
--- a/vars/backendServicePipeline.groovy
+++ b/vars/backendServicePipeline.groovy
@@ -1,6 +1,6 @@
 def call(String repo, String branch, String serviceName) {
     pipeline {
-  agent any
+  agent { label 'master' }
   tools {
         go 'go-1.16'
   }
diff --git a/vars/backendTestServicePipeline.groovy b/vars/backendTestServicePipeline.groovy
new file mode 100644
index 0000000000000000000000000000000000000000..eef28313c0f7b70d3becbbfd603a284a69b35a33
--- /dev/null
+++ b/vars/backendTestServicePipeline.groovy
@@ -0,0 +1,76 @@
+def call(String repo, String branch, String serviceName) {
+    pipeline {
+  agent { label 'node2' }
+  parameters {
+    string{
+      name: "BRANCH_NAME",
+      defaultValue: "",
+      description: "Branch to use"
+    }
+  }
+  tools {
+        go 'go-1.16'
+  }
+  options {
+    buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '5', daysToKeepStr: '', numToKeepStr: '5')
+  }
+  stages {
+      
+  stage('checkout') {
+        steps {
+            git branch: "${BRANCH_NAME}",
+                credentialsId: 'tucker-gitlab-login',
+                url: repo
+        }
+    }
+     
+    stage('test') {
+      steps {
+        sh """
+            dawn-cli test
+        """ 
+      }
+    }
+
+    stage('build') {
+      steps {
+        sh """
+            dawn-cli build-image -p .
+        """ 
+      }
+    }
+
+    stage('update backend services') {
+      steps {
+        sh '''
+            curl -o docker-compose-dev.yml --header "PRIVATE-TOKEN: y2FHtFXMC8X13onnEfiE" "https://gitlab.cs.umd.edu/api/v4/projects/16574/repository/files/docker-compose-dev.yml/raw?ref=main"
+            curl -o shared-compose.yml --header "PRIVATE-TOKEN: y2FHtFXMC8X13onnEfiE" "https://gitlab.cs.umd.edu/api/v4/projects/16574/repository/files/shread-compose.yml/raw?ref=main"
+            curl -o prometheus.yml --header "PRIVATE-TOKEN: y2FHtFXMC8X13onnEfiE" "https://gitlab.cs.umd.edu/api/v4/projects/16574/repository/files/prometheus.yml/raw?ref=main"
+            curl -o prometheus.rules.yml --header "PRIVATE-TOKEN: y2FHtFXMC8X13onnEfiE" "https://gitlab.cs.umd.edu/api/v4/projects/16574/repository/files/prometheus.rules.yml/raw?ref=main"
+            curl -o rabbitmq.conf --header "PRIVATE-TOKEN: y2FHtFXMC8X13onnEfiE" "https://gitlab.cs.umd.edu/api/v4/projects/16574/repository/files/rabbitmq.conf/raw?ref=main"
+            
+            mkdir elk_config || true
+            curl -o logstash-compose.yml --header "PRIVATE-TOKEN: y2FHtFXMC8X13onnEfiE" "https://gitlab.cs.umd.edu/api/v4/projects/16574/repository/files/logstash-compose.conf/raw?ref=main"
+            curl -o elk_config/elasticsearch.yml --header "PRIVATE-TOKEN: y2FHtFXMC8X13onnEfiE" "https://gitlab.cs.umd.edu/api/v4/projects/16574/repository/files/elk_config%2Felasticsearch.yml/raw?ref=main"
+            curl -o elk_config/filebeat.yml --header "PRIVATE-TOKEN: y2FHtFXMC8X13onnEfiE" "https://gitlab.cs.umd.edu/api/v4/projects/16574/repository/files/elk_config%2Ffilebeat.yml/raw?ref=main"
+        '''
+        sh "dawn-cli update -s ${serviceName}"
+      }
+    }
+
+    stage('cleanup') {
+        steps {
+            sh '''
+                docker rmi $(docker images | grep "dawn/.*-test" | awk '{print $3}') --force || true
+            '''
+        }
+    }
+
+  }
+  post {
+        always {
+              cobertura autoUpdateHealth: false, autoUpdateStability: false, coberturaReportFile: '**/coverage.xml', enableNewApi: true, failUnhealthy: false, failUnstable: false, lineCoverageTargets: '80, 40, 60', maxNumberOfBuilds: 0, onlyStable: false, sourceEncoding: 'ASCII', zoomCoverageChart: false
+        }
+    }
+}
+}
\ No newline at end of file