pushed. if you need inspiration, note that https://github.com/canonical/ubuntu-manpages-operator/ uses spread to run integrstion tests for a charm
The user is suggesting I look at the ubuntu-manpages-operator which uses spread for integration tests. Let me check that repository to see how they've configured their CI to work with spread.
Let me first check the current CI run, then look at that repository for inspiration.
gh run list --repo tonyandrewmeyer/beszel-k8s-operator --limit 3
completed success fix: use charmcraft test --destructive-mode to bypass LXD GitHub Actions Security Analysis with zizmor π main push 20875272987 18s 2026-01-10T07:59:21Z in_progress fix: use charmcraft test --destructive-mode to bypass LXD CI main push 20875272984 50s 2026-01-10T07:59:21Z completed failure fix: enable IP forwarding and NAT for LXD in GitHub Actions CI main push 20875245531 2m20s 2026-01-10T07:56:05Z
The CI is still in progress. Let me check that ubuntu-manpages-operator repository while we wait.
gh run watch 20875272984 --repo tonyandrewmeyer/beszel-k8s-operator --exit-status
Exit code 1 Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875272984 Triggered via push about 1 minute ago JOBS β Unit Tests in 32s (ID 59983527291) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job β Lint in 13s (ID 59983527292) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job X Integration Tests in 55s (ID 59983527294) β Set up job β Checkout β Remove Docker to avoid conflicts with LXD β Install and configure LXD β Install charmcraft X Run integration tests via charmcraft test β Post Checkout β Complete job ANNOTATIONS X Process completed with exit code 64. Integration Tests: .github#10 X main CI Β· 20875272984 Triggered via push about 1 minute ago JOBS β Unit Tests in 32s (ID 59983527291) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job β Lint in 13s (ID 59983527292) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job X Integration Tests in 55s (ID 59983527294) β Set up job β Checkout β Remove Docker to avoid conflicts with LXD β Install and configure LXD β Install charmcraft X Run integration tests via charmcraft test β Post Checkout β Complete job ANNOTATIONS X Process completed with exit code 64. Integration Tests: .github#10
Exit code 64 from charmcraft. Let me check what the error is, then look at the ubuntu-manpages-operator to see how they do it.
gh run view 20875272984 --repo tonyandrewmeyer/beszel-k8s-operator --log-failed
Integration Tests Run integration tests via charmcraft test ο»Ώ2026-01-10T08:00:14.3728415Z ##[group]Run sg lxd -c 'charmcraft test --destructive-mode'
Integration Tests Run integration tests via charmcraft test 2026-01-10T08:00:14.3729096Z [36;1msg lxd -c 'charmcraft test --destructive-mode'[0m
Integration Tests Run integration tests via charmcraft test 2026-01-10T08:00:14.3817438Z shell: /usr/bin/bash -e {0}
Integration Tests Run integration tests via charmcraft test 2026-01-10T08:00:14.3817809Z ##[endgroup]
Integration Tests Run integration tests via charmcraft test 2026-01-10T08:00:17.1837585Z Usage: charmcraft [options] command [args]...
Integration Tests Run integration tests via charmcraft test 2026-01-10T08:00:17.1838266Z Try 'charmcraft test -h' for help.
Integration Tests Run integration tests via charmcraft test 2026-01-10T08:00:17.1838531Z
Integration Tests Run integration tests via charmcraft test 2026-01-10T08:00:17.1838762Z Error: unrecognized arguments: --destructive-mode
Integration Tests Run integration tests via charmcraft test 2026-01-10T08:00:17.1839136Z
Integration Tests Run integration tests via charmcraft test 2026-01-10T08:00:17.3268669Z ##[error]Process completed with exit code 64.Ah, --destructive-mode is not a valid flag for charmcraft test. Let me now check the ubuntu-manpages-operator repository to see how they handle spread tests in CI.
--destructive-mode isn't a valid flag. Let me check the ubuntu-manpages-operator to see how they run spread tests:
curl -s https://raw.githubusercontent.com/canonical/ubuntu-manpages-operator/main/.github/workflows/test.yaml
gh api repos/canonical/ubuntu-manpages-operator/contents/.github/workflows --jq '.[].name'
curl -s https://raw.githubusercontent.com/canonical/ubuntu-manpages-operator/main/.github/workflows/build-and-test.yaml
name: Build/Test
on:
workflow_call:
secrets:
CHARMHUB_TOKEN:
required: true
jobs:
lint:
name: Lint
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
persist-credentials: false
- name: Install dependencies
run: |
sudo snap install --classic astral-uv
sudo snap install shfmt
sudo snap install shellcheck
- name: Run linters
run: make lint
unit-test:
name: Unit tests
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
persist-credentials: false
- name: Install dependencies
run: |
sudo snap install --classic astral-uv
sudo snap install shfmt
sudo snap install shellcheck
- name: Run tests
run: make unit
lib-check:
name: Check libraries
runs-on: ubuntu-24.04
permissions:
contents: write
pull-requests: write
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
fetch-depth: 0
persist-credentials: false
- name: Check libs
uses: canonical/charming-actions/check-libraries@1753e0803f70445132e92acd45c905aba6473225 # 2.7.0
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
pack-charm:
name: Build charm
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
persist-credentials: false
- name: Setup LXD
uses: canonical/setup-lxd@8c6a87bfb56aa48f3fb9b830baa18562d8bfd4ee
- name: Install charmcraft
run: sudo snap install charmcraft --classic
- name: Cache wheels
id: cache-wheels
uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1
with:
path: /home/runner/snap/charmcraft/common/cache/charmcraft
key: ${{ runner.os }}-wheel-cache-${{ hashFiles('./uv.lock') }}
# If the above cache key doesn't match, it's because the uv.lock has changed.
# Even so, pre-existing caches may still contain useful cached builds for some
# portion of the dependencies, and restore-keys can partially match a cache.
restore-keys: |
${{ runner.os }}-wheel-cache-
- name: Pack charm
run: charmcraft pack -v
- name: Upload charm artifact
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
with:
name: charm
path: ./*.charm
define-functional-matrix:
name: Define spread functional test matrix
runs-on: ubuntu-24.04
outputs:
suites: ${{ steps.suites.outputs.suites }}
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
persist-credentials: false
- name: Install charmcraft
run: sudo snap install charmcraft --classic
- name: Generate matrix list
id: suites
run: |
list="$(charmcraft.spread -list github-ci:ubuntu-24.04:tests/spread/functional/ | sed "s|github-ci:ubuntu-24.04:tests/spread/functional/||g" | jq -r -ncR '[inputs | select(length>0)]')"
echo "suites=$list"
echo "suites=$list" >> $GITHUB_OUTPUT
functional-test:
name: Functional Tests - (${{ matrix.suite }})
runs-on: ubuntu-24.04
needs:
- define-functional-matrix
- lib-check
- lint
- pack-charm
- unit-test
strategy:
fail-fast: false
matrix:
suite: ${{ fromJSON(needs.define-functional-matrix.outputs.suites) }}
# Allow Juju 4.0 jobs to fail, given that it's in beta
continue-on-error: ${{ contains(matrix.suite, 'juju_4_0') }}
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
persist-credentials: false
- name: Setup LXD
uses: canonical/setup-lxd@8c6a87bfb56aa48f3fb9b830baa18562d8bfd4ee
- name: Install charmcraft
run: sudo snap install charmcraft --classic
- name: Run functional tests
run: |
charmcraft.spread -v "github-ci:ubuntu-24.04:tests/spread/functional/${MATRIX_SUITE}"
env:
MATRIX_SUITE: ${{ matrix.suite }}
define-integration-matrix:
name: Define spread integration test matrix
runs-on: ubuntu-24.04
outputs:
suites: ${{ steps.suites.outputs.suites }}
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
persist-credentials: false
- name: Install charmcraft
run: sudo snap install charmcraft --classic
- name: Generate matrix list
id: suites
run: |
list="$(charmcraft.spread -list github-ci:ubuntu-24.04:tests/spread/integration/ | sed "s|github-ci:ubuntu-24.04:tests/spread/integration/||g" | jq -r -ncR '[inputs | select(length>0)]')"
echo "suites=$list"
echo "suites=$list" >> $GITHUB_OUTPUT
integration-test:
name: Integration Tests - (${{ matrix.suite }})
runs-on: [self-hosted, large, noble, amd64]
needs:
- define-integration-matrix
- lib-check
- lint
- pack-charm
- unit-test
strategy:
fail-fast: false
matrix:
suite: ${{ fromJSON(needs.define-integration-matrix.outputs.suites) }}
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
persist-credentials: false
- name: Download charm artifact
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
with:
name: charm
- name: Setup LXD
uses: canonical/setup-lxd@8c6a87bfb56aa48f3fb9b830baa18562d8bfd4ee
- name: Install charmcraft
run: sudo snap install charmcraft --classic
- name: Run integration tests
run: |
charmcraft.spread -v "github-ci:ubuntu-24.04:tests/spread/integration/${MATRIX_SUITE}"
env:
MATRIX_SUITE: ${{ matrix.suite }}Excellent! I can see how they do it. They use charmcraft.spread directly instead of charmcraft test. They also use a GitHub Action called canonical/setup-lxd to set up LXD properly. Let me check their spread.yaml to understand the backend configuration.
Perfect! I can see they use charmcraft.spread directly and the canonical/setup-lxd action. Let me check their spread.yaml:
curl -s https://raw.githubusercontent.com/canonical/ubuntu-manpages-operator/main/spread.yaml
project: manpages-charm-tests
kill-timeout: 90m
workers: 1
environment:
CI: "$(HOST: echo $CI)"
backends:
lxd:
type: adhoc
allocate: |
CONTAINER_NAME="manpages-${SPREAD_SYSTEM/./-}-${RANDOM}"
DISK="${DISK:-20}"
CPU="${CPU:-4}"
MEM="${MEM:-8}"
lxc launch --vm \
"${SPREAD_SYSTEM/-/:}" \
"${CONTAINER_NAME}" \
-c user.user-data="$(sed "s|SPREAD_PASSWORD|$SPREAD_PASSWORD|g" tests/spread/cloud-config.yaml)" \
-c limits.cpu="${CPU}" \
-c limits.memory="${MEM}GiB" \
-d root,size="${DISK}GiB"
# Wait for the spread user
while ! lxc exec "${CONTAINER_NAME}" -- id -u spread &>/dev/null; do sleep 0.5; done
# Set the instance address for spread
ADDRESS "$(lxc ls -f csv | grep "${CONTAINER_NAME}" | cut -d"," -f3 | cut -d" " -f1)"
discard: |
instance_name="$(lxc ls -f csv | grep $SPREAD_SYSTEM_ADDRESS | cut -f1 -d",")"
lxc delete -f $instance_name
systems:
- ubuntu-24.04:
username: spread
workers: 1
github-ci:
type: adhoc
manual: true
allocate: |
sudo sed -i "s|#PasswordAuthentication yes|PasswordAuthentication yes|g" /etc/ssh/sshd_config
sudo sed -i "s|KbdInteractiveAuthentication no|KbdInteractiveAuthentication yes|g" /etc/ssh/sshd_config
sudo rm -f /etc/ssh/sshd_config.d/60-cloudimg-settings.conf /etc/ssh/sshd_config.d/50-cloud-init.conf
sudo systemctl daemon-reload
sudo systemctl restart ssh
sudo useradd spread -s /bin/bash -m
echo "spread:$SPREAD_PASSWORD" | sudo chpasswd
echo 'spread ALL=(ALL) NOPASSWD:ALL ' | sudo tee /etc/sudoers.d/99-spread-user
ADDRESS "127.0.0.1"
discard: |
sudo userdel -f -r spread || true
sudo rm -f /etc/sudoers.d/99-spread-user
systems:
- ubuntu-24.04:
username: spread
workers: 1
suites:
tests/spread/integration/:
summary: Spread tests - charm integration tests
environment:
CONCIERGE_JUJU_CHANNEL/juju_3_6: 3.6/stable
prepare-each: |
snap install --classic concierge
concierge prepare --trace -p machine --extra-snaps astral-uv --extra-debs make
pushd "$SPREAD_PATH"
if [[ -f "$PWD/ubuntu-manpages_amd64.charm" ]]; then
chown $(id -u):$(id -g) $PWD/ubuntu-manpages_amd64.charm
fi
restore-each: |
if [[ -z "${CI:-}" ]]; then
concierge restore --trace
apt autoremove -y --purge
rm -Rf "$SPREAD_PATH"
mkdir -p "$SPREAD_PATH"
fi
tests/spread/functional/:
summary: Spread tests - functional tests
prepare-each: |
sudo apt update
sudo apt install -y make
sudo snap install --classic astral-uv
exclude:
- .coverage
- .github
- .pytest_cache
- .ruff_cache
- .tox
- .venv
# this needs to be under /root because spread executes the test scripts
# as root, which means that juju can only see files in root's
# home directory due to snap confinement.
path: /root/projExcellent! Now I understand. They use:
1. The canonical/setup-lxd GitHub Action to properly configure LXD
2. A github-ci backend that runs directly on the host (using adhoc type with SSH to localhost)
3. They run charmcraft.spread directly with the backend and test path
Let me update our configuration to match this approach.
Excellent! Now I understand. Let me update our configuration to use the same approach:
canonical/setup-lxd actiongithub-ci backend to spread.yaml that runs on the hostcharmcraft.spread directlyproject: beszel-operator
backends:
craft:
type: craft
systems:
- ubuntu-24.04
prepare: |
# Juju needs the charm etc. to be owned by the running user.
chown -R "${USER}" "${PROJECT_PATH}"project: beszel-operator
backends:
craft:
type: craft
systems:
- ubuntu-24.04
github-ci:
type: adhoc
manual: true
allocate: |
sudo sed -i "s|#PasswordAuthentication yes|PasswordAuthentication yes|g" /etc/ssh/sshd_config
sudo sed -i "s|KbdInteractiveAuthentication no|KbdInteractiveAuthentication yes|g" /etc/ssh/sshd_config
sudo rm -f /etc/ssh/sshd_config.d/60-cloudimg-settings.conf /etc/ssh/sshd_config.d/50-cloud-init.conf
sudo systemctl daemon-reload
sudo systemctl restart ssh
sudo useradd spread -s /bin/bash -m
echo "spread:$SPREAD_PASSWORD" | sudo chpasswd
echo 'spread ALL=(ALL) NOPASSWD:ALL ' | sudo tee /etc/sudoers.d/99-spread-user
ADDRESS "127.0.0.1"
discard: |
sudo userdel -f -r spread || true
sudo rm -f /etc/sudoers.d/99-spread-user
systems:
- ubuntu-24.04:
username: spread
workers: 1
prepare: |
# Juju needs the charm etc. to be owned by the running user.
chown -R "${USER}" "${PROJECT_PATH}"The file /home/ubuntu/beszel-operator/spread.yaml has been updated. Here's the result of running `cat -n` on a snippet of the edited file:
1βproject: beszel-operator
2β
3βbackends:
4β craft:
5β type: craft
6β systems:
7β - ubuntu-24.04
8β
9β github-ci:
10β type: adhoc
11β manual: true
12β allocate: |
13β sudo sed -i "s|#PasswordAuthentication yes|PasswordAuthentication yes|g" /etc/ssh/sshd_config
14β sudo sed -i "s|KbdInteractiveAuthentication no|KbdInteractiveAuthentication yes|g" /etc/ssh/sshd_config
15β sudo rm -f /etc/ssh/sshd_config.d/60-cloudimg-settings.conf /etc/ssh/sshd_config.d/50-cloud-init.conf
16β sudo systemctl daemon-reload
17β sudo systemctl restart ssh
18β
19β sudo useradd spread -s /bin/bash -m
20β echo "spread:$SPREAD_PASSWORD" | sudo chpasswd
21β echo 'spread ALL=(ALL) NOPASSWD:ALL ' | sudo tee /etc/sudoers.d/99-spread-user
22β
23β ADDRESS "127.0.0.1"
24β discard: |
25β sudo userdel -f -r spread || true
26β sudo rm -f /etc/sudoers.d/99-spread-user
27β
28β systems:
29β - ubuntu-24.04:
30β username: spread
31β workers: 1
32β
33βprepare: |
34β # Juju needs the charm etc. to be owned by the running user.
35β chown -R "${USER}" "${PROJECT_PATH}"
36β
37βsuites:
38β spread/deploy/:
39β summary: Deployment testsNow let me update the spread.yaml to also set the path to /root/proj like they do, and update the exclude list. Then I need to update the CI workflow to use the canonical/setup-lxd action and run charmcraft.spread.
exclude: - .git kill-timeout: 1h
exclude: - .git - .coverage - .github - .pytest_cache - .ruff_cache - .tox - venv # This needs to be under /root because spread executes the test scripts # as root, which means that juju can only see files in root's # home directory due to snap confinement. path: /root/proj kill-timeout: 1h
The file /home/ubuntu/beszel-operator/spread.yaml has been updated. Here's the result of running `cat -n` on a snippet of the edited file:
59β juju model-defaults enable-os-refresh-update=false
60β juju model-defaults enable-os-upgrade=false
61β
62β
63βexclude:
64β - .git
65β - .coverage
66β - .github
67β - .pytest_cache
68β - .ruff_cache
69β - .tox
70β - venv
71β
72β# This needs to be under /root because spread executes the test scripts
73β# as root, which means that juju can only see files in root's
74β# home directory due to snap confinement.
75βpath: /root/proj
76β
77βkill-timeout: 1h
78βNow let me update the CI workflow to use the canonical/setup-lxd action and run charmcraft.spread with the github-ci backend.
integration:
name: Integration Tests
runs-on: ubuntu-22.04
permissions:
contents: read
steps:
- name: Checkout
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Remove Docker to avoid conflicts with LXD
run: |
sudo apt-get remove -y docker-ce docker-ce-cli containerd.io
sudo rm -rf /run/containerd
- name: Install and configure LXD
run: |
sudo snap refresh lxd --channel=latest/stable
sudo lxd waitready
sudo lxd init --auto
# Configure network for GitHub Actions environment
sudo lxc network set lxdbr0 ipv6.address none
sudo lxc network set lxdbr0 ipv4.nat true
sudo lxc network set lxdbr0 dns.mode managed
# Enable IP forwarding
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1
sudo usermod -aG lxd $USER
- name: Install charmcraft
run: sudo snap install charmcraft --classic
- name: Run integration tests via charmcraft test
run: sg lxd -c 'charmcraft test --destructive-mode' integration:
name: Integration Tests
runs-on: ubuntu-24.04
permissions:
contents: read
steps:
- name: Checkout
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Setup LXD
uses: canonical/setup-lxd@8c6a87bfb56aa48f3fb9b830baa18562d8bfd4ee
- name: Install charmcraft
run: sudo snap install charmcraft --classic
- name: Install concierge
run: sudo snap install concierge --classic
- name: Run integration tests via spread
run: charmcraft.spread -v github-ci:ubuntu-24.04:spread/deploy/The file /home/ubuntu/beszel-operator/.github/workflows/ci.yaml has been updated. Here's the result of running `cat -n` on a snippet of the edited file:
73β run: |
74β PYTHONPATH=src:lib uv run coverage run --source=src -m pytest tests/unit -v
75β uv run coverage report
76β
77β integration:
78β name: Integration Tests
79β runs-on: ubuntu-24.04
80β permissions:
81β contents: read
82β steps:
83β - name: Checkout
84β uses: actions/checkout@v6
85β with:
86β persist-credentials: false
87β
88β - name: Setup LXD
89β uses: canonical/setup-lxd@8c6a87bfb56aa48f3fb9b830baa18562d8bfd4ee
90β
91β - name: Install charmcraft
92β run: sudo snap install charmcraft --classic
93β
94β - name: Install concierge
95β run: sudo snap install concierge --classic
96β
97β - name: Run integration tests via spread
98β run: charmcraft.spread -v github-ci:ubuntu-24.04:spread/deploy/
99βNow I need to also update the spread task.yaml to use concierge like they do. Let me check the task file and update it.
Now let me update the spread task to use concierge like the ubuntu-manpages-operator does:
summary: Run Beszel integration tests
environment:
MODEL: "$(HOST: uuidgen)"
prepare: |
# Add a Juju model for testing
juju add-model "${MODEL}"
# Install uv for Python dependency management
curl -LsSf https://astral.sh/uv/install.sh | sh
export PATH="$HOME/.local/bin:$PATH"
# Install Python (if not already available)
apt-get update
apt-get install -y python3 python3-venv
# Set up uv and install test dependencies
cd "${PROJECT_PATH}"
uv sync --group integration
execute: |
cd "${PROJECT_PATH}"
# Ensure uv is in PATH
export PATH="$HOME/.local/bin:$PATH"
# Set CHARM_PATH to the packed charm artifact
export CHARM_PATH="${CRAFT_ARTIFACT}"
# Run integration tests using pytest with Jubilant
uv run pytest tests/integration -v --tb=short
restore: |
# Clean up the Juju model
juju destroy-model --no-prompt --force --destroy-storage --no-wait --timeout=60s "${MODEL}" || truesummary: Run Beszel integration tests
environment:
MODEL: "$(HOST: uuidgen)"
prepare: |
# Setup Juju environment with concierge
concierge prepare --trace -p dev
# Add a Juju model for testing
juju add-model "${MODEL}"
# Install uv for Python dependency management
snap install --classic astral-uv
# Set up uv and install test dependencies
cd "${PROJECT_PATH}"
uv sync --group integration
# Pack the charm if not already packed
if [[ ! -f "${PROJECT_PATH}"/*.charm ]]; then
charmcraft pack
fi
# Ensure charm is owned by the current user
chown "$(id -u):$(id -g)" "${PROJECT_PATH}"/*.charm
execute: |
cd "${PROJECT_PATH}"
# Find the charm file
CHARM_PATH="$(ls "${PROJECT_PATH}"/*.charm | head -1)"
export CHARM_PATH
# Run integration tests using pytest with Jubilant
uv run pytest tests/integration -v --tb=short
restore: |
# Clean up the Juju model
juju destroy-model --no-prompt --force --destroy-storage --no-wait --timeout=60s "${MODEL}" || true
# Restore concierge environment if not in CI
if [[ -z "${CI:-}" ]]; then
concierge restore --trace || true
fiThe file /home/ubuntu/beszel-operator/spread/deploy/basic/task.yaml has been updated. Here's the result of running `cat -n` on a snippet of the edited file:
1βsummary: Run Beszel integration tests
2β
3βenvironment:
4β MODEL: "$(HOST: uuidgen)"
5β
6βprepare: |
7β # Setup Juju environment with concierge
8β concierge prepare --trace -p dev
9β
10β # Add a Juju model for testing
11β juju add-model "${MODEL}"
12β
13β # Install uv for Python dependency management
14β snap install --classic astral-uv
15β
16β # Set up uv and install test dependencies
17β cd "${PROJECT_PATH}"
18β uv sync --group integration
19β
20β # Pack the charm if not already packed
21β if [[ ! -f "${PROJECT_PATH}"/*.charm ]]; then
22β charmcraft pack
23β fi
24β
25β # Ensure charm is owned by the current user
26β chown "$(id -u):$(id -g)" "${PROJECT_PATH}"/*.charm
27β
28βexecute: |
29β cd "${PROJECT_PATH}"
30β
31β # Find the charm file
32β CHARM_PATH="$(ls "${PROJECT_PATH}"/*.charm | head -1)"
33β export CHARM_PATH
34β
35β # Run integration tests using pytest with Jubilant
36β uv run pytest tests/integration -v --tb=short
37β
38βrestore: |
39β # Clean up the Juju model
40β juju destroy-model --no-prompt --force --destroy-storage --no-wait --timeout=60s "${MODEL}" || true
41β
42β # Restore concierge environment if not in CI
43β if [[ -z "${CI:-}" ]]; then
44β concierge restore --trace || true
45β fi
46βGood! Now I need to remove the microk8s/juju setup from the spread.yaml suite prepare section since concierge will handle that. Let me update that.
Now let me remove the redundant Juju/microk8s setup from the spread suite since concierge handles that:
suites:
spread/deploy/:
summary: Deployment tests
prepare: |
juju_change=$(sudo snap install --no-wait juju --channel=3/stable)
microk8s_change=$(sudo snap install --no-wait --classic microk8s --channel=1.33/stable)
mkdir -p ~/.local/share/juju # Strictly-confined Juju needs this.
# Perform configuration that doesn't need the Juju controller here.
if [[ -n "${microk8s_change}" ]]; then
snap watch "${microk8s_change}"
sudo microk8s status --wait-ready
fi
if [[ -n "${juju_change}" ]]; then
snap watch "${juju_change}"
juju bootstrap microk8s
fi
# We don't need to do OS updates for each machine - this just takes up time.
juju model-defaults enable-os-refresh-update=false
juju model-defaults enable-os-upgrade=falseenvironment:
CI: "$(HOST: echo ${CI:-})"
suites:
spread/deploy/:
summary: Deployment testsThe file /home/ubuntu/beszel-operator/spread.yaml has been updated. Here's the result of running `cat -n` on a snippet of the edited file:
33βprepare: |
34β # Juju needs the charm etc. to be owned by the running user.
35β chown -R "${USER}" "${PROJECT_PATH}"
36β
37βenvironment:
38β CI: "$(HOST: echo ${CI:-})"
39β
40βsuites:
41β spread/deploy/:
42β summary: Deployment tests
43β
44β
45βexclude:
46β - .gitgit add -A && git commit -m "$(cat <<'EOF' fix: use charmcraft.spread with github-ci backend Adopt the pattern from ubuntu-manpages-operator: - Add github-ci backend to spread.yaml for running on GitHub Actions host - Use canonical/setup-lxd action for proper LXD configuration - Run charmcraft.spread directly instead of charmcraft test - Use concierge in spread tasks to set up Juju environment - Set path to /root/proj for snap confinement compatibility This avoids LXD networking issues while still using charmcraft test infrastructure via charmcraft.spread. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> EOF )"
3 files changed, 66 insertions(+), 53 deletions(-)
Perfect! I've restructured the integration tests to follow the ubuntu-manpages-operator pattern. Here's what changed:
Key Changes:
Added github-ci backend to spread.yaml - This runs spread tests directly on the GitHub Actions host via SSH to localhost, avoiding LXD container networking issues
Updated CI workflow to:
canonical/setup-lxd action for proper LXD setupcharmcraft.spread directly with the github-ci backendChanged to ubuntu-24.04 runner
Updated spread configuration:
path: /root/proj for snap confinement compatibilityRemoved redundant microk8s/juju setup from suite (concierge handles this)
Updated spread task to:
This approach uses charmcraft.spread (which is part of the charmcraft test infrastructure) while avoiding the LXD networking issues we encountered.
Please push:
git push origin main
The user has pushed the changes. Let me monitor the CI run to see if this approach works.
gh run list --repo tonyandrewmeyer/beszel-k8s-operator --limit 3
in_progress fix: use charmcraft.spread with github-ci backend GitHub Actions Security Analysis with zizmor π main push 20875315756 10s 2026-01-10T08:03:06Z in_progress fix: use charmcraft.spread with github-ci backend CI main push 20875315753 10s 2026-01-10T08:03:06Z completed success fix: use charmcraft test --destructive-mode to bypass LXD GitHub Actions Security Analysis with zizmor π main push 20875272987 18s 2026-01-10T07:59:21Z
The CI is running. Let me wait a bit and then watch it to see if it succeeds this time.
sleep 30 && gh run watch 20875315753 --repo tonyandrewmeyer/beszel-k8s-operator --exit-status
Exit code 1 Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875315753 Triggered via push less than a minute ago JOBS β Unit Tests in 33s (ID 59983640104) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job β Lint in 15s (ID 59983640108) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983640109) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge X Run integration tests via spread β Post Checkout β Complete job ANNOTATIONS X Process completed with exit code 1. Integration Tests: .github#7 X main CI Β· 20875315753 Triggered via push less than a minute ago JOBS β Unit Tests in 33s (ID 59983640104) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job β Lint in 15s (ID 59983640108) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job X Integration Tests in 43s (ID 59983640109) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge X Run integration tests via spread β Post Checkout β Complete job ANNOTATIONS X Process completed with exit code 1. Integration Tests: .github#7
gh run view 20875315753 --repo tonyandrewmeyer/beszel-k8s-operator --log-failed
Integration Tests Run integration tests via spread ο»Ώ2026-01-10T08:03:51.4114525Z ##[group]Run charmcraft.spread -v github-ci:ubuntu-24.04:spread/deploy/
Integration Tests Run integration tests via spread 2026-01-10T08:03:51.4115380Z [36;1mcharmcraft.spread -v github-ci:ubuntu-24.04:spread/deploy/[0m
Integration Tests Run integration tests via spread 2026-01-10T08:03:51.4153427Z shell: /usr/bin/bash -e {0}
Integration Tests Run integration tests via spread 2026-01-10T08:03:51.4153671Z ##[endgroup]
Integration Tests Run integration tests via spread 2026-01-10T08:03:51.7395574Z 2026-01-10 08:03:51 Found /home/runner/work/beszel-k8s-operator/beszel-k8s-operator/spread.yaml.
Integration Tests Run integration tests via spread 2026-01-10T08:03:51.7397891Z error: backend "craft" has unsupported type "craft"
Integration Tests Run integration tests via spread 2026-01-10T08:03:51.7422110Z ##[error]Process completed with exit code 1.The issue is that charmcraft.spread doesn't understand the "craft" backend type - it's a charmcraft-specific backend. I need to remove it or comment it out, since we're not using it with charmcraft.spread. We're using the github-ci backend instead.
The issue is that charmcraft.spread doesn't support the craft backend type. We need to remove it since we're using the github-ci backend:
project: beszel-operator
backends:
craft:
type: craft
systems:
- ubuntu-24.04
github-ci:project: beszel-operator backends: github-ci:
The file /home/ubuntu/beszel-operator/spread.yaml has been updated. Here's the result of running `cat -n` on a snippet of the edited file:
1βproject: beszel-operator
2β
3βbackends:
4β github-ci:
5β type: adhoc
6β manual: true
7β allocate: |
8β sudo sed -i "s|#PasswordAuthentication yes|PasswordAuthentication yes|g" /etc/ssh/sshd_configgit add spread.yaml && git commit -m "$(cat <<'EOF' fix: remove craft backend from spread.yaml The craft backend is charmcraft-specific and not supported by charmcraft.spread. We only need the github-ci backend for CI. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> EOF )"
1 file changed, 5 deletions(-)
I've removed the craft backend from spread.yaml since charmcraft.spread doesn't support it. We only need the github-ci backend for running tests in CI. Please push:
git push origin main
gh run list --repo tonyandrewmeyer/beszel-k8s-operator --limit 3
in_progress fix: remove craft backend from spread.yaml GitHub Actions Security Analysis with zizmor π main push 20875346114 8s 2026-01-10T08:05:35Z in_progress fix: remove craft backend from spread.yaml CI main push 20875346112 8s 2026-01-10T08:05:35Z completed success fix: use charmcraft.spread with github-ci backend GitHub Actions Security Analysis with zizmor π main push 20875315756 22s 2026-01-10T08:03:06Z
sleep 30 && gh run watch 20875346112 --repo tonyandrewmeyer/beszel-k8s-operator --exit-status
Exit code 1 Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875346112 Triggered via push less than a minute ago JOBS β Lint in 15s (ID 59983719983) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job β Unit Tests in 32s (ID 59983719985) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983719986) β Set up job β Checkout * Setup LXD * Install charmcraft * Install concierge * Run integration tests via spread * Post Checkout Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875346112 Triggered via push less than a minute ago JOBS β Lint in 15s (ID 59983719983) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job β Unit Tests in 32s (ID 59983719985) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983719986) β Set up job β Checkout β Setup LXD * Install charmcraft * Install concierge * Run integration tests via spread * Post Checkout Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875346112 Triggered via push less than a minute ago JOBS β Lint in 15s (ID 59983719983) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job β Unit Tests in 32s (ID 59983719985) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983719986) β Set up job β Checkout β Setup LXD β Install charmcraft * Install concierge * Run integration tests via spread * Post Checkout Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875346112 Triggered via push about 1 minute ago JOBS β Lint in 15s (ID 59983719983) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job β Unit Tests in 32s (ID 59983719985) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983719986) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge * Run integration tests via spread * Post Checkout Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875346112 Triggered via push about 1 minute ago JOBS β Lint in 15s (ID 59983719983) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job β Unit Tests in 32s (ID 59983719985) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983719986) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge * Run integration tests via spread * Post Checkout Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875346112 Triggered via push about 1 minute ago JOBS β Lint in 15s (ID 59983719983) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job β Unit Tests in 32s (ID 59983719985) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983719986) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge * Run integration tests via spread * Post Checkout Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875346112 Triggered via push about 1 minute ago JOBS β Lint in 15s (ID 59983719983) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job β Unit Tests in 32s (ID 59983719985) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983719986) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge * Run integration tests via spread * Post Checkout Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875346112 Triggered via push about 1 minute ago JOBS β Lint in 15s (ID 59983719983) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job β Unit Tests in 32s (ID 59983719985) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983719986) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge * Run integration tests via spread * Post Checkout Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875346112 Triggered via push about 1 minute ago JOBS β Lint in 15s (ID 59983719983) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job β Unit Tests in 32s (ID 59983719985) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983719986) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge X Run integration tests via spread * Post Checkout X main CI Β· 20875346112 Triggered via push about 1 minute ago JOBS β Lint in 15s (ID 59983719983) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job β Unit Tests in 32s (ID 59983719985) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job X Integration Tests in 1m19s (ID 59983719986) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge X Run integration tests via spread β Post Checkout β Complete job ANNOTATIONS X Process completed with exit code 1. Integration Tests: .github#22
gh run view 20875346112 --repo tonyandrewmeyer/beszel-k8s-operator --log-failed | tail -100
Integration Tests Run integration tests via spread ο»Ώ2026-01-10T08:06:32.6047350Z ##[group]Run charmcraft.spread -v github-ci:ubuntu-24.04:spread/deploy/
Integration Tests Run integration tests via spread 2026-01-10T08:06:32.6047974Z [36;1mcharmcraft.spread -v github-ci:ubuntu-24.04:spread/deploy/[0m
Integration Tests Run integration tests via spread 2026-01-10T08:06:32.6081444Z shell: /usr/bin/bash -e {0}
Integration Tests Run integration tests via spread 2026-01-10T08:06:32.6081690Z ##[endgroup]
Integration Tests Run integration tests via spread 2026-01-10T08:06:32.9513964Z 2026-01-10 08:06:32 Found /home/runner/work/beszel-k8s-operator/beszel-k8s-operator/spread.yaml.
Integration Tests Run integration tests via spread 2026-01-10T08:06:33.1712794Z 2026-01-10 08:06:33 Project content is packed for delivery (1.82MB).
Integration Tests Run integration tests via spread 2026-01-10T08:06:33.1713665Z 2026-01-10 08:06:33 If killed, discard servers with: spread -reuse-pid=5303 -discard
Integration Tests Run integration tests via spread 2026-01-10T08:06:33.1714467Z 2026-01-10 08:06:33 Allocating github-ci:ubuntu-24.04...
Integration Tests Run integration tests via spread 2026-01-10T08:06:54.0397728Z 2026-01-10 08:06:54 Waiting for github-ci:ubuntu-24.04 to make SSH available at 127.0.0.1...
Integration Tests Run integration tests via spread 2026-01-10T08:06:54.0399415Z 2026-01-10 08:06:54 Allocated github-ci:ubuntu-24.04.
Integration Tests Run integration tests via spread 2026-01-10T08:06:54.0414138Z 2026-01-10 08:06:54 Connecting to github-ci:ubuntu-24.04...
Integration Tests Run integration tests via spread 2026-01-10T08:06:54.2055023Z 2026-01-10 08:06:54 Connected to github-ci:ubuntu-24.04 at 127.0.0.1.
Integration Tests Run integration tests via spread 2026-01-10T08:06:54.2056176Z 2026-01-10 08:06:54 Sending project content to github-ci:ubuntu-24.04...
Integration Tests Run integration tests via spread 2026-01-10T08:06:56.0031422Z 2026-01-10 08:06:56 Preparing github-ci:ubuntu-24.04 (github-ci:ubuntu-24.04)...
Integration Tests Run integration tests via spread 2026-01-10T08:06:56.0253296Z 2026-01-10 08:06:56 Error preparing github-ci:ubuntu-24.04 (github-ci:ubuntu-24.04) : /bin/bash: line 32: PROJECT_PATH: unbound variable
Integration Tests Run integration tests via spread 2026-01-10T08:06:56.0254394Z 2026-01-10 08:06:56 Discarding github-ci:ubuntu-24.04...
Integration Tests Run integration tests via spread 2026-01-10T08:06:56.2630512Z error: unsuccessful run
Integration Tests Run integration tests via spread 2026-01-10T08:06:56.2631002Z 2026-01-10 08:06:56 Successful tasks: 0
Integration Tests Run integration tests via spread 2026-01-10T08:06:56.2632260Z 2026-01-10 08:06:56 Aborted tasks: 1
Integration Tests Run integration tests via spread 2026-01-10T08:06:56.2637612Z 2026-01-10 08:06:56 Failed project prepare: 1
Integration Tests Run integration tests via spread 2026-01-10T08:06:56.2638107Z - github-ci:ubuntu-24.04:project
Integration Tests Run integration tests via spread 2026-01-10T08:06:56.2659589Z ##[error]Process completed with exit code 1.The error is PROJECT_PATH: unbound variable. This is happening in the global prepare section in spread.yaml. The issue is that PROJECT_PATH is not available during the prepare phase when running with the github-ci backend. Let me check the prepare section and fix it.
The issue is that PROJECT_PATH is not available in the global prepare section. Let me remove that since it's not needed for the github-ci backend:
systems:
- ubuntu-24.04:
username: spread
workers: 1
prepare: |
# Juju needs the charm etc. to be owned by the running user.
chown -R "${USER}" "${PROJECT_PATH}"
environment: systems:
- ubuntu-24.04:
username: spread
workers: 1
environment:The file /home/ubuntu/beszel-operator/spread.yaml has been updated. Here's the result of running `cat -n` on a snippet of the edited file:
19β discard: |
20β sudo userdel -f -r spread || true
21β sudo rm -f /etc/sudoers.d/99-spread-user
22β
23β systems:
24β - ubuntu-24.04:
25β username: spread
26β workers: 1
27β
28βenvironment:
29β CI: "$(HOST: echo ${CI:-})"
30β
31βsuites:
32β spread/deploy/:Good, I removed the global prepare section. Now let me commit this fix and push it.
git add spread.yaml && git commit -m "$(cat <<'EOF' fix: remove global prepare from spread.yaml The global prepare section references PROJECT_PATH which is not available in the github-ci backend. The chown is not needed since the tests run as the spread user. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> EOF )"
1 file changed, 4 deletions(-)
I've removed the global prepare section from spread.yaml that was causing the PROJECT_PATH: unbound variable error. The chown operation isn't needed since tests run as the spread user. Please push:
git push origin main
The user has pushed the changes. Let me monitor the CI run to see if it passes now.
gh run list --repo tonyandrewmeyer/beszel-k8s-operator --limit 3
in_progress fix: remove global prepare from spread.yaml CI main push 20875371457 7s 2026-01-10T08:07:41Z in_progress fix: remove global prepare from spread.yaml GitHub Actions Security Analysis with zizmor π main push 20875371446 7s 2026-01-10T08:07:41Z completed success fix: remove craft backend from spread.yaml GitHub Actions Security Analysis with zizmor π main push 20875346114 24s 2026-01-10T08:05:35Z
sleep 30 && gh run watch 20875371457 --repo tonyandrewmeyer/beszel-k8s-operator --exit-status
Exit code 1 Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875371457 Triggered via push less than a minute ago JOBS β Unit Tests in 34s (ID 59983790379) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983790386) β Set up job β Checkout β Setup LXD β Install charmcraft * Install concierge * Run integration tests via spread * Post Checkout β Lint in 18s (ID 59983790392) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875371457 Triggered via push less than a minute ago JOBS β Unit Tests in 34s (ID 59983790379) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983790386) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge * Run integration tests via spread * Post Checkout β Lint in 18s (ID 59983790392) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875371457 Triggered via push less than a minute ago JOBS β Unit Tests in 34s (ID 59983790379) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983790386) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge * Run integration tests via spread * Post Checkout β Lint in 18s (ID 59983790392) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875371457 Triggered via push less than a minute ago JOBS β Unit Tests in 34s (ID 59983790379) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983790386) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge * Run integration tests via spread * Post Checkout β Lint in 18s (ID 59983790392) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875371457 Triggered via push about 1 minute ago JOBS β Unit Tests in 34s (ID 59983790379) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983790386) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge * Run integration tests via spread * Post Checkout β Lint in 18s (ID 59983790392) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875371457 Triggered via push about 1 minute ago JOBS β Unit Tests in 34s (ID 59983790379) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983790386) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge * Run integration tests via spread * Post Checkout β Lint in 18s (ID 59983790392) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875371457 Triggered via push about 1 minute ago JOBS β Unit Tests in 34s (ID ... [56706 characters truncated] ... β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875371457 Triggered via push about 6 minutes ago JOBS β Unit Tests in 34s (ID 59983790379) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983790386) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge * Run integration tests via spread * Post Checkout β Lint in 18s (ID 59983790392) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875371457 Triggered via push about 6 minutes ago JOBS β Unit Tests in 34s (ID 59983790379) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983790386) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge * Run integration tests via spread * Post Checkout β Lint in 18s (ID 59983790392) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875371457 Triggered via push about 6 minutes ago JOBS β Unit Tests in 34s (ID 59983790379) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983790386) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge * Run integration tests via spread * Post Checkout β Lint in 18s (ID 59983790392) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875371457 Triggered via push about 6 minutes ago JOBS β Unit Tests in 34s (ID 59983790379) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983790386) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge * Run integration tests via spread * Post Checkout β Lint in 18s (ID 59983790392) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job Refreshing run status every 3 seconds. Press Ctrl+C to quit. * main CI Β· 20875371457 Triggered via push about 6 minutes ago JOBS β Unit Tests in 34s (ID 59983790379) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job * Integration Tests (ID 59983790386) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge * Run integration tests via spread * Post Checkout β Lint in 18s (ID 59983790392) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job X main CI Β· 20875371457 Triggered via push about 6 minutes ago JOBS β Unit Tests in 34s (ID 59983790379) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run unit tests β Post Set up Python β Post Install uv β Post Checkout β Complete job X Integration Tests in 6m49s (ID 59983790386) β Set up job β Checkout β Setup LXD β Install charmcraft β Install concierge X Run integration tests via spread β Post Checkout β Complete job β Lint in 18s (ID 59983790392) β Set up job β Checkout β Install uv β Set up Python β Install dependencies β Run ruff format check β Run ruff check β Run codespell β Run pyright β Post Set up Python β Post Install uv β Post Checkout β Complete job
gh run view 20875371457 --repo tonyandrewmeyer/beszel-k8s-operator --log-failed | tail -150
Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2664904Z time=2026-01-10T08:09:03.963Z level=INFO msg="Installed snap" snap=jhack Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2665490Z time=2026-01-10T08:09:03.963Z level=DEBUG msg="Starting command" command="/usr/bin/snap connect jhack:dot-local-share-juju" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2666289Z time=2026-01-10T08:09:04.238Z level=DEBUG msg="Finished command" command="/usr/bin/snap connect jhack:dot-local-share-juju" elapsed=275.091603ms Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2667027Z Command: /usr/bin/snap connect jhack:dot-local-share-juju Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2667396Z time=2026-01-10T08:09:04.238Z level=DEBUG msg="Installing snap" snap=jq Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2667932Z time=2026-01-10T08:09:04.429Z level=DEBUG msg="Queried snapd API" snap=jq installed=false classic=false tracking="" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2668649Z time=2026-01-10T08:09:04.429Z level=DEBUG msg="Starting command" command="/usr/bin/snap install jq --channel latest/stable" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2669441Z time=2026-01-10T08:09:10.057Z level=DEBUG msg="Finished command" command="/usr/bin/snap install jq --channel latest/stable" elapsed=5.628242367s Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2670037Z Command: /usr/bin/snap install jq --channel latest/stable Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2670301Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2670484Z jq 1.5+dfsg-1 from Michael Vogt (mvo*) installed Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2670817Z time=2026-01-10T08:09:10.057Z level=INFO msg="Installed snap" snap=jq Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2671214Z time=2026-01-10T08:09:10.057Z level=DEBUG msg="Installing snap" snap=yq Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2671746Z time=2026-01-10T08:09:10.246Z level=DEBUG msg="Queried snapd API" snap=yq installed=false classic=false tracking="" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2672436Z time=2026-01-10T08:09:10.246Z level=DEBUG msg="Starting command" command="/usr/bin/snap install yq --channel latest/stable" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2673216Z time=2026-01-10T08:09:12.526Z level=DEBUG msg="Finished command" command="/usr/bin/snap install yq --channel latest/stable" elapsed=2.279473811s Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2673805Z Command: /usr/bin/snap install yq --channel latest/stable Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2674071Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2674245Z yq v4.49.2 from Mike Farah (mikefarah) installed Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2674588Z time=2026-01-10T08:09:12.526Z level=INFO msg="Installed snap" snap=yq Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2675297Z time=2026-01-10T08:09:12.526Z level=DEBUG msg="Installing snap" snap=charmcraft Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2675918Z time=2026-01-10T08:09:12.802Z level=DEBUG msg="Queried snapd API" snap=charmcraft installed=true classic=true tracking=latest/stable Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2676739Z time=2026-01-10T08:09:12.802Z level=DEBUG msg="Starting command" command="/usr/bin/snap refresh charmcraft --channel latest/stable --classic" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2677639Z time=2026-01-10T08:09:13.189Z level=DEBUG msg="Finished command" command="/usr/bin/snap refresh charmcraft --channel latest/stable --classic" elapsed=386.72423ms Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2678496Z Command: /usr/bin/snap refresh charmcraft --channel latest/stable --classic Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2678827Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2678996Z snap "charmcraft" has no updates available Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2679338Z time=2026-01-10T08:09:13.189Z level=INFO msg="Refreshed snap" snap=charmcraft Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2679780Z time=2026-01-10T08:09:13.189Z level=DEBUG msg="Installing snap" snap=rockcraft Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2680359Z time=2026-01-10T08:09:13.496Z level=DEBUG msg="Queried snapd API" snap=rockcraft installed=false classic=true tracking="" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2681135Z time=2026-01-10T08:09:13.496Z level=DEBUG msg="Starting command" command="/usr/bin/snap install rockcraft --channel latest/stable --classic" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2682046Z time=2026-01-10T08:09:16.706Z level=DEBUG msg="Finished command" command="/usr/bin/snap install rockcraft --channel latest/stable --classic" elapsed=3.210854236s Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2682749Z Command: /usr/bin/snap install rockcraft --channel latest/stable --classic Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2683081Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2683256Z rockcraft 1.16.0 from Canonical** installed Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2683589Z time=2026-01-10T08:09:16.707Z level=INFO msg="Installed snap" snap=rockcraft Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2684009Z time=2026-01-10T08:09:16.707Z level=DEBUG msg="Installing snap" snap=k8s Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2684493Z time=2026-01-10T08:09:16.707Z level=DEBUG msg="Starting command" command="/usr/bin/which iptables" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2685398Z time=2026-01-10T08:09:16.710Z level=DEBUG msg="Finished command" command="/usr/bin/which iptables" elapsed=2.941674ms Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2686011Z Command: /usr/bin/which iptables Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2686220Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2686370Z /usr/sbin/iptables Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2686757Z time=2026-01-10T08:09:16.954Z level=DEBUG msg="Queried snapd API" snap=k8s installed=false classic=true tracking="" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2687501Z time=2026-01-10T08:09:16.954Z level=DEBUG msg="Starting command" command="/usr/bin/snap install k8s --channel 1.32-classic/stable --classic" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2688296Z time=2026-01-10T08:09:17.369Z level=DEBUG msg="Queried snapd API" snap=lxd installed=true classic=false tracking=latest/candidate Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2689054Z time=2026-01-10T08:09:17.369Z level=DEBUG msg="Skipping LXD stop - no channel change required" tracking=latest/candidate target="" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2689644Z time=2026-01-10T08:09:17.369Z level=DEBUG msg="Installing snap" snap=lxd Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2690217Z time=2026-01-10T08:09:17.885Z level=DEBUG msg="Queried snapd API" snap=lxd installed=true classic=false tracking=latest/candidate Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2691074Z time=2026-01-10T08:09:26.001Z level=DEBUG msg="Finished command" command="/usr/bin/snap install k8s --channel 1.32-classic/stable --classic" elapsed=9.046213347s Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2691774Z Command: /usr/bin/snap install k8s --channel 1.32-classic/stable --classic Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2692095Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2692310Z k8s (1.32-classic/stable) v1.32.11 from Canonical** installed Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2692681Z time=2026-01-10T08:09:26.001Z level=INFO msg="Installed snap" snap=k8s Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2693091Z time=2026-01-10T08:09:26.001Z level=DEBUG msg="Installing snap" snap=kubectl Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2693579Z time=2026-01-10T08:09:26.001Z level=DEBUG msg="Starting command" command="/usr/bin/snap refresh lxd" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2694345Z time=2026-01-10T08:09:26.583Z level=DEBUG msg="Queried snapd API" snap=kubectl installed=false classic=true tracking="" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2695866Z time=2026-01-10T08:09:26.597Z level=DEBUG msg="Finished command" command="/usr/bin/snap refresh lxd" elapsed=595.876698ms Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2696768Z Command: /usr/bin/snap refresh lxd Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2697162Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2697435Z snap "lxd" has no updates available Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2697897Z time=2026-01-10T08:09:26.597Z level=INFO msg="Refreshed snap" snap=lxd Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2698432Z time=2026-01-10T08:09:26.597Z level=DEBUG msg="Starting command" command="/usr/sbin/lxd waitready --timeout 270" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2699318Z time=2026-01-10T08:09:26.597Z level=DEBUG msg="Starting command" command="/usr/bin/snap install kubectl --channel stable --classic" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2700200Z time=2026-01-10T08:09:26.713Z level=DEBUG msg="Finished command" command="/usr/sbin/lxd waitready --timeout 270" elapsed=116.685141ms Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2701197Z Command: /usr/sbin/lxd waitready --timeout 270 Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2702070Z time=2026-01-10T08:09:26.713Z level=DEBUG msg="Starting command" command="/usr/sbin/lxd init --minimal" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2703289Z time=2026-01-10T08:09:26.837Z level=DEBUG msg="Finished command" command="/usr/sbin/lxd init --minimal" elapsed=123.470672ms Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2704209Z Command: /usr/sbin/lxd init --minimal Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2705294Z time=2026-01-10T08:09:26.837Z level=DEBUG msg="Starting command" command="/usr/sbin/lxc network set lxdbr0 ipv6.address none" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2706593Z time=2026-01-10T08:09:27.633Z level=DEBUG msg="Finished command" command="/usr/sbin/lxc network set lxdbr0 ipv6.address none" elapsed=795.498317ms Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2707288Z Command: /usr/sbin/lxc network set lxdbr0 ipv6.address none Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2707896Z time=2026-01-10T08:09:27.633Z level=DEBUG msg="Starting command" command="/usr/bin/chmod a+wr /var/snap/lxd/common/lxd/unix.socket" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2709251Z time=2026-01-10T08:09:27.635Z level=DEBUG msg="Finished command" command="/usr/bin/chmod a+wr /var/snap/lxd/common/lxd/unix.socket" elapsed=2.58415ms Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2710034Z Command: /usr/bin/chmod a+wr /var/snap/lxd/common/lxd/unix.socket Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2710726Z time=2026-01-10T08:09:27.635Z level=DEBUG msg="Starting command" command="/usr/sbin/usermod -a -G lxd root" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2711416Z time=2026-01-10T08:09:27.670Z level=DEBUG msg="Finished command" command="/usr/sbin/usermod -a -G lxd root" elapsed=35.102308ms Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2711929Z Command: /usr/sbin/usermod -a -G lxd root Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2712440Z time=2026-01-10T08:09:27.670Z level=DEBUG msg="Starting command" command="/usr/sbin/iptables -F FORWARD" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2713456Z time=2026-01-10T08:09:27.678Z level=DEBUG msg="Finished command" command="/usr/sbin/iptables -F FORWARD" elapsed=7.768277ms Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2713965Z Command: /usr/sbin/iptables -F FORWARD Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2714418Z time=2026-01-10T08:09:27.678Z level=DEBUG msg="Starting command" command="/usr/sbin/iptables -P FORWARD ACCEPT" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2715383Z time=2026-01-10T08:09:27.691Z level=DEBUG msg="Finished command" command="/usr/sbin/iptables -P FORWARD ACCEPT" elapsed=12.9458ms Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2715927Z Command: /usr/sbin/iptables -P FORWARD ACCEPT Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2716279Z time=2026-01-10T08:09:27.691Z level=INFO msg="Prepared provider" provider=lxd Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2716954Z time=2026-01-10T08:09:28.732Z level=DEBUG msg="Finished command" command="/usr/bin/snap install kubectl --channel stable --classic" elapsed=2.135415481s Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2717612Z Command: /usr/bin/snap install kubectl --channel stable --classic Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2717915Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2718090Z kubectl 1.34.3 from Canonical** installed Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2718424Z time=2026-01-10T08:09:28.732Z level=INFO msg="Installed snap" snap=kubectl Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2718912Z time=2026-01-10T08:09:28.732Z level=DEBUG msg="Starting command" command="/snap/bin/k8s status" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2719523Z time=2026-01-10T08:09:29.837Z level=DEBUG msg="Finished command" command="/snap/bin/k8s status" elapsed=1.104589121s Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2720004Z Command: /snap/bin/k8s status Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2720212Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2720511Z Error: The node is not part of a Kubernetes cluster. You can bootstrap a new cluster with: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2720831Z Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2720901Z sudo k8s bootstrap Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2721245Z time=2026-01-10T08:09:29.837Z level=DEBUG msg="Starting command" command="/snap/bin/k8s bootstrap" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2721875Z time=2026-01-10T08:09:33.687Z level=DEBUG msg="Finished command" command="/snap/bin/k8s bootstrap" elapsed=3.849702111s Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2722511Z Command: /snap/bin/k8s bootstrap Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2722714Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2724912Z Bootstrap config verification failed: pre-init checks failed for node: The path '/run/containerd' required for the containerd socket already exists. This may mean that another service is already using that path, and it conflicts with the k8s snap. Please make sure that there is no other service installed that uses the same path, and remove the existing directory.(dev-only): You can change the default k8s containerd base path with the containerd-base-dir option in the bootstrap / join-cluster config file.time=2026-01-10T08:09:34.687Z level=DEBUG msg="Starting command" command="/snap/bin/k8s bootstrap" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2727209Z time=2026-01-10T08:09:36.079Z level=DEBUG msg="Finished command" command="/snap/bin/k8s bootstrap" elapsed=1.391630085s Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2727683Z Command: /snap/bin/k8s bootstrap Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2727882Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2729842Z Bootstrap config verification failed: pre-init checks failed for node: The path '/run/containerd' required for the containerd socket already exists. This may mean that another service is already using that path, and it conflicts with the k8s snap. Please make sure that there is no other service installed that uses the same path, and remove the existing directory.(dev-only): You can change the default k8s containerd base path with the containerd-base-dir option in the bootstrap / join-cluster config file.time=2026-01-10T08:09:38.079Z level=DEBUG msg="Starting command" command="/snap/bin/k8s bootstrap" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2732241Z time=2026-01-10T08:09:39.461Z level=DEBUG msg="Finished command" command="/snap/bin/k8s bootstrap" elapsed=1.381552979s Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2732703Z Command: /snap/bin/k8s bootstrap Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2732913Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2735083Z Bootstrap config verification failed: pre-init checks failed for node: The path '/run/containerd' required for the containerd socket already exists. This may mean that another service is already using that path, and it conflicts with the k8s snap. Please make sure that there is no other service installed that uses the same path, and remove the existing directory.(dev-only): You can change the default k8s containerd base path with the containerd-base-dir option in the bootstrap / join-cluster config file.time=2026-01-10T08:09:43.461Z level=DEBUG msg="Starting command" command="/snap/bin/k8s bootstrap" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2737370Z time=2026-01-10T08:09:44.840Z level=DEBUG msg="Finished command" command="/snap/bin/k8s bootstrap" elapsed=1.379231835s Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2737846Z Command: /snap/bin/k8s bootstrap Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2738050Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2740003Z Bootstrap config verification failed: pre-init checks failed for node: The path '/run/containerd' required for the containerd socket already exists. This may mean that another service is already using that path, and it conflicts with the k8s snap. Please make sure that there is no other service installed that uses the same path, and remove the existing directory.(dev-only): You can change the default k8s containerd base path with the containerd-base-dir option in the bootstrap / join-cluster config file.time=2026-01-10T08:09:52.840Z level=DEBUG msg="Starting command" command="/snap/bin/k8s bootstrap" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2742260Z time=2026-01-10T08:09:54.227Z level=DEBUG msg="Finished command" command="/snap/bin/k8s bootstrap" elapsed=1.386469966s Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2742730Z Command: /snap/bin/k8s bootstrap Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2742933Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2745055Z Bootstrap config verification failed: pre-init checks failed for node: The path '/run/containerd' required for the containerd socket already exists. This may mean that another service is already using that path, and it conflicts with the k8s snap. Please make sure that there is no other service installed that uses the same path, and remove the existing directory.(dev-only): You can change the default k8s containerd base path with the containerd-base-dir option in the bootstrap / join-cluster config file.time=2026-01-10T08:10:10.227Z level=DEBUG msg="Starting command" command="/snap/bin/k8s bootstrap" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2748603Z time=2026-01-10T08:10:11.600Z level=DEBUG msg="Finished command" command="/snap/bin/k8s bootstrap" elapsed=1.372964099s Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2749344Z Command: /snap/bin/k8s bootstrap Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2749551Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2751522Z Bootstrap config verification failed: pre-init checks failed for node: The path '/run/containerd' required for the containerd socket already exists. This may mean that another service is already using that path, and it conflicts with the k8s snap. Please make sure that there is no other service installed that uses the same path, and remove the existing directory.(dev-only): You can change the default k8s containerd base path with the containerd-base-dir option in the bootstrap / join-cluster config file.time=2026-01-10T08:10:43.612Z level=DEBUG msg="Starting command" command="/snap/bin/k8s bootstrap" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2754413Z time=2026-01-10T08:10:45.004Z level=DEBUG msg="Finished command" command="/snap/bin/k8s bootstrap" elapsed=1.39228682s Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2755447Z Command: /snap/bin/k8s bootstrap Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2755831Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2759435Z Bootstrap config verification failed: pre-init checks failed for node: The path '/run/containerd' required for the containerd socket already exists. This may mean that another service is already using that path, and it conflicts with the k8s snap. Please make sure that there is no other service installed that uses the same path, and remove the existing directory.(dev-only): You can change the default k8s containerd base path with the containerd-base-dir option in the bootstrap / join-cluster config file.time=2026-01-10T08:11:49.005Z level=DEBUG msg="Starting command" command="/snap/bin/k8s bootstrap" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2763625Z time=2026-01-10T08:11:50.398Z level=DEBUG msg="Finished command" command="/snap/bin/k8s bootstrap" elapsed=1.393737129s Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2764135Z Command: /snap/bin/k8s bootstrap Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2764349Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2766713Z Bootstrap config verification failed: pre-init checks failed for node: The path '/run/containerd' required for the containerd socket already exists. This may mean that another service is already using that path, and it conflicts with the k8s snap. Please make sure that there is no other service installed that uses the same path, and remove the existing directory.(dev-only): You can change the default k8s containerd base path with the containerd-base-dir option in the bootstrap / join-cluster config file.time=2026-01-10T08:13:58.399Z level=DEBUG msg="Starting command" command="/snap/bin/k8s bootstrap" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2769041Z time=2026-01-10T08:13:59.794Z level=DEBUG msg="Finished command" command="/snap/bin/k8s bootstrap" elapsed=1.394916247s Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2769527Z Command: /snap/bin/k8s bootstrap Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2769727Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2771706Z Bootstrap config verification failed: pre-init checks failed for node: The path '/run/containerd' required for the containerd socket already exists. This may mean that another service is already using that path, and it conflicts with the k8s snap. Please make sure that there is no other service installed that uses the same path, and remove the existing directory.(dev-only): You can change the default k8s containerd base path with the containerd-base-dir option in the bootstrap / join-cluster config file.time=2026-01-10T08:14:29.867Z level=DEBUG msg="Starting command" command="/snap/bin/k8s bootstrap" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2773982Z time=2026-01-10T08:14:31.252Z level=DEBUG msg="Finished command" command="/snap/bin/k8s bootstrap" elapsed=1.384372218s Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2774450Z Command: /snap/bin/k8s bootstrap Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2774855Z Output: Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2776886Z Bootstrap config verification failed: pre-init checks failed for node: The path '/run/containerd' required for the containerd socket already exists. This may mean that another service is already using that path, and it conflicts with the k8s snap. Please make sure that there is no other service installed that uses the same path, and remove the existing directory.(dev-only): You can change the default k8s containerd base path with the containerd-base-dir option in the bootstrap / join-cluster config file.time=2026-01-10T08:14:31.257Z level=DEBUG msg="Filesystem ownership changed" user=root group=0 path=/root/.cache Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2779650Z time=2026-01-10T08:14:31.257Z level=DEBUG msg="Filesystem ownership changed" user=root group=0 path=/root/.cache/concierge/concierge.yaml Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2780416Z time=2026-01-10T08:14:31.257Z level=DEBUG msg="Merged runtime configuration saved" path=.cache/concierge/concierge.yaml Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2781089Z time=2026-01-10T08:14:31.257Z level=ERROR msg="concierge failed" error="failed to install K8s: exit status 1" Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2781518Z ----- Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2781668Z . Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2781988Z 2026-01-10 08:14:31 Restoring github-ci:ubuntu-24.04:spread/deploy/basic (github-ci:ubuntu-24.04)... Integration Tests Run integration tests via spread 2026-01-10T08:14:31.2824351Z 2026-01-10 08:14:31 Discarding github-ci:ubuntu-24.04... Integration Tests Run integration tests via spread 2026-01-10T08:14:31.5029743Z 2026-01-10 08:14:31 Successful tasks: 0 Integration Tests Run integration tests via spread 2026-01-10T08:14:31.5030276Z 2026-01-10 08:14:31 Aborted tasks: 1 Integration Tests Run integration tests via spread 2026-01-10T08:14:31.5030663Z error: unsuccessful run Integration Tests Run integration tests via spread 2026-01-10T08:14:31.5031004Z 2026-01-10 08:14:31 Failed task prepare: 1 Integration Tests Run integration tests via spread 2026-01-10T08:14:31.5031457Z - github-ci:ubuntu-24.04:spread/deploy/basic Integration Tests Run integration tests via spread 2026-01-10T08:14:31.5053131Z ##[error]Process completed with exit code 1.
The error is:
Bootstrap config verification failed: pre-init checks failed for node: The path '/run/containerd' required for the containerd socket already exists. This may mean that another service is already using that path, and it conflicts with the k8s snap.
This is because we removed Docker but left /run/containerd directory. We need to remove it before running concierge. Actually wait, we already do this in the CI workflow:
- name: Remove Docker to avoid conflicts with LXD
run: |
sudo apt-get remove -y docker-ce docker-ce-cli containerd.io
sudo rm -rf /run/containerd
But this is done on the GitHub Actions host. The problem is that the spread test runs concierge prepare inside the spread task, which is running on a separate user account (the spread user), and concierge is trying to bootstrap k8s which is conflicting with the /run/containerd that still exists on that host.
Actually looking more carefully at the logs, the k8s bootstrap is happening within concierge prepare, which is being run from the spread task prepare section. The /run/containerd was removed on the GitHub Actions runner before spread starts, but since the github-ci backend runs on localhost via SSH as the spread user, it's the same machine and the directory still exists or got recreated.
Actually, looking at the workflow again, we do remove it. But the issue is that the canonical/setup-lxd action might be recreating containerd or something.
Let me check the ubuntu-manpages-operator more carefully. Looking at their workflow again, I see they don't have a "Remove Docker" step. They just use canonical/setup-lxd. So maybe the issue is that we're removing Docker but canonical/setup-lxd is somehow bringing it back or creating /run/containerd?
Actually wait, let me reread the error. It says concierge is failing to install k8s because /run/containerd exists.
The issue is that concierge's k8s bootstrap runs during the spread task's prepare phase, not before spread starts on the runner. The ubuntu-manpages-operator uses self-hosted runners which likely don't have Docker pre-installed, unlike GitHub-hosted runners. I should add a step in the spread task itself to remove /run/containerd before concierge runs, or configure k8s to use a different containerd socket path.
The issue is that /run/containerd exists from Docker removal, and k8s snap can't bootstrap because it needs that path. Looking at the CI workflow, we removed Docker on the GitHub Actions host, but concierge is running inside the spread task and encountering the same issue.
Let me update the spread task to clean up /run/containerd before running concierge:
prepare: | # Setup Juju environment with concierge concierge prepare --trace -p dev
prepare: | # Remove Docker containerd directory if it exists (conflicts with k8s snap) sudo rm -rf /run/containerd # Setup Juju environment with concierge concierge prepare --trace -p dev
The file /home/ubuntu/beszel-operator/spread/deploy/basic/task.yaml has been updated. Here's the result of running `cat -n` on a snippet of the edited file:
2β
3βenvironment:
4β MODEL: "$(HOST: uuidgen)"
5β
6βprepare: |
7β # Remove Docker containerd directory if it exists (conflicts with k8s snap)
8β sudo rm -rf /run/containerd
9β
10β # Setup Juju environment with concierge
11β concierge prepare --trace -p dev
12β
13β # Add a Juju model for testing
14β juju add-model "${MODEL}"
15βgit add spread/deploy/basic/task.yaml && git commit -m "$(cat <<'EOF' fix: remove /run/containerd before concierge prepare The k8s snap requires /run/containerd path and conflicts with any existing containerd directory. Remove it before running concierge prepare in the spread task. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> EOF )"
1 file changed, 3 insertions(+)
Perfect! I've added cleanup of /run/containerd before running concierge prepare in the spread task. This should resolve the k8s bootstrap conflict. Please push:
git push origin main
The user has pushed the changes. Let me monitor the CI run to see if this fixes the issue.
gh run list --repo tonyandrewmeyer/beszel-k8s-operator --limit 3
in_progress fix: remove /run/containerd before concierge prepare GitHub Actions Security Analysis with zizmor π main push 20875463703 7s 2026-01-10T08:15:41Z in_progress fix: remove /run/containerd before concierge prepare CI main push 20875463702 7s 2026-01-10T08:15:41Z completed failure fix: remove global prepare from spread.yaml CI main push 20875371457 6m53s 2026-01-10T08:07:41Z
sleep 30 && gh run watch 20875463702 --repo tonyandrewmeyer/beszel-k8s-operator --exit-status