How to run the full Juju integration suite locally

The integration tests deploy the charm with Juju and check each of its integrations, as CI workflows describes. CI runs them with Canonical’s charm-ci; locally, run them with tox -e integration. The tests take the charm and its image from build/artifacts.build.yaml through charm-ci’s pytest plugin, so the steps below build both and prepare the machine with charm-ci’s opcli tool and the concierge file CI uses.

Create a VM

The charm and the observability charms the tests deploy are published for AMD64. On an AMD64 host, create and enter a fresh Ubuntu 24.04 LTS VM with Multipass, sized like the GitHub runners CI uses. On an Apple Silicon Mac, rely on your pull request’s CI run.

multipass launch 24.04 --cpus 4 --memory 16G --disk 50G --name gopkg-suite
multipass shell gopkg-suite

Keep it separate from the VM in Set up a development environment: the steps below install Canonical Kubernetes, which cannot run next to MicroK8s.

Inside the VM, clone the repository:

git clone https://github.com/canonical/gopkg-charmed.git gopkg-charm

To test changes that are not on GitHub yet, mount your checkout instead, as Set up a development environment describes, with gopkg-suite as the VM name.

Install charm-ci’s tools

Install opcli from the charm-ci release that the integration test workflow pins, then the tools it drives:

sudo snap install astral-uv --classic
uv tool install "opcli[cli] @ git+https://github.com/canonical/charm-ci.git@v1.0.1"
export PATH="$HOME/.local/bin:$PATH"
opcli install all

opcli install all adds your user to the lxd group. Leave the VM with exit and enter it again with multipass shell gopkg-suite so the membership applies.

Build and prepare

Build the rock and the charm from artifacts.yaml, prepare the VM from the concierge file CI uses for Juju 3, and push the rock to a local registry:

cd ~/gopkg-charm
opcli artifacts build
opcli env provision -c concierge-lxd.yaml
opcli artifacts push-images --missing-registry deploy

To test on Juju 4, as the second CI run does, use another VM and concierge-juju4.yaml.

Run the tests

cd ~/gopkg-charm/app/charm
INGRESS_CLASS=cilium tox -e integration

INGRESS_CLASS=cilium is the value CI passes from spread.yaml: the Cilium ingress controller of Canonical Kubernetes is not the cluster’s default ingress class. Each test module deploys into its own temporary model.

After changing the service, the rock, or the charm, run opcli artifacts build and opcli artifacts push-images --missing-registry deploy again from the repository root before the tests.