diff --git a/.gitlab-ci/terraform.yml b/.gitlab-ci/terraform.yml
index a8df14ea44b67ee9a08ed81d9ca8ca0ba11d2501..df021364cf9bc33ac55062c8e9eea649e2b4f99b 100644
--- a/.gitlab-ci/terraform.yml
+++ b/.gitlab-ci/terraform.yml
@@ -4,12 +4,10 @@
   extends: .job
   before_script:
     - ./tests/scripts/rebase.sh
+    - ./tests/scripts/testcases_prepare.sh
+    - ./tests/scripts/terraform_install.sh
     # Set Ansible config
     - cp ansible.cfg ~/.ansible.cfg
-    # Install Terraform
-    - apt-get install -y unzip
-    - curl https://releases.hashicorp.com/terraform/${TF_VERSION}/terraform_${TF_VERSION}_linux_amd64.zip > /tmp/terraform.zip
-    - unzip /tmp/terraform.zip && mv ./terraform /usr/local/bin/ && terraform --version
     # Prepare inventory
     - cp -LRp contrib/terraform/$PROVIDER/sample-inventory inventory/$CLUSTER
     - cd inventory/$CLUSTER
@@ -36,13 +34,14 @@
   only: [/^pr-.*$/]
   variables:
     ANSIBLE_INVENTORY_UNPARSED_FAILED: "true"
+    ANSIBLE_INVENTORY: hosts
+    CI_PLATFORM: tf
   script:
-    - terraform apply -auto-approve ../../contrib/terraform/$PROVIDER
-    - ansible-playbook -i hosts ../../cluster.yml --become
+    - cd ../../tests && make create-${CI_PLATFORM} -s ; cd -
+    - ansible-playbook ../../cluster.yml --become
   after_script:
     # Cleanup regardless of exit code
-    - cd inventory/$CLUSTER
-    - terraform destroy -auto-approve ../../contrib/terraform/$PROVIDER
+    - ./tests/scripts/testcases_cleanup.sh
 
 tf-validate-openstack:
   extends: .terraform_validate
diff --git a/tests/Makefile b/tests/Makefile
index b92ac7dc056e738da4c0516fab4cf3f9b7c78202..6b6956f2c4d29970a5ab8146d6c28eeb13bc98c9 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -16,6 +16,12 @@ init-packet:
 	echo $(PACKET_VM_SSH_PRIVATE_KEY) | base64 -d > $(HOME)/.ssh/id_rsa
 	chmod 400 $(HOME)/.ssh/id_rsa
 
+create-tf:
+	./scripts/create-tf.sh
+
+delete-tf:
+	./scripts/delete-tf.sh
+
 create-gce: init-gce
 	ansible-playbook cloud_playbooks/create-gce.yml -i local_inventory/hosts.cfg -c local \
 	$(LOG_LEVEL) \
diff --git a/tests/scripts/create-tf.sh b/tests/scripts/create-tf.sh
new file mode 100755
index 0000000000000000000000000000000000000000..65c1d5d1ce7eac373036aa9f252e381ea0796bf2
--- /dev/null
+++ b/tests/scripts/create-tf.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+set -euxo pipefail
+
+cd "../inventory/$CLUSTER"
+terraform apply -auto-approve "../../contrib/terraform/$PROVIDER"
diff --git a/tests/scripts/delete-tf.sh b/tests/scripts/delete-tf.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f85c6a75232c7a11a9873eb46dae32619a0178f4
--- /dev/null
+++ b/tests/scripts/delete-tf.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+set -euxo pipefail
+
+cd "../inventory/$CLUSTER"
+terraform destroy -auto-approve "../../contrib/terraform/$PROVIDER"
diff --git a/tests/scripts/terraform_install.sh b/tests/scripts/terraform_install.sh
new file mode 100755
index 0000000000000000000000000000000000000000..4228bbdd4493ae173010b37ae19531e8d3c17acc
--- /dev/null
+++ b/tests/scripts/terraform_install.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+set -euxo pipefail
+
+apt-get install -y unzip
+curl https://releases.hashicorp.com/terraform/${TF_VERSION}/terraform_${TF_VERSION}_linux_amd64.zip > /tmp/terraform.zip
+unzip /tmp/terraform.zip && mv ./terraform /usr/local/bin/ && terraform --version