From 4fbcf7ce324dc66e78480f73035e31434cfea1e8 Mon Sep 17 00:00:00 2001
From: Sergiy Markin <smarkin@mirantis.com>
Date: Fri, 29 Mar 2024 00:12:50 +0000
Subject: [PATCH] Add airskiff site deployment gate

This PS adds airskiff site deployment gate with
new kubernetes-entrypoint image.

Change-Id: Ia8348f3cce9184d7a6f001022721b41b1931ed77
---
 playbooks/airship-run-scripts.yaml            | 75 +++++++++++++++
 playbooks/deploy-env.yaml                     | 36 +++++++
 playbooks/mount-volumes.yaml                  | 17 ++++
 playbooks/osh-infra-collect-logs.yaml         | 43 +++++++++
 playbooks/prepare-hosts.yaml                  | 17 ++++
 playbooks/roles                               |  1 +
 .../airship-run-script-set/defaults/main.yaml | 48 ++++++++++
 roles/airship-run-script-set/tasks/main.yaml  | 85 +++++++++++++++++
 roles/airship-run-script/defaults/main.yaml   | 49 ++++++++++
 roles/airship-run-script/tasks/main.yaml      | 61 ++++++++++++
 zuul.d/jobs.yaml                              | 95 +++++++++++++++++++
 zuul.d/projects.yaml                          |  1 +
 12 files changed, 528 insertions(+)
 create mode 100644 playbooks/airship-run-scripts.yaml
 create mode 100644 playbooks/deploy-env.yaml
 create mode 100644 playbooks/mount-volumes.yaml
 create mode 100644 playbooks/osh-infra-collect-logs.yaml
 create mode 100644 playbooks/prepare-hosts.yaml
 create mode 120000 playbooks/roles
 create mode 100644 roles/airship-run-script-set/defaults/main.yaml
 create mode 100644 roles/airship-run-script-set/tasks/main.yaml
 create mode 100644 roles/airship-run-script/defaults/main.yaml
 create mode 100644 roles/airship-run-script/tasks/main.yaml

diff --git a/playbooks/airship-run-scripts.yaml b/playbooks/airship-run-scripts.yaml
new file mode 100644
index 0000000..6e29edc
--- /dev/null
+++ b/playbooks/airship-run-scripts.yaml
@@ -0,0 +1,75 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+- hosts: primary
+  tasks:
+    - name: Override images
+      when: buildset_registry is defined
+      vars:
+        work_dir: "{{ zuul.project.src_dir }}"
+      block:
+        - name: Buildset registry alias
+          include_role:
+            name: deploy-env
+            tasks_from: buildset_registry_alias
+
+        - name: Print zuul
+          debug:
+            var: zuul
+
+        - name: Override proposed images from artifacts
+          shell: >
+            find {{ override_paths | join(" ") }} -type f -exec sed -Ei
+            "s#['\"]?docker\.io/({{ repo }}):({{ tag }})['\"]?\$#{{ buildset_registry_alias }}:{{ buildset_registry.port }}/\1:\2#g" {} +
+          loop: "{{ zuul.artifacts | default([]) }}"
+          args:
+            chdir: "{{ work_dir }}"
+          loop_control:
+            loop_var: zj_zuul_artifact
+          when: "'metadata' in zj_zuul_artifact and zj_zuul_artifact.metadata.type | default('') == 'container_image'"
+          vars:
+            tag: "{{ zj_zuul_artifact.metadata.tag }}"
+            repo: "{{ zj_zuul_artifact.metadata.repository }}"
+            override_paths:
+              - ../openstack-helm*/*/values*
+              - ../openstack-helm-infra/tools/deployment/
+
+        - name: Diff
+          shell: |
+              set -ex;
+              for dir in openstack-helm openstack-helm-infra; do
+                path="{{ work_dir }}/../${dir}/"
+                if [ ! -d "${path}" ]; then continue; fi
+                echo "${dir} diff"
+                cd "${path}"; git diff; cd -;
+              done
+
+    - name: "creating directory for run artifacts"
+      file:
+        path: "/tmp/artifacts"
+        state: directory
+
+    - name: Run gate scripts
+      include_role:
+        name: "{{ ([item] | flatten | length == 1) | ternary('airship-run-script', 'airship-run-script-set') }}"
+      vars:
+        workload: "{{ [item] | flatten }}"
+      loop: "{{ gate_scripts }}"
+
+    - name: "Downloads artifacts to executor"
+      synchronize:
+        src: "/tmp/artifacts"
+        dest: "{{ zuul.executor.log_root }}/{{ inventory_hostname }}"
+        mode: pull
+      ignore_errors: True
+...
diff --git a/playbooks/deploy-env.yaml b/playbooks/deploy-env.yaml
new file mode 100644
index 0000000..39b4acf
--- /dev/null
+++ b/playbooks/deploy-env.yaml
@@ -0,0 +1,36 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+- hosts: all
+  become: true
+  gather_facts: true
+
+  roles:
+    - ensure-python
+    - ensure-pip
+    - ensure-tox
+    - clear-firewall
+    - deploy-apparmor
+    - deploy-selenium
+    - deploy-env
+
+  tasks:
+    - name: Install Packaging python module for tools/airship
+      block:
+        - pip:
+            name: packaging
+            version: 23.1
+            executable: pip3
+      become: True
+
+...
diff --git a/playbooks/mount-volumes.yaml b/playbooks/mount-volumes.yaml
new file mode 100644
index 0000000..0049da1
--- /dev/null
+++ b/playbooks/mount-volumes.yaml
@@ -0,0 +1,17 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+- hosts: all
+  roles:
+    - mount-extra-volume
+...
diff --git a/playbooks/osh-infra-collect-logs.yaml b/playbooks/osh-infra-collect-logs.yaml
new file mode 100644
index 0000000..83e7688
--- /dev/null
+++ b/playbooks/osh-infra-collect-logs.yaml
@@ -0,0 +1,43 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+- hosts: all
+  vars_files:
+    - vars.yaml
+  vars:
+    work_dir: "{{ zuul.project.src_dir }}/{{ zuul_osh_infra_relative_path | default('') }}"
+    logs_dir: "/tmp/logs"
+  roles:
+    - gather-host-logs
+  tags:
+    - gather-host-logs
+
+- hosts: primary
+  vars_files:
+    - vars.yaml
+  vars:
+    work_dir: "{{ zuul.project.src_dir }}/{{ zuul_osh_infra_relative_path | default('') }}"
+    logs_dir: "/tmp/logs"
+  roles:
+    - helm-release-status
+    - describe-kubernetes-objects
+    - gather-pod-logs
+    - gather-prom-metrics
+    - gather-selenium-data
+  tags:
+    - helm-release-status
+    - describe-kubernetes-objects
+    - gather-pod-logs
+    - gather-prom-metrics
+    - gather-selenium-data
+...
diff --git a/playbooks/prepare-hosts.yaml b/playbooks/prepare-hosts.yaml
new file mode 100644
index 0000000..c64aa0d
--- /dev/null
+++ b/playbooks/prepare-hosts.yaml
@@ -0,0 +1,17 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+- hosts: all
+  roles:
+    - start-zuul-console
+...
diff --git a/playbooks/roles b/playbooks/roles
new file mode 120000
index 0000000..6d19496
--- /dev/null
+++ b/playbooks/roles
@@ -0,0 +1 @@
+roles
\ No newline at end of file
diff --git a/roles/airship-run-script-set/defaults/main.yaml b/roles/airship-run-script-set/defaults/main.yaml
new file mode 100644
index 0000000..afaeb6f
--- /dev/null
+++ b/roles/airship-run-script-set/defaults/main.yaml
@@ -0,0 +1,48 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+ceph_osd_data_device: "/dev/loop0"
+kubeadm:
+  pod_network_cidr: "10.244.0.0/24"
+osh_params:
+  container_distro_name: ubuntu
+  container_distro_version: focal
+  # feature_gates:
+site: airskiff
+HELM_ARTIFACT_URL: https://get.helm.sh/helm-v3.13.2-linux-amd64.tar.gz
+HTK_COMMIT: 6ca83be78013446540b68fd28d0a75d5b2329f40
+OSH_INFRA_COMMIT: 6ca83be78013446540b68fd28d0a75d5b2329f40
+OSH_COMMIT: 176b412072969f982386db9560b6f50fcb7e0148
+COREDNS_VERSION: v1.11.1
+DISTRO: ubuntu_focal
+DOCKER_REGISTRY: quay.io
+CLONE_ARMADA: true
+CLONE_ARMADA_GO: true
+CLONE_ARMADA_OPERATOR: true
+CLONE_DECKHAND: true
+CLONE_SHIPYARD: true
+CLONE_PORTHOLE: true
+CLONE_PROMENADE: true
+CLONE_KUBERNETES_ENTRYPOINT: true
+CLONE_MAAS: true
+CLONE_OSH: true
+MAKE_ARMADA_IMAGES: false
+MAKE_ARMADA_GO_IMAGES: false
+MAKE_ARMADA_OPERATOR_IMAGES: false
+MAKE_DECKHAND_IMAGES: false
+MAKE_SHIPYARD_IMAGES: false
+MAKE_PORTHOLE_IMAGES: false
+MAKE_PROMENADE_IMAGES: false
+MAKE_KUBERTENES_ENTRYPOINT_IMAGES: false
+USE_ARMADA_GO: false
+...
diff --git a/roles/airship-run-script-set/tasks/main.yaml b/roles/airship-run-script-set/tasks/main.yaml
new file mode 100644
index 0000000..ea8a62d
--- /dev/null
+++ b/roles/airship-run-script-set/tasks/main.yaml
@@ -0,0 +1,85 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+- block:
+    - name: "Run script set {{ workload }}"
+      shell: |
+        set -xe;
+        {{ gate_script_path }}
+      loop: "{{ workload }}"
+      loop_control:
+        loop_var: gate_script_path
+        pause: 5
+      args:
+        chdir: "{{ zuul.project.src_dir }}/{{ gate_scripts_relative_path }}"
+      environment:
+        CEPH_OSD_DATA_DEVICE: "{{ ceph_osd_data_device }}"
+        POD_NETWORK_CIDR: "{{ kubeadm.pod_network_cidr }}"
+        zuul_site_mirror_fqdn: "{{ zuul_site_mirror_fqdn }}"
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_PATH: "{{ zuul_osh_relative_path | default('../openstack-helm/') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('../openstack-helm-infra/') }}"
+        OPENSTACK_RELEASE: "{{ osh_params.openstack_release | default('') }}"
+        CONTAINER_DISTRO_NAME: "{{ osh_params.container_distro_name | default('') }}"
+        CONTAINER_DISTRO_VERSION: "{{ osh_params.container_distro_version | default('') }}"
+        FEATURE_GATES: "{{ osh_params.feature_gates | default('') }}"
+        RUN_HELM_TESTS: "{{ run_helm_tests | default('yes') }}"
+        PL_SITE: "{{ site | default('airskiff') }}"
+        HELM_ARTIFACT_URL: "{{ HELM_ARTIFACT_URL | default('https://get.helm.sh/helm-v3.13.2-linux-amd64.tar.gz') }}"
+        HTK_COMMIT: "{{ HTK_COMMIT | default('6ca83be78013446540b68fd28d0a75d5b2329f40') }}"
+        OSH_INFRA_COMMIT: "{{ OSH_INFRA_COMMIT | default('6ca83be78013446540b68fd28d0a75d5b2329f40') }}"
+        OSH_COMMIT: "{{ OSH_COMMIT | default('176b412072969f982386db9560b6f50fcb7e0148') }}"
+        COREDNS_VERSION: "{{ coredns_version | default('v1.11.1') }}"
+        DISTRO: "{{ DISTRO | default('ubuntu_focal') }}"
+        DOCKER_REGISTRY: "{{ DOCKER_REGISTRY | default('quay.io') }}"
+        CLONE_ARMADA: "{{ CLONE_ARMADA | default('true') }}"
+        CLONE_ARMADA_GO: "{{ CLONE_ARMADA_GO | default('true') }}"
+        CLONE_ARMADA_OPERATOR: "{{ CLONE_ARMADA_OPERATOR | default('true') }}"
+        CLONE_DECKHAND: "{{ CLONE_DECKHAND | default('true') }}"
+        CLONE_SHIPYARD: "{{ CLONE_SHIPYARD | default('true') }}"
+        CLONE_PORTHOLE: "{{ CLONE_PORTHOLE | default('true') }}"
+        CLONE_PROMENADE: "{{ CLONE_PROMENADE | default('true') }}"
+        CLONE_KUBERNETES_ENTRYPOINT: "{{ CLONE_KUBERNETES_ENTRYPOINT | default('true') }}"
+        CLONE_MAAS: "{{ CLONE_MAAS | default('true') }}"
+        CLONE_OSH: "{{ CLONE_OSH | default('true') }}"
+        MAKE_ARMADA_IMAGES: "{{ MAKE_ARMADA_IMAGES | default('false') }}"
+        MAKE_ARMADA_GO_IMAGES: "{{ MAKE_ARMADA_GO_IMAGES | default('false') }}"
+        MAKE_ARMADA_OPERATOR_IMAGES: "{{ MAKE_ARMADA_OPERATOR_IMAGES | default('false') }}"
+        MAKE_DECKHAND_IMAGES: "{{ MAKE_DECKHAND_IMAGES | default('false') }}"
+        MAKE_SHIPYARD_IMAGES: "{{ MAKE_SHIPYARD_IMAGES | default('false') }}"
+        MAKE_PORTHOLE_IMAGES: "{{ MAKE_PORTHOLE_IMAGES | default('false') }}"
+        MAKE_PROMENADE_IMAGES: "{{ MAKE_PROMENADE_IMAGES | default('false') }}"
+        MAKE_KUBERTENES_ENTRYPOINT_IMAGES: "{{ MAKE_KUBERTENES_ENTRYPOINT_IMAGES | default('false') }}"
+        USE_ARMADA_GO: "{{ USE_ARMADA_GO | default('false') }}"
+      # NOTE(aostapenko) using bigger than async_status timeout due to async_status issue with
+      # not recognizing timed out jobs: https://github.com/ansible/ansible/issues/25637
+      async: 3600
+      poll: 0
+      register: async_results
+
+    - name: Wait for script set to finish
+      async_status:
+        jid: '{{ item.ansible_job_id }}'
+      register: jobs
+      until: jobs.finished
+      delay: 5
+      retries: 360
+      loop: "{{ async_results.results }}"
+
+  always:
+    - name: Print script set output
+      shell: |
+          # NOTE(aostapenko) safely retrieving items for the unlikely case if jobs timed out in async_status
+          echo 'STDOUT:\n{{ item.get("stdout") | regex_replace("\'", "") }}\nSTDERR:\n{{ item.get("stderr") | regex_replace("\'", "") }}'
+      loop: "{{ jobs.results }}"
+...
diff --git a/roles/airship-run-script/defaults/main.yaml b/roles/airship-run-script/defaults/main.yaml
new file mode 100644
index 0000000..8b9a184
--- /dev/null
+++ b/roles/airship-run-script/defaults/main.yaml
@@ -0,0 +1,49 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+ceph_osd_data_device: "/dev/loop0"
+kubeadm:
+  pod_network_cidr: "10.244.0.0/24"
+osh_params:
+  container_distro_name: ubuntu
+  container_distro_version: focal
+  # feature_gates:
+site: airskiff
+HELM_ARTIFACT_URL: https://get.helm.sh/helm-v3.13.2-linux-amd64.tar.gz
+HTK_COMMIT: 6ca83be78013446540b68fd28d0a75d5b2329f40
+OSH_INFRA_COMMIT: 6ca83be78013446540b68fd28d0a75d5b2329f40
+OSH_COMMIT: 176b412072969f982386db9560b6f50fcb7e0148
+COREDNS_VERSION: v1.11.1
+DISTRO: ubuntu_focal
+DOCKER_REGISTRY: quay.io
+
+CLONE_ARMADA: true
+CLONE_ARMADA_GO: true
+CLONE_ARMADA_OPERATOR: true
+CLONE_DECKHAND: true
+CLONE_SHIPYARD: true
+CLONE_PORTHOLE: true
+CLONE_PROMENADE: true
+CLONE_KUBERNETES_ENTRYPOINT: true
+CLONE_MAAS: true
+CLONE_OSH: true
+MAKE_ARMADA_IMAGES: false
+MAKE_ARMADA_GO_IMAGES: false
+MAKE_ARMADA_OPERATOR_IMAGES: false
+MAKE_DECKHAND_IMAGES: false
+MAKE_SHIPYARD_IMAGES: false
+MAKE_PORTHOLE_IMAGES: false
+MAKE_PROMENADE_IMAGES: false
+MAKE_KUBERTENES_ENTRYPOINT_IMAGES: false
+USE_ARMADA_GO: false
+...
diff --git a/roles/airship-run-script/tasks/main.yaml b/roles/airship-run-script/tasks/main.yaml
new file mode 100644
index 0000000..b48f815
--- /dev/null
+++ b/roles/airship-run-script/tasks/main.yaml
@@ -0,0 +1,61 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+- name: "Run script {{ workload[0] }}"
+  shell: |
+    set -xe;
+    {{ gate_script_path }}
+  vars:
+    gate_script_path: "{{ workload[0] }}"
+  args:
+    chdir: "{{ zuul.project.src_dir }}/{{ gate_scripts_relative_path }}"
+  environment:
+    CEPH_OSD_DATA_DEVICE: "{{ ceph_osd_data_device }}"
+    POD_NETWORK_CIDR: "{{ kubeadm.pod_network_cidr }}"
+    zuul_site_mirror_fqdn: "{{ zuul_site_mirror_fqdn }}"
+    OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+    OSH_PATH: "{{ zuul_osh_relative_path | default('../openstack-helm/') }}"
+    OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('../openstack-helm-infra/') }}"
+    OPENSTACK_RELEASE: "{{ osh_params.openstack_release | default('') }}"
+    CONTAINER_DISTRO_NAME: "{{ osh_params.container_distro_name | default('') }}"
+    CONTAINER_DISTRO_VERSION: "{{ osh_params.container_distro_version | default('') }}"
+    FEATURE_GATES: "{{ osh_params.feature_gates | default('') }}"
+    RUN_HELM_TESTS: "{{ run_helm_tests | default('yes') }}"
+    PL_SITE: "{{ site | default('airskiff') }}"
+    HELM_ARTIFACT_URL: "{{ HELM_ARTIFACT_URL | default('https://get.helm.sh/helm-v3.13.2-linux-amd64.tar.gz') }}"
+    HTK_COMMIT: "{{ HTK_COMMIT | default('6ca83be78013446540b68fd28d0a75d5b2329f40') }}"
+    OSH_INFRA_COMMIT: "{{ OSH_INFRA_COMMIT | default('6ca83be78013446540b68fd28d0a75d5b2329f40') }}"
+    OSH_COMMIT: "{{ OSH_COMMIT | default('176b412072969f982386db9560b6f50fcb7e0148') }}"
+    COREDNS_VERSION: "{{ coredns_version | default('v1.11.1') }}"
+    DISTRO: "{{ DISTRO | default('ubuntu_focal') }}"
+    DOCKER_REGISTRY: "{{ DOCKER_REGISTRY | default('quay.io') }}"
+    CLONE_ARMADA: "{{ CLONE_ARMADA | default('true') }}"
+    CLONE_ARMADA_GO: "{{ CLONE_ARMADA_GO | default('true') }}"
+    CLONE_ARMADA_OPERATOR: "{{ CLONE_ARMADA_OPERATOR | default('true') }}"
+    CLONE_DECKHAND: "{{ CLONE_DECKHAND | default('true') }}"
+    CLONE_SHIPYARD: "{{ CLONE_SHIPYARD | default('true') }}"
+    CLONE_PORTHOLE: "{{ CLONE_PORTHOLE | default('true') }}"
+    CLONE_PROMENADE: "{{ CLONE_PROMENADE | default('true') }}"
+    CLONE_KUBERNETES_ENTRYPOINT: "{{ CLONE_KUBERNETES_ENTRYPOINT | default('true') }}"
+    CLONE_MAAS: "{{ CLONE_MAAS | default('true') }}"
+    CLONE_OSH: "{{ CLONE_OSH | default('true') }}"
+    MAKE_ARMADA_IMAGES: "{{ MAKE_ARMADA_IMAGES | default('false') }}"
+    MAKE_ARMADA_GO_IMAGES: "{{ MAKE_ARMADA_GO_IMAGES | default('false') }}"
+    MAKE_ARMADA_OPERATOR_IMAGES: "{{ MAKE_ARMADA_OPERATOR_IMAGES | default('false') }}"
+    MAKE_DECKHAND_IMAGES: "{{ MAKE_DECKHAND_IMAGES | default('false') }}"
+    MAKE_SHIPYARD_IMAGES: "{{ MAKE_SHIPYARD_IMAGES | default('false') }}"
+    MAKE_PORTHOLE_IMAGES: "{{ MAKE_PORTHOLE_IMAGES | default('false') }}"
+    MAKE_PROMENADE_IMAGES: "{{ MAKE_PROMENADE_IMAGES | default('false') }}"
+    MAKE_KUBERTENES_ENTRYPOINT_IMAGES: "{{ MAKE_KUBERTENES_ENTRYPOINT_IMAGES | default('false') }}"
+    USE_ARMADA_GO: "{{ USE_ARMADA_GO | default('false') }}"
+...
diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml
index 8ea5856..976340c 100644
--- a/zuul.d/jobs.yaml
+++ b/zuul.d/jobs.yaml
@@ -31,6 +31,101 @@
     run: playbooks/airship-kubernetes-entrypoint-unit.yaml
     nodeset: airship-kubernetes-entrypoint-single-node-focal
 
+- job:
+    name: airship-kubernetes-entrypoint-base
+    abstract: true
+    roles:
+      - zuul: openstack/openstack-helm-infra
+      - zuul: zuul/zuul-jobs
+    required-projects:
+      - name: openstack/openstack-helm
+      - name: openstack/openstack-helm-infra
+      - name: airship/treasuremap
+        override-checkout: v1.9
+    irrelevant-files: &irrelevant-files
+      - ^.*\.rst$
+      - ^doc/.*$
+      - ^etc/.*$
+      - ^releasenotes/.*$
+      - ^setup.cfg$
+      - ^deckhand/tests/unit/.*$
+    timeout: 10800
+    pre-run:
+      - playbooks/prepare-hosts.yaml
+      - playbooks/mount-volumes.yaml
+      - playbooks/deploy-env.yaml
+    run:
+      - playbooks/airship-run-scripts.yaml
+    post-run:
+      - playbooks/osh-infra-collect-logs.yaml
+    vars:
+      extra_volume:
+        size: 80G
+        type: Linux
+        mount_point: /opt/ext_vol
+      docker:
+        root_path: "/opt/ext_vol/docker"
+      containerd:
+        root_path: "/opt/ext_vol/containerd"
+      kubeadm:
+        pod_network_cidr: "10.244.0.0/24"
+        service_cidr: "10.96.0.0/16"
+      loopback_setup: true
+      loopback_device: /dev/loop100
+      loopback_image: "/opt/ext_vol/openstack-helm/ceph-loop.img"
+      ceph_osd_data_device: /dev/loop100
+      kube_version_repo: "v1.29"
+      # the list of k8s package versions are available here
+      # https://pkgs.k8s.io/core:/stable:/{{ kube_version_repo }}/deb/Packages
+      kube_version: "1.29.2-1.1"
+      calico_version: "v3.27.0"
+      coredns_version: "v1.11.1"
+      helm_version: "v3.13.2"
+      yq_version: "v4.6.0"
+      crictl_version: "v1.26.1"
+      zuul_osh_relative_path: ../../openstack/openstack-helm
+      zuul_osh_infra_relative_path: ../../openstack/openstack-helm-infra
+      zuul_treasuremap_relative_path: ../../airship/treasuremap
+      gate_scripts_relative_path: ../../openstack/openstack-helm-infra
+      run_helm_tests: "no"
+
+- job:
+    name: airship-kubernetes-entrypoint-airskiff-deployment-focal
+    nodeset: treasuremap-airskiff-1node-ubuntu_focal
+    description: |
+      Deploy Memcached using Airskiff and submitted kubernetes-entrypoint changes.
+    parent: airship-kubernetes-entrypoint-base
+    vars:
+      site: airskiff
+      HELM_ARTIFACT_URL: https://get.helm.sh/helm-v3.13.2-linux-amd64.tar.gz
+      HTK_COMMIT: 6ca83be78013446540b68fd28d0a75d5b2329f40
+      OSH_INFRA_COMMIT: 6ca83be78013446540b68fd28d0a75d5b2329f40
+      OSH_COMMIT: 176b412072969f982386db9560b6f50fcb7e0148
+      CLONE_KUBERNETES_ENTRYPOINT: false
+      DISTRO: ubuntu_focal
+      DOCKER_REGISTRY: localhost:5000
+      MAKE_KUBERTENES_ENTRYPOINT_IMAGES: true
+      USE_ARMADA_GO: true
+      gate_scripts_relative_path: ../../airship/treasuremap
+      gate_scripts:
+        - ./tools/deployment/airskiff/developer/000-prepare-k8s.sh
+        - ./tools/deployment/airskiff/developer/009-setup-apparmor.sh
+        - ./tools/deployment/airskiff/developer/000-clone-dependencies.sh
+        - ./tools/deployment/airskiff/developer/020-setup-client.sh
+        - ./tools/deployment/airskiff/developer/015-make-all-charts.sh
+        - ./tools/deployment/airskiff/developer/017-make-all-images.sh
+        - ./tools/deployment/airskiff/developer/025-start-artifactory.sh
+        - ./tools/deployment/airskiff/developer/026-reduce-site.sh
+        - ./tools/deployment/airskiff/developer/027-enable-armada-operator.sh
+        - ./tools/deployment/airskiff/developer/030-armada-bootstrap.sh
+        - ./tools/deployment/airskiff/developer/100-deploy-osh.sh
+        - ./tools/deployment/airskiff/common/os-env.sh
+        - ./tools/gate/wait-for-shipyard.sh
+    irrelevant-files: *irrelevant-files
+
+
+
+
 - job:
     name: airship-kubernetes-entrypoint-docker-build-gate-ubuntu_focal
     timeout: 3600
diff --git a/zuul.d/projects.yaml b/zuul.d/projects.yaml
index 14fcc82..fd61266 100644
--- a/zuul.d/projects.yaml
+++ b/zuul.d/projects.yaml
@@ -16,6 +16,7 @@
         - airship-kubernetes-entrypoint-lint
         - airship-kubernetes-entrypoint-unit
         - airship-kubernetes-entrypoint-docker-build-gate-ubuntu_focal
+        - airship-kubernetes-entrypoint-airskiff-deployment-focal
 
     gate:
       jobs: