Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ci: run the smoke tests on a schedule #1387

Merged
merged 29 commits into from
Sep 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
e9dc9be
ci: run the smoke tests on a schedule.
tonyandrewmeyer Aug 26, 2024
2244f83
2.9 needs to install with --classic.
tonyandrewmeyer Aug 26, 2024
885c9da
4.0 needs the beta label.
tonyandrewmeyer Aug 26, 2024
ce9912f
charmcraft needs --classic.
tonyandrewmeyer Aug 26, 2024
8fca48e
Need the actual repo to run the tests :)
tonyandrewmeyer Aug 26, 2024
05af3ff
Test on lxd and microk8s.
tonyandrewmeyer Aug 26, 2024
2f0d756
pylibjuju on 2.x and 4.x is complex, so just stick with Juju 3 for now.
tonyandrewmeyer Aug 26, 2024
c379ea4
Use the tutorial instructions for setting up microk8s.
tonyandrewmeyer Aug 26, 2024
7c686b7
Set up the cloud before Juju.
tonyandrewmeyer Aug 26, 2024
3064046
microk8s needs --classic.
tonyandrewmeyer Aug 26, 2024
cced4e6
Fix if statements.
tonyandrewmeyer Aug 26, 2024
7573ca5
Maybe the group instructions are out of date?
tonyandrewmeyer Aug 26, 2024
530553c
Simplify the microk8s install.
tonyandrewmeyer Aug 26, 2024
78aea0d
Use a pre-packaged action to get microk8s.
tonyandrewmeyer Aug 26, 2024
c4113ba
Fix the cloud name for k8s.
tonyandrewmeyer Aug 26, 2024
aa1e0f6
Run tests as root (ugh).
tonyandrewmeyer Aug 26, 2024
728789c
Install tox for root.
tonyandrewmeyer Aug 26, 2024
ad6c711
Use sudo for bootstrapping k8s.
tonyandrewmeyer Aug 26, 2024
ec417ca
Use sudo for bootstrapping k8s.
tonyandrewmeyer Aug 26, 2024
5533145
Try to get just k8s working.
tonyandrewmeyer Aug 26, 2024
e729106
LXD is required for packing.
tonyandrewmeyer Aug 26, 2024
b57a376
Pack ourselves, to work around the permission issue (and does packing…
tonyandrewmeyer Sep 4, 2024
7653ed4
The charm path needs to be absolute or Juju looks in the store.
tonyandrewmeyer Sep 4, 2024
4b57fe7
Try running against Juju 2 and 3.
tonyandrewmeyer Sep 4, 2024
49dccfd
Stick with Juju 3.5 for now.
tonyandrewmeyer Sep 4, 2024
5aed2d3
Bump LXD version.
tonyandrewmeyer Sep 24, 2024
1646ceb
Run pack with verbose.
tonyandrewmeyer Sep 24, 2024
f5a5299
Skip the test that needs charmcraft 3 if only charmcraft 2 is installed.
tonyandrewmeyer Sep 24, 2024
0d9c0cc
Handle differences in charmcraft version between 2 and 3.
tonyandrewmeyer Sep 24, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions .github/workflows/smoke.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: ops Smoke Tests

on:
workflow_dispatch:
schedule:
- cron: '0 7 25 * *'

jobs:
test:
runs-on: ubuntu-latest

strategy:
matrix:
# pylibjuju does not currently support Juju 4.x
# The smoke tests do not yet work on Juju 2.9.
juju-version: ['3.5']
charmcraft-version: ['2.x', '3.x']
cloud: ['lxd', 'microk8s']

env:
JUJU_VERSION: "${{ matrix.juju-version }}"

steps:
# LXD is required for charmcraft to pack, even if it's not used as the
# Juju cloud.
- name: Set up LXD
uses: canonical/setup-lxd@8fb85546a934dfb994becf81341dd387ffe6aabb
with:
channel: 5.0/stable

- name: Set up Microk8s
if: matrix.cloud == 'microk8s'
uses: balchua/[email protected]
with:
channel: '1.26-strict/stable'
devMode: 'true'
addons: '["dns", "hostpath-storage"]'

- name: Set up Juju (classic)
if: matrix.juju-version == '2.9'
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shall we just drop the "if 2.9" stuff here, seeing we're not running these on 2.9? Or do you think we should add that in the near future?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, good question. I started out planning to do 2.9, 3.[latest stable], and 4.0, thinking that would be a good range of coverage. 2.9 because it's still in "security fix support" and seems to have non-trivial use still, 3.[latest stable] because it seems unlikely that we'd break deploying only for one 3.x, and 4.0 because it's good to be proactive. I then ran into a bunch of issues and ended up dropping down to just 3.x.

tox -e smoke passes for me (except for trying to deploy on 24.04) locally, so I think it shouldn't be too much work to get it working in CI as well. I'd like to use a quite small amount of time to try to get that going and if not dropping it would make sense yes. I could cut it from this PR and add it back later if that was preferred.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. I'm happy either way -- no specific urgency on this.

run: sudo snap install juju --classic --channel=${{ matrix.juju-version }}

- name: Set up Juju
if: matrix.juju-version != '2.9'
run: sudo snap install juju --channel=${{ matrix.juju-version }}

- name: Bootstrap Juju controller (k8s)
if: matrix.cloud == 'microk8s'
run: sg snap_microk8s -c 'juju bootstrap microk8s'

- name: Bootstrap Juju controller (lxd)
if: matrix.cloud == 'lxd'
run: juju bootstrap localhost

- name: Install charmcraft
run: sudo snap install charmcraft --channel=${{ matrix.charmcraft-version }} --classic

- name: Checkout the repository
uses: actions/checkout@v4

- name: Set up Python 3
uses: actions/setup-python@v5

- name: Install tox
run: pip install tox~=4.2

- name: Run smoke tests
run: tox -e smoke
43 changes: 42 additions & 1 deletion test/smoke/test_smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@
#
# Learn more about testing at: https://juju.is/docs/sdk/testing

import grp
import logging
import os
import pathlib
import subprocess

import pytest
from pytest_operator.plugin import OpsTest
Expand Down Expand Up @@ -45,6 +49,33 @@
"""


def pack(charm_dir: pathlib.Path):
"""Pack the charm.

The pytest-operator plugin has a pack method, but it doesn't work out of the
box in GitHub actions, and there isn't really any reason that it should be
part of the plugin, so we just have a simple subprocess here.
"""
cmd = ['charmcraft', 'pack', '--verbose']
# We need to use `sudo` in the GitHub actions environment, just as in
# the pack test. `sg lxd -c` should work, but does not - perhaps because of
# the way we are installing LXD?
if 'lxd' not in {grp.getgrgid(g).gr_name for g in os.getgroups()}:
cmd.insert(0, 'sudo')

logger.info('Building charm with %r', cmd)
subprocess.run(cmd, cwd=charm_dir, check=True)
logger.info('Built charm')

# Move the packed charm to the charm directory.
dest_name = None
for charm in charm_dir.glob('*.charm'):
dest_name = charm_dir / charm.name
charm.rename(dest_name)
# With the way we use charmcraft, we know that there will only be one.
return dest_name.absolute()


@pytest.mark.parametrize(
'base,charmcraft_version,name',
(
Expand All @@ -55,13 +86,23 @@
)
async def test_smoke(ops_test: OpsTest, base: str, charmcraft_version: int, name: str):
"""Verify that we can build and deploy charms from supported bases."""
available_charmcraft_version = (
subprocess.run(['charmcraft', 'version'], check=True, capture_output=True) # noqa: S607
.stdout.decode()
.strip()
.rsplit()[-1]
.split('.')
)
if int(available_charmcraft_version[0]) < charmcraft_version:
pytest.skip(f'charmcraft version {available_charmcraft_version} is too old for this test')
return
charmcraft_yaml = {
2: CHARMCRAFT2_YAML,
3: CHARMCRAFT3_YAML,
}[charmcraft_version].format(base=base)
with open('./test/charms/test_smoke/charmcraft.yaml', 'w') as outf:
outf.write(charmcraft_yaml)
charm = await ops_test.build_charm('./test/charms/test_smoke/')
charm = pack(pathlib.Path('./test/charms/test_smoke/'))

app = await ops_test.model.deploy(
charm, base=f'ubuntu@{base}', application_name=f'{name}-smoke'
Expand Down
3 changes: 3 additions & 0 deletions tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ description = Run a smoke test against a Juju controller.
allowlist_externals = juju
charmcraft
bash
passenv = JUJU_VERSION
deps =
build
coverage[toml]~=7.0
Expand All @@ -147,6 +148,8 @@ commands =
python -m build --sdist --outdir={toxinidir}/test/charms/test_smoke/
# Inject the tarball into the smoke test charm's requirements.
bash -c 'echo "./$(ls -1 ./test/charms/test_smoke/ | grep tar.gz)" > ./test/charms/test_smoke/requirements.txt'
# If a specific Juju version is set, then make sure we are using that version of pylibjuju.
bash -c 'if [ -n "$JUJU_VERSION" ]; then pip install "juju ~= $JUJU_VERSION"; fi'
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clever!


# Run our smoke tests (this will build the charm, then run the tests).
pytest -v --tb native --log-cli-level=INFO -s {posargs} {toxinidir}/test/smoke/
Loading