Files
k3k/.github/workflows/test.yaml
T
2026-06-12 17:36:49 +02:00

189 lines
6.0 KiB
YAML

name: Tests
on:
push:
branches: [main]
pull_request:
types: [opened, synchronize, reopened]
workflow_dispatch:
permissions:
contents: read
env:
KUBERNETES_VERSION: v1.35.3
jobs:
hcp-test:
runs-on: ubuntu-latest
steps:
- name: Install Virtualization Dependencies
run: |
sudo apt-get update
sudo apt-get install -y qemu-kvm qemu-utils cloud-image-utils wget
sudo usermod -aG kvm $USER
kvm-ok
- name: Download Base Cloud Image
run: |
wget -q https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img
- name: Generate SSH Key and Cloud-Init Seed
run: |
ssh-keygen -t rsa -b 4096 -f ./id_rsa -N ""
# Define the cloud-init config to authorize our new key
cat <<EOF > user-data
#cloud-config
users:
- name: ubuntu
ssh_authorized_keys:
- $(cat ./id_rsa.pub)
sudo: ['ALL=(ALL) NOPASSWD:ALL']
shell: /bin/bash
EOF
# Bake the configuration into a reusable metadata ISO
cloud-localds seed.img user-data
# 4. Provision independent overlay disks for Worker
- name: Create Worker Disks
run: |
qemu-img create -f qcow2 -b focal-server-cloudimg-amd64.img -F qcow2 worker-1.qcow2 20G
# 5. Boot both VMs headlessly in the background with unique MACs and forwarded SSH ports
- name: Launch Worker VM
run: |
# Launch Worker 1 (SSH forwarded to Host Port 2222)
sudo qemu-system-x86_64 \
-m 2048 -smp 2 -cpu host -enable-kvm -nographic \
-drive file=worker-1.qcow2,if=virtio \
-drive file=seed.img,format=raw,if=virtio \
-net nic,model=virtio,macaddr=52:54:00:12:34:56 \
-net user,hostfwd=tcp::2222-:22 \
&
# 6. Block the script until both VMs are completely booted and listening on SSH
- name: Wait for SSH Availability
run: |
echo "Waiting for Worker (Port 2222) to respond..."
timeout 120s bash -c '
until ssh -i ./id_rsa -p 2222 -o StrictHostKeyChecking=no -o ConnectTimeout=2 ubuntu@127.0.0.1 true 2>/dev/null; do sleep 3; done
'
echo "VM is completely up and accessible!"
# # 7. Extract token and trigger the manual join command via SSH
# - name: Join Worker to K3k Control Plane
# run: |
# # Fetch the registration secret from your K3k virtual cluster context
# # (Update namespace/secret names to match your precise K3k CRD setup)
# K3K_TOKEN=$(kubectl get secret -n k3k-system-cluster -o jsonpath='{.data.token}' | base64 -d)
# echo "Registering Worker 1..."
# ssh -i ./id_rsa -p 2222 -o StrictHostKeyChecking=no ubuntu@127.0.0.1 \
# "curl -sfL https://get.k3s.io | K3S_URL='https://10.0.2.2:6443' K3S_TOKEN='${K3K_TOKEN}' sh -s - agent"
# # 8. Assert that both nodes successfully registered and transitioned to a Ready status
# - name: Verify Cluster Nodes
# run: |
# echo "Monitoring K3k Virtual Cluster for Node registration..."
# timeout 180s bash -c '
# until [ $(kubectl --kubeconfig=k3k-cluster.kubeconfig get nodes --no-headers 2>/dev/null | grep -c "Ready") -eq 2 ]; do
# echo "Waiting for both worker nodes to show Ready..."
# kubectl --kubeconfig=k3k-cluster.kubeconfig get nodes || true
# sleep 5
# done
# '
# echo "E2E Success: Both QEMU workers successfully attached to the Hosted Control Plane!"
tests:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6
with:
go-version-file: go.mod
- name: Run unit tests
run: make test-unit
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v6
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./cover.out
flags: unit
tests-cli:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
fetch-depth: 0
fetch-tags: true
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6
with:
go-version-file: go.mod
- name: Install Ginkgo
run: go install github.com/onsi/ginkgo/v2/ginkgo@5d1d628ac86668c8f944c8c491c3d1ab86b3bed4 #v2.28.1
- name: Setup environment
run: |
mkdir ${{ github.workspace }}/covdata
echo "COVERAGE=true" >> $GITHUB_ENV
echo "GOCOVERDIR=${{ github.workspace }}/covdata" >> $GITHUB_ENV
echo "K3S_HOST_VERSION=${{ env.KUBERNETES_VERSION }}+k3s1" >> $GITHUB_ENV
- name: Build and package
run: |
make build
make package
# add k3kcli to $PATH
echo "${{ github.workspace }}/bin" >> $GITHUB_PATH
- name: Check k3kcli
run: k3kcli -v
- name: Run cli tests
env:
K3K_DOCKER_INSTALL: "true"
K3S_HOST_VERSION: "${{ env.K3S_HOST_VERSION }}"
run: make test-cli
- name: Convert coverage data
run: go tool covdata textfmt -i=${{ github.workspace }}/covdata -o ${{ github.workspace }}/covdata/cover.out
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v6
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ${{ github.workspace }}/covdata/cover.out
flags: cli
- name: Archive k3s logs
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
if: always()
with:
name: cli-k3s-logs
path: /tmp/k3s.log
- name: Archive k3k logs
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
if: always()
with:
name: cli-k3k-logs
path: /tmp/k3k.log