From 33a2c1d67b038ad6e5842133c34567ab2cd4ebb5 Mon Sep 17 00:00:00 2001 From: Tony Meyer Date: Sat, 21 Mar 2026 13:37:35 +1300 Subject: [PATCH 01/11] ci: imprvoe security via zizmor findings --- .github/workflows/build-and-test.yaml | 23 +++++++++++++----- .github/workflows/pull-request.yaml | 3 +++ .github/workflows/release-libs.yaml | 8 +++++-- .github/workflows/release.yaml | 10 +++++--- .github/workflows/zizmor.yaml | 34 +++++++++++++++++++++++++++ .github/zizmor.yml | 7 ++++++ 6 files changed, 74 insertions(+), 11 deletions(-) create mode 100644 .github/workflows/zizmor.yaml create mode 100644 .github/zizmor.yml diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml index ebdf9dc2..31da6127 100644 --- a/.github/workflows/build-and-test.yaml +++ b/.github/workflows/build-and-test.yaml @@ -3,13 +3,18 @@ name: Build/Test on: workflow_call: +permissions: + contents: read + jobs: lint: name: Lint runs-on: ubuntu-22.04 steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + with: + persist-credentials: false - name: Install dependencies run: python3 -m pip install tox - name: Run linters @@ -22,9 +27,11 @@ jobs: python-version: ["3.8", "3.10"] steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + with: + persist-credentials: false - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@7f4fc3e22c37d6ff65e88745f38bd3157c663f7c # v4 with: python-version: ${{ matrix.python-version }} - name: Install dependencies @@ -36,7 +43,9 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + with: + persist-credentials: false - name: Install dependencies run: sudo python -m pip install tox - name: Run integration tests for Ubuntu @@ -47,9 +56,11 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + with: + persist-credentials: false - name: Setup operator environment - uses: charmed-kubernetes/actions-operator@main + uses: charmed-kubernetes/actions-operator@3d3eb35d73c0f326d07880d83a99876d321f823c # 1.1.0 with: provider: lxd juju-channel: 3.1/stable diff --git a/.github/workflows/pull-request.yaml b/.github/workflows/pull-request.yaml index 08658380..9f89cd3a 100644 --- a/.github/workflows/pull-request.yaml +++ b/.github/workflows/pull-request.yaml @@ -6,6 +6,9 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true +permissions: + contents: read + jobs: test: uses: ./.github/workflows/build-and-test.yaml diff --git a/.github/workflows/release-libs.yaml b/.github/workflows/release-libs.yaml index 91941258..c47d8a82 100644 --- a/.github/workflows/release-libs.yaml +++ b/.github/workflows/release-libs.yaml @@ -5,17 +5,21 @@ on: branches: - main +permissions: + contents: write + jobs: release-libs: name: Release any bumped library runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: fetch-depth: 0 + persist-credentials: false - name: Release any bumped charm library - uses: canonical/charming-actions/release-libraries@2.2.3 + uses: canonical/charming-actions/release-libraries@f87f8885aeb69e668b50c6c6095af5eadac457d2 # 2.2.3 with: credentials: "${{ secrets.CHARMHUB_TOKEN }}" github-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 999dc92f..c2756321 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -13,6 +13,9 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true +permissions: + contents: read + jobs: test: uses: ./.github/workflows/build-and-test.yaml @@ -26,14 +29,15 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: fetch-depth: 0 + persist-credentials: false - name: Select charmhub channel - uses: canonical/charming-actions/channel@2.2.3 + uses: canonical/charming-actions/channel@f87f8885aeb69e668b50c6c6095af5eadac457d2 # 2.2.3 id: channel - name: Upload charm to charmhub - uses: canonical/charming-actions/upload-charm@2.2.3 + uses: canonical/charming-actions/upload-charm@f87f8885aeb69e668b50c6c6095af5eadac457d2 # 2.2.3 with: credentials: "${{ secrets.CHARMHUB_TOKEN }}" github-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/zizmor.yaml b/.github/workflows/zizmor.yaml new file mode 100644 index 00000000..aeac1c8f --- /dev/null +++ b/.github/workflows/zizmor.yaml @@ -0,0 +1,34 @@ +name: Workflow static checks + +on: + push: + branches: ["main"] + pull_request: + branches: ["**"] + +permissions: {} + +jobs: + zizmor: + runs-on: ubuntu-latest + permissions: + security-events: write + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + persist-credentials: false + + - name: Install uv + uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 + + - name: Run zizmor + run: uvx zizmor@v1.23.1 --format=sarif . > results.sarif + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload SARIF file + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: results.sarif + category: zizmor diff --git a/.github/zizmor.yml b/.github/zizmor.yml new file mode 100644 index 00000000..5b5b5e74 --- /dev/null +++ b/.github/zizmor.yml @@ -0,0 +1,7 @@ +rules: + unpinned-uses: + config: + policies: + "actions/*": ref-pin + "github/*": ref-pin + "pypa/*": ref-pin From 06eb88301af5579491af6b015b8cba69539825f5 Mon Sep 17 00:00:00 2001 From: Tony Meyer Date: Sat, 21 Mar 2026 15:01:38 +1300 Subject: [PATCH 02/11] Work around failing tests. --- .github/workflows/build-and-test.yaml | 2 ++ tests/integration/test_apt.py | 3 +++ 2 files changed, 5 insertions(+) diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml index 0123165c..8f2412c0 100644 --- a/.github/workflows/build-and-test.yaml +++ b/.github/workflows/build-and-test.yaml @@ -80,6 +80,8 @@ jobs: integration-test-juju-systemd-notices: name: Juju systemd notices integration tests runs-on: ubuntu-latest + env: + PIP_BREAK_SYSTEM_PACKAGES: "1" steps: - name: Checkout uses: actions/checkout@v4 diff --git a/tests/integration/test_apt.py b/tests/integration/test_apt.py index 64fd1eda..eb17db96 100644 --- a/tests/integration/test_apt.py +++ b/tests/integration/test_apt.py @@ -10,6 +10,8 @@ from typing import List from urllib.request import urlopen +import pytest + from charms.operator_libs_linux.v0 import apt from helpers import get_command_path @@ -137,6 +139,7 @@ def test_install_higher_version_package_from_external_repository(): assert not get_command_path("fish") +@pytest.mark.skip(reason="HPE GPG signing key has expired, causing apt-get update to fail") def test_install_hardware_observer_ssacli(): """Test the ability to install a package used by the hardware-observer charm. From f4250ad1c0e64ecab48709ec9bf72ec51765ce73 Mon Sep 17 00:00:00 2001 From: Tony Meyer Date: Sat, 21 Mar 2026 15:10:20 +1300 Subject: [PATCH 03/11] More test fixing. --- .github/workflows/build-and-test.yaml | 4 ++-- tests/integration/test_apt.py | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml index 8f2412c0..d9973823 100644 --- a/.github/workflows/build-and-test.yaml +++ b/.github/workflows/build-and-test.yaml @@ -80,13 +80,13 @@ jobs: integration-test-juju-systemd-notices: name: Juju systemd notices integration tests runs-on: ubuntu-latest - env: - PIP_BREAK_SYSTEM_PACKAGES: "1" steps: - name: Checkout uses: actions/checkout@v4 with: persist-credentials: false + - name: Pre-install tox + run: sudo pip3 install --break-system-packages tox - name: Setup operator environment uses: charmed-kubernetes/actions-operator@3d3eb35d73c0f326d07880d83a99876d321f823c # 1.1.0 with: diff --git a/tests/integration/test_apt.py b/tests/integration/test_apt.py index eb17db96..c552689d 100644 --- a/tests/integration/test_apt.py +++ b/tests/integration/test_apt.py @@ -11,7 +11,6 @@ from urllib.request import urlopen import pytest - from charms.operator_libs_linux.v0 import apt from helpers import get_command_path From 2017a3247f4f2110571303775656dc181262220c Mon Sep 17 00:00:00 2001 From: Tony Meyer Date: Sat, 21 Mar 2026 15:23:26 +1300 Subject: [PATCH 04/11] More trying to fix a test. --- .github/workflows/build-and-test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml index d9973823..966cee15 100644 --- a/.github/workflows/build-and-test.yaml +++ b/.github/workflows/build-and-test.yaml @@ -86,7 +86,7 @@ jobs: with: persist-credentials: false - name: Pre-install tox - run: sudo pip3 install --break-system-packages tox + run: sudo pip3 install --break-system-packages --ignore-installed packaging && sudo pip3 install --break-system-packages tox - name: Setup operator environment uses: charmed-kubernetes/actions-operator@3d3eb35d73c0f326d07880d83a99876d321f823c # 1.1.0 with: From f1d0cd348d14ac92bbe544553936492b0742b155 Mon Sep 17 00:00:00 2001 From: Tony Meyer Date: Sat, 21 Mar 2026 15:44:05 +1300 Subject: [PATCH 05/11] Use v4 for sarif upload. --- .github/workflows/zizmor.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/zizmor.yaml b/.github/workflows/zizmor.yaml index aeac1c8f..6e143adf 100644 --- a/.github/workflows/zizmor.yaml +++ b/.github/workflows/zizmor.yaml @@ -28,7 +28,7 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Upload SARIF file - uses: github/codeql-action/upload-sarif@v3 + uses: github/codeql-action/upload-sarif@v4 with: sarif_file: results.sarif category: zizmor From f5af21fdd5ffdc858eaf23447d7aa41600ef7fdb Mon Sep 17 00:00:00 2001 From: Tony Meyer Date: Sat, 21 Mar 2026 16:55:02 +1300 Subject: [PATCH 06/11] Work around the actions-operator issues by just using concierge. --- .github/workflows/build-and-test.yaml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml index 966cee15..99099fa6 100644 --- a/.github/workflows/build-and-test.yaml +++ b/.github/workflows/build-and-test.yaml @@ -85,12 +85,15 @@ jobs: uses: actions/checkout@v4 with: persist-credentials: false - - name: Pre-install tox - run: sudo pip3 install --break-system-packages --ignore-installed packaging && sudo pip3 install --break-system-packages tox - - name: Setup operator environment - uses: charmed-kubernetes/actions-operator@3d3eb35d73c0f326d07880d83a99876d321f823c # 1.1.0 + - name: Set up Python 3 + uses: actions/setup-python@v5 with: - provider: lxd - juju-channel: 3.6/stable + python-version: '3.12' + - name: Install tox + run: pip install tox~=4.2 + - name: Install Concierge + run: sudo snap install --classic concierge + - name: Prepare for deploying machine charms + run: sudo concierge prepare -p machine - name: Run integration tests (juju-systemd-notices) run: tox run -e integration-juju-systemd-notices From c5f8b5231c81ecc799a524285cadd7d0296df156 Mon Sep 17 00:00:00 2001 From: Tony Meyer Date: Sat, 21 Mar 2026 17:15:53 +1300 Subject: [PATCH 07/11] Work around the flaky tests by modernising them. Claude did the initial Jubilant migration pass and I took over from there. --- .github/workflows/build-and-test.yaml | 8 +++ .../juju_systemd_notices/conftest.py | 59 ++++++++++++++----- .../test_juju_systemd_notices.py | 35 ++++------- tox.ini | 7 ++- 4 files changed, 69 insertions(+), 40 deletions(-) diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml index 99099fa6..0e96a16c 100644 --- a/.github/workflows/build-and-test.yaml +++ b/.github/workflows/build-and-test.yaml @@ -95,5 +95,13 @@ jobs: run: sudo snap install --classic concierge - name: Prepare for deploying machine charms run: sudo concierge prepare -p machine + - name: Pack test charm + run: | + sudo snap install --classic charmcraft + charm_dir=tests/integration/juju_systemd_notices/notices-charm + cp lib/charms/operator_libs_linux/v1/systemd.py "$charm_dir/lib/charms/operator_libs_linux/v1/" + cp lib/charms/operator_libs_linux/v0/juju_systemd_notices.py "$charm_dir/lib/charms/operator_libs_linux/v0/" + charmcraft pack -p "$charm_dir" --verbose + echo "CHARM_PATH=$(ls $charm_dir/*.charm)" >> "$GITHUB_ENV" - name: Run integration tests (juju-systemd-notices) run: tox run -e integration-juju-systemd-notices diff --git a/tests/integration/juju_systemd_notices/conftest.py b/tests/integration/juju_systemd_notices/conftest.py index 10206073..ea10da30 100644 --- a/tests/integration/juju_systemd_notices/conftest.py +++ b/tests/integration/juju_systemd_notices/conftest.py @@ -4,31 +4,62 @@ """Configure integration tests for the juju_systemd_notices library.""" +import logging +import os +import pathlib import shutil -from pathlib import Path +import sys +import time +import jubilant import pytest -from pytest_operator.plugin import OpsTest -test_charm_root = Path("tests/integration/juju_systemd_notices/notices-charm") -lib_root = Path("lib/charms/operator_libs_linux") +logger = logging.getLogger(__name__) + +test_charm_root = pathlib.Path("tests/integration/juju_systemd_notices/notices-charm") +lib_root = pathlib.Path("lib/charms/operator_libs_linux") systemd_path = lib_root / "v1/systemd.py" notices_path = lib_root / "v0/juju_systemd_notices.py" +@pytest.fixture(scope="module") +def juju(request: pytest.FixtureRequest): + """Create a temporary Juju model for running tests.""" + with jubilant.temp_model() as juju: + yield juju + + if request.session.testsfailed: + logger.info("Collecting Juju logs...") + time.sleep(0.5) + log = juju.debug_log(limit=1000) + print(log, end="", file=sys.stderr) + + @pytest.fixture(scope="module", autouse=True) -def copy_machine_libs_into_test_charm(ops_test: OpsTest): +def copy_machine_libs_into_test_charm(): """Copy the systemd and juju_systemd_notices to the test charm.""" shutil.copy(systemd_path, test_charm_root / systemd_path) shutil.copy(notices_path, test_charm_root / notices_path) - - -@pytest.fixture(scope="module") -async def test_charm(ops_test: OpsTest): - return await ops_test.build_charm("tests/integration/juju_systemd_notices/notices-charm") - - -def pytest_sessionfinish(session, exitstatus): - """Clean up integration test after it has completed.""" + yield (test_charm_root / systemd_path).unlink(missing_ok=True) (test_charm_root / notices_path).unlink(missing_ok=True) + + +@pytest.fixture(scope="session") +def test_charm(): + """Return the path of the charm under test.""" + if "CHARM_PATH" in os.environ: + charm_path = pathlib.Path(os.environ["CHARM_PATH"]) + if not charm_path.exists(): + raise FileNotFoundError(f"Charm does not exist: {charm_path}") + return charm_path + charm_paths = list(test_charm_root.glob("*.charm")) + if not charm_paths: + raise FileNotFoundError( + f"No .charm file in {test_charm_root}. " + "Run 'charmcraft pack' first or set CHARM_PATH." + ) + if len(charm_paths) > 1: + path_list = ", ".join(str(p) for p in charm_paths) + raise ValueError(f"More than one .charm file in {test_charm_root}: {path_list}") + return charm_paths[0] diff --git a/tests/integration/juju_systemd_notices/test_juju_systemd_notices.py b/tests/integration/juju_systemd_notices/test_juju_systemd_notices.py index 33e0e33d..88fb2755 100644 --- a/tests/integration/juju_systemd_notices/test_juju_systemd_notices.py +++ b/tests/integration/juju_systemd_notices/test_juju_systemd_notices.py @@ -4,11 +4,10 @@ """Integration tests for juju_systemd_notices charm library.""" -import asyncio import logging +import jubilant import pytest -from pytest_operator.plugin import OpsTest logger = logging.getLogger(__name__) APP_NAME = "test" @@ -17,34 +16,24 @@ @pytest.mark.abort_on_fail @pytest.mark.order(1) -async def test_service_start(ops_test: OpsTest, test_charm) -> None: +def test_service_start(juju: jubilant.Juju, test_charm) -> None: """Test that service_test_started event is properly handled by test charm.""" logger.info("Deploying test charm with internal test daemon") - await asyncio.gather( - ops_test.model.deploy( - str(await test_charm), application_name=APP_NAME, num_units=1, base="ubuntu@22.04" - ) - ) + juju.deploy(test_charm, app=APP_NAME, num_units=1, base="ubuntu@22.04") logger.info("Waiting for test daemon to start...") - async with ops_test.fast_forward(): - await ops_test.model.wait_for_idle(apps=[APP_NAME], status="active", timeout=1000) - assert ( - ops_test.model.units.get(UNIT_NAME).workload_status_message - == "test service running :)" - ) + status = juju.wait(lambda status: jubilant.all_active(status, APP_NAME), timeout=1000) + unit_status = status.apps[APP_NAME].units[UNIT_NAME] + assert unit_status.workload_status.message == "test service running :)" @pytest.mark.abort_on_fail @pytest.mark.order(2) -async def test_service_stop(ops_test: OpsTest) -> None: +def test_service_stop(juju: jubilant.Juju) -> None: """Test that service_test_stopped event is properly handled by test charm.""" logger.info("Stopping internal test daemon") - action = await ops_test.model.units.get(UNIT_NAME).run_action("stop-service") - await action.wait() + task = juju.run(UNIT_NAME, "stop-service") + task.raise_on_failure() logger.info("Waiting for test daemon to stop...") - async with ops_test.fast_forward(): - await ops_test.model.wait_for_idle(apps=[APP_NAME], status="blocked", timeout=1000) - assert ( - ops_test.model.units.get(UNIT_NAME).workload_status_message - == "test service not running :(" - ) + status = juju.wait(lambda status: jubilant.all_blocked(status, APP_NAME), timeout=1000) + unit_status = status.apps[APP_NAME].units[UNIT_NAME] + assert unit_status.workload_status.message == "test service not running :(" diff --git a/tox.ini b/tox.ini index a4c516cd..6f0009fd 100644 --- a/tox.ini +++ b/tox.ini @@ -149,14 +149,15 @@ commands = description = Run juju systemd notices integration tests. deps = pytest - pytest-operator pytest-order - juju + jubilant -r {toxinidir}/requirements.txt +passenv = + CHARM_PATH commands = pytest -v \ -s \ --tb native \ --log-cli-level=INFO \ - {[vars]tst_dir}integration/juju_systemd_notices + {[vars]tst_dir}integration/juju_systemd_notices \ {posargs} From ea8605e709a8b1d5565bf3f4884b7663d37da03f Mon Sep 17 00:00:00 2001 From: Tony Meyer Date: Sat, 21 Mar 2026 17:32:39 +1300 Subject: [PATCH 08/11] More modern charmcraft.yaml --- .../notices-charm/charmcraft.yaml | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/tests/integration/juju_systemd_notices/notices-charm/charmcraft.yaml b/tests/integration/juju_systemd_notices/notices-charm/charmcraft.yaml index 4fc0954c..1d8025ba 100644 --- a/tests/integration/juju_systemd_notices/notices-charm/charmcraft.yaml +++ b/tests/integration/juju_systemd_notices/notices-charm/charmcraft.yaml @@ -8,15 +8,10 @@ summary: | A charm with a minimal daemon for testing the juju-systemd-notices charm library. type: charm -bases: - - build-on: - - name: ubuntu - channel: "22.04" - run-on: - - name: ubuntu - channel: "22.04" +base: ubuntu@22.04 +platforms: + amd64: actions: stop-service: description: Stop internal test service inside charm - From ed5db1265546d88ea52df35c87b69441a0a0387d Mon Sep 17 00:00:00 2001 From: Tony Meyer Date: Sat, 21 Mar 2026 17:43:24 +1300 Subject: [PATCH 09/11] Avoid -p with charmcraft --- .github/workflows/build-and-test.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml index 0e96a16c..41fba207 100644 --- a/.github/workflows/build-and-test.yaml +++ b/.github/workflows/build-and-test.yaml @@ -101,7 +101,8 @@ jobs: charm_dir=tests/integration/juju_systemd_notices/notices-charm cp lib/charms/operator_libs_linux/v1/systemd.py "$charm_dir/lib/charms/operator_libs_linux/v1/" cp lib/charms/operator_libs_linux/v0/juju_systemd_notices.py "$charm_dir/lib/charms/operator_libs_linux/v0/" - charmcraft pack -p "$charm_dir" --verbose - echo "CHARM_PATH=$(ls $charm_dir/*.charm)" >> "$GITHUB_ENV" + cd "$charm_dir" + charmcraft pack --verbose + echo "CHARM_PATH=$(pwd)/$(ls *.charm)" >> "$GITHUB_ENV" - name: Run integration tests (juju-systemd-notices) run: tox run -e integration-juju-systemd-notices From d21af339a2982cbbef1db0da34be4b7623c22a9d Mon Sep 17 00:00:00 2001 From: Tony Meyer Date: Sat, 21 Mar 2026 17:53:03 +1300 Subject: [PATCH 10/11] Add parts section. Continue with the charm plugin for now. Switching to uv would be nice, but involves adding a pyproject.toml and so on, and this is already large for a drive-by for a library that has an uncertain future. --- .../juju_systemd_notices/notices-charm/charmcraft.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/integration/juju_systemd_notices/notices-charm/charmcraft.yaml b/tests/integration/juju_systemd_notices/notices-charm/charmcraft.yaml index 1d8025ba..1a8f8a84 100644 --- a/tests/integration/juju_systemd_notices/notices-charm/charmcraft.yaml +++ b/tests/integration/juju_systemd_notices/notices-charm/charmcraft.yaml @@ -12,6 +12,10 @@ base: ubuntu@22.04 platforms: amd64: +parts: + charm: + plugin: charm + actions: stop-service: description: Stop internal test service inside charm From 40f80a4f21c44e8c15abe1782e4902aad1c34997 Mon Sep 17 00:00:00 2001 From: Tony Meyer Date: Mon, 23 Mar 2026 12:17:39 +1300 Subject: [PATCH 11/11] Apply suggestion from @james-garner-canonical Co-authored-by: James Garner --- .github/workflows/build-and-test.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml index 41fba207..6cb0adfc 100644 --- a/.github/workflows/build-and-test.yaml +++ b/.github/workflows/build-and-test.yaml @@ -97,7 +97,6 @@ jobs: run: sudo concierge prepare -p machine - name: Pack test charm run: | - sudo snap install --classic charmcraft charm_dir=tests/integration/juju_systemd_notices/notices-charm cp lib/charms/operator_libs_linux/v1/systemd.py "$charm_dir/lib/charms/operator_libs_linux/v1/" cp lib/charms/operator_libs_linux/v0/juju_systemd_notices.py "$charm_dir/lib/charms/operator_libs_linux/v0/"