diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 33dd5b7ce8e2d68da4154720560718138c797c18..37d0199ee01c08b586ed61fecf9487dee12aa5cb 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -24,6 +24,7 @@ variables:
 include:
   - template: Jobs/Secret-Detection.gitlab-ci.yml
   - template: Workflows/MergeRequest-Pipelines.gitlab-ci.yml
+  - local: .gitlab/ci/deploy-parallel-matrix.gitlab-ci.yml
 
 stages:
   - build
diff --git a/.gitlab/ci/deploy-parallel-matrix.gitlab-ci.yml b/.gitlab/ci/deploy-parallel-matrix.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d224c062793febd10df0fa52d90f32306a095432
--- /dev/null
+++ b/.gitlab/ci/deploy-parallel-matrix.gitlab-ci.yml
@@ -0,0 +1,42 @@
+---
+deploy-workshop:
+  stage: deploy
+  image: docker.io/dokku/ci-docker-image:0.9.3
+  rules: !reference [.upstream-deploy-production-rules, rules]
+  variables:
+    APP_NAME: "spring-petclinic-rest-$PARTICIPANT_NAME"
+    GIT_DEPTH: "0"
+    SSH_REMOTE: "ssh://dokku@dokku-ppl.cs.ui.ac.id:22"
+    GIT_REMOTE_URL: "$SSH_REMOTE/$APP_NAME"
+    SSH_PRIVATE_KEY: $PRODUCTION_SSH_PRIVATE_KEY
+    BRANCH: $CI_DEFAULT_BRANCH
+  script:
+    - dokku-deploy
+    - sh .gitlab/dokku-ci-post-deploy.sh
+  after_script:
+    - dokku-unlock
+  parallel:
+    matrix:
+      - PARTICIPANT_NAME:
+          - fatimah
+          - rezha
+          - sri
+          - wida
+          - niea
+          - yopi
+          - budi
+          - winayaka
+          - fakhri
+          - ratu
+          - adit
+          - meitya
+          - ganda
+          - pahmil
+          - sonya
+          - kamrozi
+  environment:
+    name: workshop/$PARTICIPANT_NAME
+    url: "https://$APP_NAME.dokku-ppl.cs.ui.ac.id"
+  needs:
+    - test
+  dependencies: []