Skip to content

E2E Nightly

E2E Nightly #164

Workflow file for this run

# Copyright 2025 Flant JSC
#
# 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: E2E Nightly
on:
workflow_dispatch:
env:
E2E_IMAGE_BASE_URL: "https://e2e-test-images.e2e.virtlab.flant.com"
concurrency:
group: "${{ github.workflow }}-${{ github.event.number || github.ref }}"
cancel-in-progress: true
defaults:
run:
shell: bash
jobs:
cleanup-nested-clusters:
name: Cleanup nested clusters
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Configure kubectl via azure/k8s-set-context@v4
uses: azure/k8s-set-context@v4
with:
method: kubeconfig
context: e2e-cluster-nightly-e2e-virt-sa
kubeconfig: ${{ secrets.VIRT_E2E_NIGHTLY_SA_TOKEN }}
- name: Delete nested clusters
env:
LABEL_SELECTOR: test=nightly-e2e
KEEP_HOURS: "47"
FRIDAY_KEEP_HOURS: "71"
# Ceph (sds-elastic) nested clusters are torn down after ~1 day.
ELASTIC_KEEP_HOURS: "23"
run: bash .github/scripts/bash/e2e/cleanup-nightly-resources.sh
power-off-vms-for-nested:
name: Power off VMs for nested clusters
needs: cleanup-nested-clusters
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Configure kubectl via azure/k8s-set-context@v4
uses: azure/k8s-set-context@v4
with:
method: kubeconfig
context: e2e-cluster-nightly-e2e-virt-sa
kubeconfig: ${{ secrets.VIRT_E2E_NIGHTLY_SA_TOKEN }}
- name: Power off VMs to free resources for nested cluster setup
run: .github/scripts/bash/e2e/power-off-nested-vms.sh
set-vars:
name: Set vars
needs: power-off-vms-for-nested
runs-on: ubuntu-latest
outputs:
date_start: ${{ steps.vars.outputs.date_start }}
randuuid4c: ${{ steps.vars.outputs.randuuid4c }}
e2e_image_base_url: ${{ steps.image-source.outputs.e2e_image_base_url }}
registry_profile: ${{ steps.registry-profile.outputs.registry_profile }}
deckhouse_channel: ${{ steps.registry-profile.outputs.deckhouse_channel }}
deckhouse_version: ${{ steps.registry-profile.outputs.deckhouse_version }}
steps:
- uses: actions/checkout@v6
- name: Set vars
id: vars
uses: ./.github/actions/gen-run-id
- name: Resolve e2e image base url
id: image-source
run: echo "e2e_image_base_url=${E2E_IMAGE_BASE_URL}" >> "$GITHUB_OUTPUT"
- name: Resolve registry profile
id: registry-profile
run: bash .github/scripts/bash/e2e/resolve-registry-profile.sh
e2e-replicated:
name: E2E Pipeline (Replicated)
needs:
- set-vars
uses: ./.github/workflows/e2e-nightly-reusable-pipeline.yml
with:
storage_type: replicated
pipeline_job_name: "E2E Pipeline (Replicated)"
nested_storageclass_name: nested-thin-r1
nested_cluster_network_name: cn-4006-for-e2e-test
branch: main
virtualization_tag: main
deckhouse_channel: ${{ needs.set-vars.outputs.deckhouse_channel }}
deckhouse_version: ${{ needs.set-vars.outputs.deckhouse_version }}
registry_profile: ${{ needs.set-vars.outputs.registry_profile }}
default_user: cloud
go_version: "1.25.12"
e2e_timeout: "3.5h"
e2e_image_base_url: ${{ needs.set-vars.outputs.e2e_image_base_url }}
date_start: ${{ needs.set-vars.outputs.date_start }}
randuuid4c: ${{ needs.set-vars.outputs.randuuid4c }}
cluster_config_workers_memory: "9Gi"
cluster_config_additional_disk_size: "50Gi"
cluster_config_k8s_version: "1.35"
apt_mirror_enabled: true
secrets:
DEV_REGISTRY_DOCKER_CFG: ${{ secrets.DEV_REGISTRY_DOCKER_CFG }}
VIRT_E2E_NIGHTLY_SA_TOKEN: ${{ secrets.VIRT_E2E_NIGHTLY_SA_TOKEN }}
REGISTRY_DOCKER_CFG: ${{ needs.set-vars.outputs.registry_profile == 'stage' && secrets.STAGE_IO_REGISTRY_DOCKER_CFG || secrets.PROD_IO_REGISTRY_DOCKER_CFG }}
PROD_IO_REGISTRY_DOCKER_CFG: ${{ secrets.PROD_IO_REGISTRY_DOCKER_CFG }}
BOOTSTRAP_DEV_PROXY: ${{ secrets.BOOTSTRAP_DEV_PROXY }}
E2E_ARTIFACTS_GPG_PASSPHRASE: ${{ secrets.E2E_ARTIFACTS_GPG_PASSPHRASE }}
FOX_TOKEN: ${{ secrets.FOX_TOKEN }}
e2e-nfs:
name: E2E Pipeline (NFS)
needs:
- set-vars
uses: ./.github/workflows/e2e-nightly-reusable-pipeline.yml
with:
storage_type: nfs
pipeline_job_name: "E2E Pipeline (NFS)"
nested_storageclass_name: nfs
nested_cluster_network_name: cn-4006-for-e2e-test
branch: main
virtualization_tag: main
deckhouse_channel: ${{ needs.set-vars.outputs.deckhouse_channel }}
deckhouse_version: ${{ needs.set-vars.outputs.deckhouse_version }}
registry_profile: ${{ needs.set-vars.outputs.registry_profile }}
default_user: cloud
go_version: "1.24.13"
e2e_timeout: "3.5h"
e2e_image_base_url: ${{ needs.set-vars.outputs.e2e_image_base_url }}
date_start: ${{ needs.set-vars.outputs.date_start }}
randuuid4c: ${{ needs.set-vars.outputs.randuuid4c }}
cluster_config_workers_memory: "9Gi"
cluster_config_additional_disk_size: "50Gi"
cluster_config_k8s_version: "Automatic"
apt_mirror_enabled: true
secrets:
DEV_REGISTRY_DOCKER_CFG: ${{ secrets.DEV_REGISTRY_DOCKER_CFG }}
VIRT_E2E_NIGHTLY_SA_TOKEN: ${{ secrets.VIRT_E2E_NIGHTLY_SA_TOKEN }}
REGISTRY_DOCKER_CFG: ${{ needs.set-vars.outputs.registry_profile == 'stage' && secrets.STAGE_IO_REGISTRY_DOCKER_CFG || secrets.PROD_IO_REGISTRY_DOCKER_CFG }}
PROD_IO_REGISTRY_DOCKER_CFG: ${{ secrets.PROD_IO_REGISTRY_DOCKER_CFG }}
BOOTSTRAP_DEV_PROXY: ${{ secrets.BOOTSTRAP_DEV_PROXY }}
E2E_ARTIFACTS_GPG_PASSPHRASE: ${{ secrets.E2E_ARTIFACTS_GPG_PASSPHRASE }}
FOX_TOKEN: ${{ secrets.FOX_TOKEN }}
e2e-sds-elastic:
name: E2E Pipeline (Elastic)
needs:
- set-vars
uses: ./.github/workflows/e2e-nightly-reusable-pipeline.yml
with:
storage_type: ceph
pipeline_job_name: "E2E Pipeline (Elastic)"
nested_storageclass_name: nested-ceph-rbd
nested_cluster_network_name: cn-4006-for-e2e-test
branch: main
virtualization_tag: main
deckhouse_channel: ${{ needs.set-vars.outputs.deckhouse_channel }}
deckhouse_version: ${{ needs.set-vars.outputs.deckhouse_version }}
registry_profile: ${{ needs.set-vars.outputs.registry_profile }}
default_user: cloud
go_version: "1.24.13"
e2e_timeout: "3.5h"
e2e_focus_tests: "VirtualDiskProvisioning|VirtualDiskSnapshots|VirtualImageCreation|VirtualDiskResizing|DiskAttachment|BlockDeviceHotplug|Migration|StorageClassMigration|RWOVirtualDiskMigration|VMSOP|Restore|DataExports"
e2e_image_base_url: ${{ needs.set-vars.outputs.e2e_image_base_url }}
date_start: ${{ needs.set-vars.outputs.date_start }}
randuuid4c: ${{ needs.set-vars.outputs.randuuid4c }}
cluster_config_workers_memory: "9Gi"
cluster_config_additional_disk_size: "50Gi"
# Two 50Gi disks per worker -> two Ceph OSDs per node for more throughput.
cluster_config_additional_disk_count: "2"
cluster_config_k8s_version: "Automatic"
apt_mirror_enabled: true
secrets:
DEV_REGISTRY_DOCKER_CFG: ${{ secrets.DEV_REGISTRY_DOCKER_CFG }}
VIRT_E2E_NIGHTLY_SA_TOKEN: ${{ secrets.VIRT_E2E_NIGHTLY_SA_TOKEN }}
REGISTRY_DOCKER_CFG: ${{ needs.set-vars.outputs.registry_profile == 'stage' && secrets.STAGE_IO_REGISTRY_DOCKER_CFG || secrets.PROD_IO_REGISTRY_DOCKER_CFG }}
PROD_IO_REGISTRY_DOCKER_CFG: ${{ secrets.PROD_IO_REGISTRY_DOCKER_CFG }}
BOOTSTRAP_DEV_PROXY: ${{ secrets.BOOTSTRAP_DEV_PROXY }}
E2E_ARTIFACTS_GPG_PASSPHRASE: ${{ secrets.E2E_ARTIFACTS_GPG_PASSPHRASE }}
FOX_TOKEN: ${{ secrets.FOX_TOKEN }}
report-to-channel:
runs-on: ubuntu-latest
name: End-to-End tests report
needs:
- e2e-replicated
- e2e-nfs
- e2e-sds-elastic
if: ${{ always()}}
steps:
- uses: actions/checkout@v6
- name: Download E2E report artifacts
uses: actions/download-artifact@v8
continue-on-error: true
id: download-artifacts-pattern
with:
pattern: "e2e-report-*"
path: downloaded-artifacts/
merge-multiple: false
- name: Set up Python for chart rendering
uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: pip
cache-dependency-path: .github/scripts/python/requirements.txt
- name: Install Python chart deps
run: python -m pip install -r .github/scripts/python/requirements.txt
- name: Generate messenger chart files
run: >-
python .github/scripts/python/e2e_report/charts.py messenger-all
--reports-dir downloaded-artifacts
--out-dir tmp/messenger-charts
--manifest tmp/messenger-charts/manifest.json
- name: Send results to channel
id: render-report
uses: actions/github-script@v7
env:
EXPECTED_STORAGE_TYPES: '["replicated","nfs","ceph"]'
LOOP_API_BASE_URL: ${{ secrets.LOOP_API_BASE_URL }}
LOOP_CHANNEL_ID: ${{ secrets.LOOP_CHANNEL_ID }}
LOOP_TOKEN: ${{ secrets.LOOP_TOKEN }}
with:
script: |
const renderMessengerReport = require('./.github/scripts/js/e2e/report/messenger-report');
await renderMessengerReport({core});
- name: Render top-5 slowest Describes per cluster
run: >-
python .github/scripts/python/e2e_report/charts.py top
--reports-dir downloaded-artifacts
--out-dir tmp/charts
--top-n 5
- name: Upload top-5 slowest Describe charts
uses: actions/upload-artifact@v7
with:
name: e2e-report-slowest-by-describe
path: tmp/charts/
if-no-files-found: warn