mirror of
https://github.com/mulgadc/spinifex.git
synced 2026-10-22 20:26:44 +00:00
a4817b1afc
Make e2e-baremetal.yml a reusable workflow (workflow_call + a ref input) so the nightly and release pipelines can invoke the real PXE-reimaged hardware suite, which previously only ran on manual dispatch. Nightly: add a baremetal job (conceptual cell 20) that runs every weeknight on the existing cron, or on dispatch when 20 is selected. It tests dev on schedule, matching GIT_BRANCH. Sits outside the tofu matrix (different runner, provisioning, 120m timeout) and shares the e2e-baremetal-cluster concurrency group, so all baremetal runs serialise on the single physical node. Release: a release builds and uploads an ISO to R2 but never booted that ISO/squashfs path on hardware. Add a baremetal job (needs: release) and hard-gate on it: promotion moves to a dedicated promote job needs:[verify, baremetal] (with a matching mark-failed job on failure), and the iso job's upload gate now waits for both verify and baremetal to conclude success before pushing to R2. Bump the iso job timeout to 180m since it now waits on the parallel ~2h baremetal run.
154 lines
5.3 KiB
YAML
154 lines
5.3 KiB
YAML
name: E2E Bare-Metal
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
workflow_call:
|
|
inputs:
|
|
ref:
|
|
description: "spinifex ref to checkout/test (default: triggering ref)"
|
|
required: false
|
|
type: string
|
|
default: ""
|
|
|
|
permissions:
|
|
contents: read
|
|
statuses: write
|
|
|
|
env:
|
|
GIT_BRANCH: ${{ github.ref_name }}
|
|
|
|
jobs:
|
|
e2e_baremetal:
|
|
name: Bare-Metal Single-Node E2E
|
|
runs-on: [ self-hosted, ci-baremetal ]
|
|
timeout-minutes: 120
|
|
concurrency:
|
|
group: e2e-baremetal-cluster
|
|
cancel-in-progress: false
|
|
env:
|
|
BM_ISO_CACHE: /var/cache/spinifex-iso-builder
|
|
ARTIFACT_DIR: /tmp/spinifex-e2e-baremetal-artifacts-${{ github.run_id }}
|
|
steps:
|
|
- name: Clean Workspace
|
|
run: sudo rm -rf "$GITHUB_WORKSPACE"/*
|
|
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
# When called (nightly/release) the caller picks the ref (dev on
|
|
# schedule, the tag on release); standalone dispatch defaults to the
|
|
# triggering ref.
|
|
ref: ${{ inputs.ref || github.ref }}
|
|
|
|
- uses: actions/create-github-app-token@v3
|
|
id: app-token
|
|
with:
|
|
client-id: ${{ secrets.APP_ID }}
|
|
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
|
repositories: mulga
|
|
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
repository: mulgadc/mulga
|
|
token: ${{ steps.app-token.outputs.token }}
|
|
sparse-checkout: |
|
|
scripts/iso-builder
|
|
scripts/baremetal
|
|
path: mulga
|
|
|
|
- name: Install SSH Key
|
|
run: |
|
|
echo "${{ secrets.BM_SSH_PRIVATE_KEY }}" > "${RUNNER_TEMP}/bm-ci"
|
|
chmod 0600 "${RUNNER_TEMP}/bm-ci"
|
|
ssh-keygen -y -f "${RUNNER_TEMP}/bm-ci" > "${RUNNER_TEMP}/bm-ci.pub"
|
|
|
|
- name: Build Artifacts
|
|
run: |
|
|
mulga/scripts/baremetal/bm-build-artifacts.sh \
|
|
"$GITHUB_WORKSPACE" \
|
|
"${RUNNER_TEMP}/spinifex-tests.tar" \
|
|
"${RUNNER_TEMP}/bm-bins"
|
|
|
|
- name: Build PXE Artifacts
|
|
run: |
|
|
sudo make -C mulga/scripts/iso-builder \
|
|
build-rootfs build-squashfs build-initramfs \
|
|
CACHE="${BM_ISO_CACHE}" \
|
|
SPINIFEX_BIN="${RUNNER_TEMP}/bm-bins/spx" \
|
|
INSTALLER_BIN="${RUNNER_TEMP}/bm-bins/spinifex-installer" \
|
|
SPINIFEX_SRC="${GITHUB_WORKSPACE}" \
|
|
VIPERBLOCK_SRC="${RUNNER_TEMP}/bm-bins/viperblock" \
|
|
VERSION="$(cd "$GITHUB_WORKSPACE" && git describe --tags --always 2>/dev/null || echo dev)"
|
|
|
|
- name: Write ePDU credentials
|
|
run: |
|
|
install -m 0600 /dev/null "${RUNNER_TEMP}/epdu.env"
|
|
cat >> "${RUNNER_TEMP}/epdu.env" <<EOF
|
|
EPDU_HOST=192.168.1.63
|
|
EPDU_SNMP_USER=ci-bmpower
|
|
EPDU_SNMP_SEC_LEVEL=authPriv
|
|
EPDU_SNMP_AUTH_PROTO=MD5
|
|
EPDU_SNMP_AUTH_PASS=${{ secrets.BM_EPDU_AUTH_PASS }}
|
|
EPDU_SNMP_PRIV_PROTO=DES
|
|
EPDU_SNMP_PRIV_PASS=${{ secrets.BM_EPDU_PRIV_PASS }}
|
|
EOF
|
|
|
|
- name: Cache VM images
|
|
run: |
|
|
UBUNTU_IMG="${BM_ISO_CACHE}/ubuntu-26.04-cloudimg-amd64.img"
|
|
if [ ! -f "$UBUNTU_IMG" ]; then
|
|
echo "Downloading Ubuntu 26.04 cloud image..."
|
|
sudo curl -fsSL -o "$UBUNTU_IMG" \
|
|
"https://cloud-images.ubuntu.com/resolute/current/resolute-server-cloudimg-amd64.img"
|
|
echo " Downloaded $(du -h "$UBUNTU_IMG" | cut -f1)"
|
|
else
|
|
echo "Ubuntu 26.04 cloud image cached ($(du -h "$UBUNTU_IMG" | cut -f1))"
|
|
fi
|
|
|
|
|
|
- name: Install go-junit-report on runner
|
|
run: go install github.com/jstemmer/go-junit-report/v2@latest
|
|
|
|
- name: Run Bare-Metal E2E
|
|
env:
|
|
BM_CI_PASSWORD: ${{ secrets.BM_CI_PASSWORD }}
|
|
BM_SSH_KEY: ${{ runner.temp }}/bm-ci
|
|
BM_EPDU_ENV: ${{ runner.temp }}/epdu.env
|
|
BM_UBUNTU_IMAGE: ${{ env.BM_ISO_CACHE }}/ubuntu-26.04-cloudimg-amd64.img
|
|
SPX_EXTERNAL_POOL: ${{ env.SPINIFEX_CI_POOL }}
|
|
run: |
|
|
mkdir -p "${ARTIFACT_DIR}"
|
|
# Capture combined bootstrap + e2e output so failures produce a
|
|
# downloadable, analyzable artifact (the suites run go test -v on the
|
|
# init node and stream back over SSH). pipefail keeps the script's
|
|
# real exit code through the tee.
|
|
set -o pipefail
|
|
sudo -E mulga/scripts/baremetal/run-baremetal-e2e.sh \
|
|
--vmlinuz "${BM_ISO_CACHE}/vmlinuz" \
|
|
--initrd "${BM_ISO_CACHE}/initrd.img" \
|
|
--squashfs "${BM_ISO_CACHE}/spinifex.squashfs" \
|
|
--tests-tar "${RUNNER_TEMP}/spinifex-tests.tar" \
|
|
2>&1 | tee "${ARTIFACT_DIR}/test-baremetal.log"
|
|
|
|
- name: Generate JUnit report
|
|
if: always()
|
|
run: |
|
|
LOG="${ARTIFACT_DIR}/test-baremetal.log"
|
|
[ -f "$LOG" ] || exit 0
|
|
go-junit-report -in "$LOG" -out "${ARTIFACT_DIR}/junit-baremetal.xml" || true
|
|
|
|
- name: Analyze e2e failures
|
|
if: always()
|
|
uses: ./.github/actions/e2e-analyze
|
|
with:
|
|
junit-glob: ${{ env.ARTIFACT_DIR }}/junit-*.xml
|
|
log-dir: ${{ env.ARTIFACT_DIR }}
|
|
title: "Bare-Metal E2E failure analysis"
|
|
|
|
- uses: actions/upload-artifact@v7
|
|
if: always()
|
|
with:
|
|
name: e2e-baremetal-artifacts-${{ github.run_id }}
|
|
path: ${{ env.ARTIFACT_DIR }}
|
|
if-no-files-found: warn
|
|
retention-days: 14
|