diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2aab53a5be714e644b733c1fb1b28630de68efa0..1b5e8a6a7e30c35c156f129522b00a5691e9cb05 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,10 +1,9 @@
 stages:
-  - deploy-do
-  - moderator
   - unit-tests
-  - deploy-gce-part1
-  - deploy-gce-part2
-  - deploy-gce-special
+  - moderator
+  - deploy-part1
+  - deploy-part2
+  - deploy-special
 
 variables:
   FAILFASTCI_NAMESPACE: 'kargo-ci'
@@ -24,7 +23,7 @@ variables:
   RESET_CHECK: "false"
   UPGRADE_TEST: "false"
   KUBEADM_ENABLED: "false"
-  LOG_LEVEL: "-vvv"
+  LOG_LEVEL: "-vv"
 
 # asia-east1-a
 # asia-northeast1-a
@@ -58,7 +57,7 @@ before_script:
   CI_PLATFORM: "gce"
   PRIVATE_KEY: $GCE_PRIVATE_KEY
 
-.do_variableS: &do_variables
+.do_variables: &do_variables
   PRIVATE_KEY: $DO_PRIVATE_KEY
   CI_PLATFORM: "do"
   SSH_USER: root
@@ -236,253 +235,74 @@ before_script:
     <<: *do_variables
   <<: *testcases
 
-# .do: &do
-#   <<: *job
-#   <<: *gce
-#   cache:
-#     key: "$CI_BUILD_REF_NAME"
-#     paths:
-#       - downloads/
-#       - $HOME/.cache
-#   before_script:
-#     - docker info
-#     - pip install ansible==2.2.1.0
-#     - pip install netaddr
-#     - pip install apache-libcloud==0.20.1
-#     - pip install boto==2.9.0
-#     - pip install dopy==0.3.5
-#     - mkdir -p /.ssh
-#     - mkdir -p $HOME/.ssh
-#     - echo $DO_PRIVATE_KEY | base64 -d > $HOME/.ssh/id_rsa
-#     - chmod 400 $HOME/.ssh/id_rsa
-#     - md5sum ~/.ssh/id_rsa
-#     - ansible-playbook --version
-#     - export PYPATH=$([ $BOOTSTRAP_OS = coreos ] && echo /opt/bin/python || echo /usr/bin/python )
-#     - echo $PYPATH
-#   script:
-#     - pwd
-#     - ls
-#     - echo ${PWD}
-#     - >
-#       ansible-playbook tests/cloud_playbooks/create-do.yml -i tests/local_inventory/hosts.cfg -c local
-#       ${LOG_LEVEL}
-#       -e cloud_image=${CLOUD_IMAGE}
-#       -e cloud_region=${CLOUD_REGION}
-#       -e inventory_path=${PWD}/inventory/inventory.ini
-#       -e kube_network_plugin=${KUBE_NETWORK_PLUGIN}
-#       -e mode=${CLUSTER_MODE}
-#       -e test_id=${TEST_ID}
-
-#     # Check out latest tag if testing upgrade
-#     # Uncomment when gitlab kargo repo has tags
-#     #- test "${UPGRADE_TEST}" = "true" && git fetch --all && git checkout $(git describe --tags $(git rev-list --tags --max-count=1))
-#     - test "${UPGRADE_TEST}" = "true" && git checkout 031cf565ec3ccd3ebbe80eeef3454c3780e5c598 && pip install ansible==2.2.0
-
-
-#     # Create cluster
-#     - >
-#       ansible-playbook -i inventory/inventory.ini -b --become-user=root --private-key=${HOME}/.ssh/id_rsa -u root
-#       ${SSH_ARGS}
-#       ${LOG_LEVEL}
-#       -e state=present
-#       -e ansible_python_interpreter=${PYPATH}
-#       -e ansible_ssh_user=root
-#       -e bootstrap_os=${BOOTSTRAP_OS}
-#       -e cert_management=${CERT_MGMT:-script}
-#       -e cloud_provider=gce
-#       -e deploy_netchecker=true
-#       -e download_localhost=true
-#       -e download_run_once=true
-#       -e etcd_deployment_type=${ETCD_DEPLOYMENT}
-#       -e kube_network_plugin=${KUBE_NETWORK_PLUGIN}
-#       -e kubelet_deployment_type=${KUBELET_DEPLOYMENT}
-#       -e local_release_dir=${PWD}/downloads
-#       -e resolvconf_mode=${RESOLVCONF_MODE}
-#       -e vault_deployment_type=${VAULT_DEPLOYMENT}
-#       cluster.yml
-
-#     # Repeat deployment if testing upgrade
-#     #FIXME(mattymo): repeat "Create cluster" above without duplicating code
-#     - >
-#       if [ "${UPGRADE_TEST}" = "true" ]; then
-#       pip install ansible==2.2.1.0;
-#       git checkout "${CI_BUILD_REF}";
-#       ansible-playbook -i inventory/inventory.ini -b --become-user=root --private-key=${HOME}/.ssh/id_rsa -u root
-#       ${SSH_ARGS}
-#       ${LOG_LEVEL}
-#       -e ansible_python_interpreter=${PYPATH}
-#       -e ansible_ssh_user=root
-#       -e bootstrap_os=${BOOTSTRAP_OS}
-#       -e cloud_provider=gce
-#       -e deploy_netchecker=true
-#       -e download_localhost=true
-#       -e download_run_once=true
-#       -e etcd_deployment_type=${ETCD_DEPLOYMENT}
-#       -e kube_network_plugin=${KUBE_NETWORK_PLUGIN}
-#       -e kubelet_deployment_type=${KUBELET_DEPLOYMENT}
-#       -e local_release_dir=${PWD}/downloads
-#       -e resolvconf_mode=${RESOLVCONF_MODE}
-#       -e weave_cpu_requests=${WEAVE_CPU_LIMIT}
-#       -e weave_cpu_limit=${WEAVE_CPU_LIMIT}
-#       cluster.yml;
-#       fi
-
-#     # Tests Cases
-#     ## Test Master API
-#     - ansible-playbook -i inventory/inventory.ini -e ansible_python_interpreter=${PYPATH} -u root -e ansible_ssh_user=root $SSH_ARGS -b --become-user=root tests/testcases/010_check-apiserver.yml $LOG_LEVEL
-
-#     ## Ping the between 2 pod
-#     - ansible-playbook -i inventory/inventory.ini -e ansible_python_interpreter=${PYPATH} -u root -e ansible_ssh_user=root $SSH_ARGS -b --become-user=root tests/testcases/030_check-network.yml $LOG_LEVEL
-
-#     ## Advanced DNS checks
-#     - ansible-playbook -i inventory/inventory.ini -e ansible_python_interpreter=${PYPATH} -u root -e ansible_ssh_user=root $SSH_ARGS -b --become-user=root tests/testcases/040_check-network-adv.yml $LOG_LEVEL
-
-#     ## Idempotency checks 1/5 (repeat deployment)
-#     - >
-#       if [ "${IDEMPOT_CHECK}" = "true" ]; then
-#       ansible-playbook -i inventory/inventory.ini -u root -e ansible_ssh_user=root $SSH_ARGS
-#       -b --become-user=root -e cloud_provider=gce $LOG_LEVEL -e kube_network_plugin=${KUBE_NETWORK_PLUGIN}
-#       --private-key=${HOME}/.ssh/id_rsa
-#       -e bootstrap_os=${BOOTSTRAP_OS}
-#       -e ansible_python_interpreter=${PYPATH}
-#       -e download_run_once=true
-#       -e download_localhost=true
-#       -e deploy_netchecker=true
-#       -e resolvconf_mode=${RESOLVCONF_MODE}
-#       -e local_release_dir=${PWD}/downloads
-#       -e etcd_deployment_type=${ETCD_DEPLOYMENT}
-#       -e kubelet_deployment_type=${KUBELET_DEPLOYMENT}
-#       cluster.yml;
-#       fi
-
-#     ## Idempotency checks 2/5 (Advanced DNS checks)
-#     - >
-#       if [ "${IDEMPOT_CHECK}" = "true" ]; then
-#       ansible-playbook -i inventory/inventory.ini -e ansible_python_interpreter=${PYPATH}
-#       -u root -e ansible_ssh_user=root $SSH_ARGS -b --become-user=root
-#       tests/testcases/040_check-network-adv.yml $LOG_LEVEL;
-#       fi
-
-#     ## Idempotency checks 3/5 (reset deployment)
-#     - >
-#       if [ "${IDEMPOT_CHECK}" = "true" ]; then
-#       ansible-playbook -i inventory/inventory.ini -u root -e ansible_ssh_user=root $SSH_ARGS
-#       -b --become-user=root -e cloud_provider=gce $LOG_LEVEL -e kube_network_plugin=${KUBE_NETWORK_PLUGIN}
-#       --private-key=${HOME}/.ssh/id_rsa
-#       -e bootstrap_os=${BOOTSTRAP_OS}
-#       -e ansible_python_interpreter=${PYPATH}
-#       reset.yml;
-#       fi
-
-#     ## Idempotency checks 4/5 (redeploy after reset)
-#     - >
-#       if [ "${IDEMPOT_CHECK}" = "true" ]; then
-#       ansible-playbook -i inventory/inventory.ini -u root -e ansible_ssh_user=root $SSH_ARGS
-#       -b --become-user=root -e cloud_provider=gce $LOG_LEVEL -e kube_network_plugin=${KUBE_NETWORK_PLUGIN}
-#       --private-key=${HOME}/.ssh/id_rsa
-#       -e bootstrap_os=${BOOTSTRAP_OS}
-#       -e ansible_python_interpreter=${PYPATH}
-#       -e download_run_once=true
-#       -e download_localhost=true
-#       -e deploy_netchecker=true
-#       -e resolvconf_mode=${RESOLVCONF_MODE}
-#       -e local_release_dir=${PWD}/downloads
-#       -e etcd_deployment_type=${ETCD_DEPLOYMENT}
-#       -e kubelet_deployment_type=${KUBELET_DEPLOYMENT}
-#       cluster.yml;
-#       fi
-
-#     ## Idempotency checks 5/5 (Advanced DNS checks)
-#     - >
-#       if [ "${IDEMPOT_CHECK}" = "true" ]; then
-#       ansible-playbook -i inventory/inventory.ini -e ansible_python_interpreter=${PYPATH}
-#       -u root -e ansible_ssh_user=root $SSH_ARGS -b --become-user=root
-#       tests/testcases/040_check-network-adv.yml $LOG_LEVEL;
-#       fi
-
-#   after_script:
-#     - >
-#       ansible-playbook -i inventory/inventory.ini tests/cloud_playbooks/create-do.yml -c local  $LOG_LEVEL
-#       -e state=absent
-#       -e mode=${CLUSTER_MODE}
-#       -e test_id=${TEST_ID}
-#       -e kube_network_plugin=${KUBE_NETWORK_PLUGIN}
-#       -e gce_project_id=${GCE_PROJECT_ID}
-#       -e gce_service_account_email=${GCE_ACCOUNT}
-#       -e gce_credentials_file=${HOME}/.ssh/gce.json
-#       -e cloud_image=${CLOUD_IMAGE}
-#       -e inventory_path=${PWD}/inventory/inventory.ini
-#       -e cloud_region=${CLOUD_REGION}
-
 # Test matrix. Leave the comments for markup scripts.
 .coreos_calico_aio_variables: &coreos_calico_aio_variables
-# stage: deploy-gce-part1
+# stage: deploy-part1
   MOVED_TO_GROUP_VARS: "true"
 
 .ubuntu_canal_ha_variables: &ubuntu_canal_ha_variables
-# stage: deploy-gce-part1
+# stage: deploy-part1
   UPGRADE_TEST: "graceful"
 
 .centos_weave_kubeadm_variables: &centos_weave_kubeadm_variables
-# stage: deploy-gce-part1
+# stage: deploy-part1
   UPGRADE_TEST: "graceful"
 
 .ubuntu_canal_kubeadm_variables: &ubuntu_canal_kubeadm_variables
-# stage: deploy-gce-part1
+# stage: deploy-part1
   MOVED_TO_GROUP_VARS: "true"
 
 .ubuntu_contiv_sep_variables: &ubuntu_contiv_sep_variables
-# stage: deploy-gce-special
+# stage: deploy-special
   MOVED_TO_GROUP_VARS: "true"
 
 .rhel7_weave_variables: &rhel7_weave_variables
-# stage: deploy-gce-part1
+# stage: deploy-part1
   MOVED_TO_GROUP_VARS: "true"
 
 .centos7_flannel_addons_variables: &centos7_flannel_addons_variables
-# stage: deploy-gce-part2
+# stage: deploy-part2
   MOVED_TO_GROUP_VARS: "true"
 
 .debian8_calico_variables: &debian8_calico_variables
-# stage: deploy-gce-part2
+# stage: deploy-part2
   MOVED_TO_GROUP_VARS: "true"
 
 .coreos_canal_variables: &coreos_canal_variables
-# stage: deploy-gce-part2
+# stage: deploy-part2
   MOVED_TO_GROUP_VARS: "true"
 
 .rhel7_canal_sep_variables: &rhel7_canal_sep_variables
-# stage: deploy-gce-special
+# stage: deploy-special
   MOVED_TO_GROUP_VARS: "true"
 
 .ubuntu_weave_sep_variables: &ubuntu_weave_sep_variables
-# stage: deploy-gce-special
+# stage: deploy-special
   MOVED_TO_GROUP_VARS: "true"
 
 .centos7_calico_ha_variables: &centos7_calico_ha_variables
-# stage: deploy-gce-special
+# stage: deploy-special
   MOVED_TO_GROUP_VARS: "true"
 
 .coreos_alpha_weave_ha_variables: &coreos_alpha_weave_ha_variables
-# stage: deploy-gce-special
+# stage: deploy-special
   MOVED_TO_GROUP_VARS: "true"
 
 .ubuntu_rkt_sep_variables: &ubuntu_rkt_sep_variables
-# stage: deploy-gce-part1
+# stage: deploy-part1
   MOVED_TO_GROUP_VARS: "true"
 
 .ubuntu_vault_sep_variables: &ubuntu_vault_sep_variables
-# stage: deploy-gce-part1
+# stage: deploy-part1
   MOVED_TO_GROUP_VARS: "true"
 
 .ubuntu_flannel_variables: &ubuntu_flannel_variables
-# stage: deploy-gce-special
+# stage: deploy-special
   MOVED_TO_GROUP_VARS: "true"
 
 # Builds for PRs only (premoderated by unit-tests step) and triggers (auto)
-coreos-calico-aio:
-  stage: deploy-do
-  # stage: deploy-gce-part1
+gce_coreos-calico-aio:
+  stage: deploy-part1
   <<: *job
   <<: *gce
   variables:
@@ -490,327 +310,327 @@ coreos-calico-aio:
     <<: *gce_variables
   when: on_success
   except: ['triggers']
-  # only: [/^pr-.*$/]
+  only: [/^pr-.*$/]
 
-ubuntu-canal-ha-do:
-  stage: deploy-do
+do_ubuntu-canal-ha:
+  stage: deploy-part1
   <<: *job
   <<: *do
   variables:
     <<: *do_variables
   when: on_success
   except: ['triggers']
-  # only: [/^pr-.*$/]
-
-# coreos-calico-sep-triggers:
-#   stage: deploy-gce-part1
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *coreos_calico_aio_variables
-#   when: on_success
-#   only: ['triggers']
-
-# centos7-flannel-addons:
-#   stage: deploy-gce-part2
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *centos7_flannel_addons_variables
-#   when: on_success
-#   except: ['triggers']
-#   only: [/^pr-.*$/]
-
-# centos7-flannel-addons-triggers:
-#   stage: deploy-gce-part1
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *centos7_flannel_addons_variables
-#   when: on_success
-#   only: ['triggers']
-
-# ubuntu-weave-sep:
-#   stage: deploy-gce-special
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *ubuntu_weave_sep_variables
-#   when: on_success
-#   except: ['triggers']
-#   only: [/^pr-.*$/]
-
-# ubuntu-weave-sep-triggers:
-#   stage: deploy-gce-part1
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *ubuntu_weave_sep_variables
-#   when: on_success
-#   only: ['triggers']
-
-# # More builds for PRs/merges (manual) and triggers (auto)
-# ubuntu-canal-ha:
-#   stage: deploy-gce-part1
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *ubuntu_canal_ha_variables
-#   when: manual
-#   except: ['triggers']
-#   only: ['master', /^pr-.*$/]
-
-# ubuntu-canal-ha-triggers:
-#   stage: deploy-gce-part1
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *ubuntu_canal_ha_variables
-#   when: on_success
-#   only: ['triggers']
-
-# ubuntu-canal-kubeadm:
-#   stage: deploy-gce-part1
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *ubuntu_canal_kubeadm_variables
-#   when: manual
-#   except: ['triggers']
-#   only: ['master', /^pr-.*$/]
-
-# ubuntu-canal-kubeadm-triggers:
-#   stage: deploy-gce-part1
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *ubuntu_canal_kubeadm_variables
-#   when: on_success
-#   only: ['triggers']
-
-# centos-weave-kubeadm:
-#   stage: deploy-gce-part1
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *centos_weave_kubeadm_variables
-#   when: manual
-#   except: ['triggers']
-#   only: ['master', /^pr-.*$/]
-
-# centos-weave-kubeadm-triggers:
-#   stage: deploy-gce-part1
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *centos_weave_kubeadm_variables
-#   when: on_success
-#   only: ['triggers']
-
-# ubuntu-contiv-sep:
-#   stage: deploy-gce-special
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *ubuntu_contiv_sep_variables
-#   when: manual
-#   except: ['triggers']
-#   only: ['master', /^pr-.*$/]
-
-# rhel7-weave:
-#   stage: deploy-gce-part1
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *rhel7_weave_variables
-#   when: manual
-#   except: ['triggers']
-#   only: ['master', /^pr-.*$/]
-
-# rhel7-weave-triggers:
-#   stage: deploy-gce-part1
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *rhel7_weave_variables
-#   when: on_success
-#   only: ['triggers']
-
-# debian8-calico-upgrade:
-#   stage: deploy-gce-part2
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *debian8_calico_variables
-#   when: manual
-#   except: ['triggers']
-#   only: ['master', /^pr-.*$/]
-
-# debian8-calico-triggers:
-#   stage: deploy-gce-part1
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *debian8_calico_variables
-#   when: on_success
-#   only: ['triggers']
-
-# coreos-canal:
-#   stage: deploy-gce-part2
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *coreos_canal_variables
-#   when: manual
-#   except: ['triggers']
-#   only: ['master', /^pr-.*$/]
-
-# coreos-canal-triggers:
-#   stage: deploy-gce-part1
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *coreos_canal_variables
-#   when: on_success
-#   only: ['triggers']
-
-# rhel7-canal-sep:
-#   stage: deploy-gce-special
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *rhel7_canal_sep_variables
-#   when: manual
-#   except: ['triggers']
-#   only: ['master', /^pr-.*$/,]
-
-# rhel7-canal-sep-triggers:
-#   stage: deploy-gce-part1
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *rhel7_canal_sep_variables
-#   when: on_success
-#   only: ['triggers']
-
-# centos7-calico-ha:
-#   stage: deploy-gce-special
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *centos7_calico_ha_variables
-#   when: manual
-#   except: ['triggers']
-#   only: ['master', /^pr-.*$/]
-
-# centos7-calico-ha-triggers:
-#   stage: deploy-gce-part1
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *centos7_calico_ha_variables
-#   when: on_success
-#   only: ['triggers']
-
-# # no triggers yet https://github.com/kubernetes-incubator/kargo/issues/613
-# coreos-alpha-weave-ha:
-#   stage: deploy-gce-special
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *coreos_alpha_weave_ha_variables
-#   when: manual
-#   except: ['triggers']
-#   only: ['master', /^pr-.*$/]
-
-# ubuntu-rkt-sep:
-#   stage: deploy-gce-part1
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *ubuntu_rkt_sep_variables
-#   when: manual
-#   except: ['triggers']
-#   only: ['master', /^pr-.*$/]
-
-# ubuntu-vault-sep:
-#   stage: deploy-gce-part1
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *ubuntu_vault_sep_variables
-#   when: manual
-#   except: ['triggers']
-#   only: ['master', /^pr-.*$/]
-
-# ubuntu-flannel-sep:
-#   stage: deploy-gce-special
-#   <<: *job
-#   <<: *gce
-#   variables:
-#     <<: *gce_variables
-#     <<: *ubuntu_flannel_variables
-#   when: manual
-#   except: ['triggers']
-#   only: ['master', /^pr-.*$/]
-
-# # Premoderated with manual actions
-# ci-authorized:
-#   <<: *job
-#   stage: moderator
-#   before_script:
-#     - apt-get -y install jq
-#   script:
-#     - /bin/sh scripts/premoderator.sh
-#   except: ['triggers', 'master']
-
-# syntax-check:
-#   <<: *job
-#   stage: unit-tests
-#   script:
-#     - ansible-playbook -i inventory/local-tests.cfg -u root -e ansible_ssh_user=root  -b --become-user=root cluster.yml -vvv  --syntax-check
-#     - ansible-playbook -i inventory/local-tests.cfg -u root -e ansible_ssh_user=root  -b --become-user=root upgrade-cluster.yml -vvv  --syntax-check
-#     - ansible-playbook -i inventory/local-tests.cfg -u root -e ansible_ssh_user=root  -b --become-user=root reset.yml -vvv  --syntax-check
-#     - ansible-playbook -i inventory/local-tests.cfg -u root -e ansible_ssh_user=root  -b --become-user=root extra_playbooks/upgrade-only-k8s.yml -vvv  --syntax-check
-#   except: ['triggers', 'master']
-
-# yamllint:
-#   <<: *job
-#   stage: unit-tests
-#   script:
-#     - yamllint roles
-#   except: ['triggers', 'master']
-
-# tox-inventory-builder:
-#   stage: unit-tests
-#   <<: *job
-#   script:
-#     - pip install tox
-#     - cd contrib/inventory_builder && tox
-#   when: manual
-#   except: ['triggers', 'master']
+  only: [/^pr-.*$/]
+
+gce_coreos-calico-sep-triggers:
+  stage: deploy-part1
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *coreos_calico_aio_variables
+  when: on_success
+  only: ['triggers']
+
+gce_centos7-flannel-addons:
+  stage: deploy-part2
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *centos7_flannel_addons_variables
+  when: on_success
+  except: ['triggers']
+  only: [/^pr-.*$/]
+
+gce_centos7-flannel-addons-triggers:
+  stage: deploy-part1
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *centos7_flannel_addons_variables
+  when: on_success
+  only: ['triggers']
+
+gce_ubuntu-weave-sep:
+  stage: deploy-special
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *ubuntu_weave_sep_variables
+  when: on_success
+  except: ['triggers']
+  only: [/^pr-.*$/]
+
+gce_ubuntu-weave-sep-triggers:
+  stage: deploy-part1
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *ubuntu_weave_sep_variables
+  when: on_success
+  only: ['triggers']
+
+# More builds for PRs/merges (manual) and triggers (auto)
+gce_ubuntu-canal-ha:
+  stage: deploy-part1
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *ubuntu_canal_ha_variables
+  when: manual
+  except: ['triggers']
+  only: ['master', /^pr-.*$/]
+
+gce_ubuntu-canal-ha-triggers:
+  stage: deploy-part1
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *ubuntu_canal_ha_variables
+  when: on_success
+  only: ['triggers']
+
+gce_ubuntu-canal-kubeadm:
+  stage: deploy-part1
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *ubuntu_canal_kubeadm_variables
+  when: manual
+  except: ['triggers']
+  only: ['master', /^pr-.*$/]
+
+gce_ubuntu-canal-kubeadm-triggers:
+  stage: deploy-part1
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *ubuntu_canal_kubeadm_variables
+  when: on_success
+  only: ['triggers']
+
+gce_centos-weave-kubeadm:
+  stage: deploy-part1
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *centos_weave_kubeadm_variables
+  when: manual
+  except: ['triggers']
+  only: ['master', /^pr-.*$/]
+
+gce_centos-weave-kubeadm-triggers:
+  stage: deploy-part1
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *centos_weave_kubeadm_variables
+  when: on_success
+  only: ['triggers']
+
+gce_ubuntu-contiv-sep:
+  stage: deploy-special
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *ubuntu_contiv_sep_variables
+  when: manual
+  except: ['triggers']
+  only: ['master', /^pr-.*$/]
+
+gce_rhel7-weave:
+  stage: deploy-part1
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *rhel7_weave_variables
+  when: manual
+  except: ['triggers']
+  only: ['master', /^pr-.*$/]
+
+gce_rhel7-weave-triggers:
+  stage: deploy-part1
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *rhel7_weave_variables
+  when: on_success
+  only: ['triggers']
+
+gce_debian8-calico-upgrade:
+  stage: deploy-part2
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *debian8_calico_variables
+  when: manual
+  except: ['triggers']
+  only: ['master', /^pr-.*$/]
+
+gce_debian8-calico-triggers:
+  stage: deploy-part1
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *debian8_calico_variables
+  when: on_success
+  only: ['triggers']
+
+gce_coreos-canal:
+  stage: deploy-part2
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *coreos_canal_variables
+  when: manual
+  except: ['triggers']
+  only: ['master', /^pr-.*$/]
+
+gce_coreos-canal-triggers:
+  stage: deploy-part1
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *coreos_canal_variables
+  when: on_success
+  only: ['triggers']
+
+gce_rhel7-canal-sep:
+  stage: deploy-special
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *rhel7_canal_sep_variables
+  when: manual
+  except: ['triggers']
+  only: ['master', /^pr-.*$/,]
+
+gce_rhel7-canal-sep-triggers:
+  stage: deploy-part1
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *rhel7_canal_sep_variables
+  when: on_success
+  only: ['triggers']
+
+gce_centos7-calico-ha:
+  stage: deploy-special
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *centos7_calico_ha_variables
+  when: manual
+  except: ['triggers']
+  only: ['master', /^pr-.*$/]
+
+gce_centos7-calico-ha-triggers:
+  stage: deploy-part1
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *centos7_calico_ha_variables
+  when: on_success
+  only: ['triggers']
+
+# no triggers yet https://github.com/kubernetes-incubator/kargo/issues/613
+gce_coreos-alpha-weave-ha:
+  stage: deploy-special
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *coreos_alpha_weave_ha_variables
+  when: manual
+  except: ['triggers']
+  only: ['master', /^pr-.*$/]
+
+gce_ubuntu-rkt-sep:
+  stage: deploy-part1
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *ubuntu_rkt_sep_variables
+  when: manual
+  except: ['triggers']
+  only: ['master', /^pr-.*$/]
+
+gce_ubuntu-vault-sep:
+  stage: deploy-part1
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *ubuntu_vault_sep_variables
+  when: manual
+  except: ['triggers']
+  only: ['master', /^pr-.*$/]
+
+gce_ubuntu-flannel-sep:
+  stage: deploy-special
+  <<: *job
+  <<: *gce
+  variables:
+    <<: *gce_variables
+    <<: *ubuntu_flannel_variables
+  when: manual
+  except: ['triggers']
+  only: ['master', /^pr-.*$/]
+
+# Premoderated with manual actions
+ci-authorized:
+  <<: *job
+  stage: moderator
+  before_script:
+    - apt-get -y install jq
+  script:
+    - /bin/sh scripts/premoderator.sh
+  except: ['triggers', 'master']
+
+syntax-check:
+  <<: *job
+  stage: unit-tests
+  script:
+    - ansible-playbook -i inventory/local-tests.cfg -u root -e ansible_ssh_user=root  -b --become-user=root cluster.yml -vvv  --syntax-check
+    - ansible-playbook -i inventory/local-tests.cfg -u root -e ansible_ssh_user=root  -b --become-user=root upgrade-cluster.yml -vvv  --syntax-check
+    - ansible-playbook -i inventory/local-tests.cfg -u root -e ansible_ssh_user=root  -b --become-user=root reset.yml -vvv  --syntax-check
+    - ansible-playbook -i inventory/local-tests.cfg -u root -e ansible_ssh_user=root  -b --become-user=root extra_playbooks/upgrade-only-k8s.yml -vvv  --syntax-check
+  except: ['triggers', 'master']
+
+yamllint:
+  <<: *job
+  stage: unit-tests
+  script:
+    - yamllint roles
+  except: ['triggers', 'master']
+
+tox-inventory-builder:
+  stage: unit-tests
+  <<: *job
+  script:
+    - pip install tox
+    - cd contrib/inventory_builder && tox
+  when: manual
+  except: ['triggers', 'master']
diff --git a/tests/Makefile b/tests/Makefile
index 638a299f5c4208e994dcfb48f6ffa50bd0ed8313..8d17e243c994934b382b34ee5b03317cdd247dc0 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -1,3 +1,5 @@
+INVENTORY=$(PWD)/../inventory/sample/hosts.ini
+
 $(HOME)/.ssh/id_rsa:
 	mkdir -p $(HOME)/.ssh
 	echo $(PRIVATE_KEY) | base64 -d > $(HOME)/.ssh/id_rsa
@@ -17,33 +19,33 @@ create-gce: init-gce
 	-e gce_credentials_file=$(HOME)/.ssh/gce.json \
 	-e gce_project_id=$(GCE_PROJECT_ID) \
 	-e gce_service_account_email=$(GCE_ACCOUNT) \
-	-e inventory_path=$(PWD)/../inventory/sample/hosts.ini \
+	-e inventory_path=$(INVENTORY) \
 	-e test_id=$(TEST_ID) \
 	-e preemptible=$(GCE_PREEMPTIBLE)
 
 
 delete-gce:
-	ansible-playbook -i ../inventory/sample/hosts.ini cloud_playbooks/delete-gce.yml -c local \
+	ansible-playbook -i $(INVENTORY) cloud_playbooks/delete-gce.yml -c local \
 	$(LOG_LEVEL) \
 	-e @"files/${CI_JOB_NAME}.yml" \
 	-e test_id=$(TEST_ID) \
 	-e gce_project_id=$(GCE_PROJECT_ID) \
 	-e gce_service_account_email=$(GCE_ACCOUNT) \
 	-e gce_credentials_file=$(HOME)/.ssh/gce.json \
-	-e inventory_path=$(PWD)/inventory/sample/hosts.ini
+	-e inventory_path=$(INVENTORY)
 
 create-do: init-do
 	ansible-playbook cloud_playbooks/create-do.yml -i local_inventory/hosts.cfg -c local \
 	${LOG_LEVEL} \
 	-e @"files/${CI_JOB_NAME}.yml" \
-	-e inventory_path=${PWD}/../inventory/hosts.ini \
+	-e inventory_path=$(INVENTORY) \
 	-e test_id=${TEST_ID}
 
 
 delete-do:
-	ansible-playbook -i ../inventory/sample/hosts.ini cloud_playbooks/create-do.yml -c local \
+	ansible-playbook -i $(INVENTORY) cloud_playbooks/create-do.yml -c local \
 	$(LOG_LEVEL) \
 	-e @"files/${CI_JOB_NAME}.yml" \
 	-e state=absent \
 	-e test_id=${TEST_ID} \
-	-e inventory_path=${PWD}/../inventory/inventory.ini \
+	-e inventory_path=$(INVENTORY)
diff --git a/tests/files/ubuntu-canal-ha-do.yml b/tests/files/do_ubuntu-canal-ha.yml
similarity index 88%
rename from tests/files/ubuntu-canal-ha-do.yml
rename to tests/files/do_ubuntu-canal-ha.yml
index 94a4af67a93b937830d6c71cd527989cb7a73d8c..e91dfd7c171a2aaf645a054c7390cf68f4ba0ccb 100644
--- a/tests/files/ubuntu-canal-ha-do.yml
+++ b/tests/files/do_ubuntu-canal-ha.yml
@@ -7,4 +7,4 @@ bootstrap_os: ubuntu
 kube_network_plugin: canal
 deploy_netchecker: true
 kubedns_min_replicas: 1
-cloud_provider: 'do'
+# cloud_provider: 'do'
diff --git a/tests/files/centos-weave-kubeadm.yml b/tests/files/gce_centos-weave-kubeadm.yml
similarity index 100%
rename from tests/files/centos-weave-kubeadm.yml
rename to tests/files/gce_centos-weave-kubeadm.yml
diff --git a/tests/files/centos7-calico-ha.yml b/tests/files/gce_centos7-calico-ha.yml
similarity index 100%
rename from tests/files/centos7-calico-ha.yml
rename to tests/files/gce_centos7-calico-ha.yml
diff --git a/tests/files/centos7-flannel-addons.yml b/tests/files/gce_centos7-flannel-addons.yml
similarity index 100%
rename from tests/files/centos7-flannel-addons.yml
rename to tests/files/gce_centos7-flannel-addons.yml
diff --git a/tests/files/coreos-alpha-weave-ha.yml b/tests/files/gce_coreos-alpha-weave-ha.yml
similarity index 100%
rename from tests/files/coreos-alpha-weave-ha.yml
rename to tests/files/gce_coreos-alpha-weave-ha.yml
diff --git a/tests/files/coreos-calico-aio.yml b/tests/files/gce_coreos-calico-aio.yml
similarity index 100%
rename from tests/files/coreos-calico-aio.yml
rename to tests/files/gce_coreos-calico-aio.yml
diff --git a/tests/files/coreos-canal.yml b/tests/files/gce_coreos-canal.yml
similarity index 100%
rename from tests/files/coreos-canal.yml
rename to tests/files/gce_coreos-canal.yml
diff --git a/tests/files/debian8-calico-upgrade.yml b/tests/files/gce_debian8-calico-upgrade.yml
similarity index 100%
rename from tests/files/debian8-calico-upgrade.yml
rename to tests/files/gce_debian8-calico-upgrade.yml
diff --git a/tests/files/rhel7-canal-sep.yml b/tests/files/gce_rhel7-canal-sep.yml
similarity index 100%
rename from tests/files/rhel7-canal-sep.yml
rename to tests/files/gce_rhel7-canal-sep.yml
diff --git a/tests/files/rhel7-weave.yml b/tests/files/gce_rhel7-weave.yml
similarity index 100%
rename from tests/files/rhel7-weave.yml
rename to tests/files/gce_rhel7-weave.yml
diff --git a/tests/files/ubuntu-canal-ha.yml b/tests/files/gce_ubuntu-canal-ha.yml
similarity index 100%
rename from tests/files/ubuntu-canal-ha.yml
rename to tests/files/gce_ubuntu-canal-ha.yml
diff --git a/tests/files/ubuntu-canal-kubeadm.yml b/tests/files/gce_ubuntu-canal-kubeadm.yml
similarity index 100%
rename from tests/files/ubuntu-canal-kubeadm.yml
rename to tests/files/gce_ubuntu-canal-kubeadm.yml
diff --git a/tests/files/ubuntu-contiv-sep.yml b/tests/files/gce_ubuntu-contiv-sep.yml
similarity index 100%
rename from tests/files/ubuntu-contiv-sep.yml
rename to tests/files/gce_ubuntu-contiv-sep.yml
diff --git a/tests/files/ubuntu-flannel-sep.yml b/tests/files/gce_ubuntu-flannel-sep.yml
similarity index 100%
rename from tests/files/ubuntu-flannel-sep.yml
rename to tests/files/gce_ubuntu-flannel-sep.yml
diff --git a/tests/files/ubuntu-rkt-sep.yml b/tests/files/gce_ubuntu-rkt-sep.yml
similarity index 100%
rename from tests/files/ubuntu-rkt-sep.yml
rename to tests/files/gce_ubuntu-rkt-sep.yml
diff --git a/tests/files/ubuntu-vault-sep.yml b/tests/files/gce_ubuntu-vault-sep.yml
similarity index 100%
rename from tests/files/ubuntu-vault-sep.yml
rename to tests/files/gce_ubuntu-vault-sep.yml
diff --git a/tests/files/ubuntu-weave-sep.yml b/tests/files/gce_ubuntu-weave-sep.yml
similarity index 100%
rename from tests/files/ubuntu-weave-sep.yml
rename to tests/files/gce_ubuntu-weave-sep.yml
diff --git a/tests/requirements.txt b/tests/requirements.txt
index 0b6163a5dc27e5a20bc4e310a58cc1fc1e698b1d..37067448d8a164939426e7f2d04862c7c0f198bb 100644
--- a/tests/requirements.txt
+++ b/tests/requirements.txt
@@ -4,3 +4,4 @@ apache-libcloud==2.2.1
 boto==2.9.0
 tox
 dopy
+PyCrypto