From 38720265349ea9f73f1736c8b9c948164558db56 Mon Sep 17 00:00:00 2001 From: Imani Pelton Date: Fri, 24 Jan 2025 15:09:46 -0500 Subject: [PATCH 1/3] feat: add improved bash completion script (#5218) --- requirements-devel.txt | 2 +- requirements-docs.txt | 2 +- requirements.txt | 2 +- setup.py | 2 +- snap/local/snapcraft-completion | 36 --------------------------------- snap/snapcraft.yaml | 16 ++++++++------- snapcraft/application.py | 8 ++++++++ 7 files changed, 21 insertions(+), 47 deletions(-) delete mode 100644 snap/local/snapcraft-completion diff --git a/requirements-devel.txt b/requirements-devel.txt index 1336aa53c9..fef6e3a9a8 100644 --- a/requirements-devel.txt +++ b/requirements-devel.txt @@ -51,7 +51,7 @@ craft-archives==2.0.1 # via # craft-application # snapcraft (setup.py) -craft-cli==2.13.0 +craft-cli==2.15.0 # via # craft-application # snapcraft (setup.py) diff --git a/requirements-docs.txt b/requirements-docs.txt index 755d6c0d3e..24faa7c7f8 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -65,7 +65,7 @@ craft-archives==2.0.1 # via # craft-application # snapcraft (setup.py) -craft-cli==2.13.0 +craft-cli==2.15.0 # via # craft-application # snapcraft (setup.py) diff --git a/requirements.txt b/requirements.txt index 8e0d39d95c..a586bcdd41 100644 --- a/requirements.txt +++ b/requirements.txt @@ -33,7 +33,7 @@ craft-archives==2.0.1 # via # craft-application # snapcraft (setup.py) -craft-cli==2.13.0 +craft-cli==2.15.0 # via # craft-application # snapcraft (setup.py) diff --git a/setup.py b/setup.py index f0817151ac..13eb7ca3f4 100755 --- a/setup.py +++ b/setup.py @@ -100,7 +100,7 @@ def recursive_data_files(directory, install_directory): "click", "craft-application~=4.4", "craft-archives~=2.0", - "craft-cli~=2.9", + "craft-cli>=2.15.0", "craft-grammar>=2.0.1,<3.0.0", "craft-parts==2.3.0", "craft-platforms~=0.4", diff --git a/snap/local/snapcraft-completion b/snap/local/snapcraft-completion deleted file mode 100644 index 5a5657875a..0000000000 --- a/snap/local/snapcraft-completion +++ /dev/null @@ -1,36 +0,0 @@ -_snapcraft() -{ - local cur prev opts - _init_completion -s || return - - COMPREPLY=() - cur="${COMP_WORDS[COMP_CWORD]}" - prev="${COMP_WORDS[COMP_CWORD-1]}" - opts="help init list-plugins plugins login logout export-login list-keys keys create-key register-key register registered list-registered push release clean cleanbuild pull build sign-build stage prime snap update define search gated validate history status close enable-ci expand-extensions extension extensions list-extensions" - - case "$prev" in - help) - plugins=$(snapcraft list-plugins) - COMPREPLY=( $(compgen -W "$plugins" -- $cur)) - return 0 - ;; - snap) - _filedir -d - return 0 - ;; - upload | push | sign-build) - _filedir 'snap' - return 0 - ;; - enable-ci) - COMREPLY=( travis ) - return 0 - ;; - *) - ;; - esac - - COMPREPLY=( $(compgen -W "$opts" -- $cur) ) - return 0 -} -complete -F _snapcraft snapcraft diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 5d215cea8a..347655002a 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -26,7 +26,7 @@ apps: # https://github.com/lxc/pylxd/pull/361 PYLXD_WARNINGS: "none" command: bin/python $SNAP/bin/snapcraft - completer: snapcraft-completion + completer: completion.sh build-packages: - cargo @@ -47,12 +47,6 @@ build-packages: - sed parts: - bash-completion: - source: snap/local - plugin: dump - stage: - - snapcraft-completion - snapcraft-scripts: source: snap/local plugin: dump @@ -220,3 +214,11 @@ parts: stage: - libexec/snapcraft/chisel + completion-script: + after: [snapcraft] + plugin: nil + build-environment: + - PYTHONPATH: $CRAFT_STAGE/lib/python3.12/site-packages + override-build: | + python3 -m craft_cli.completion $CRAFT_PROJECT_NAME snapcraft.application:get_app_info \ + > $CRAFT_PART_INSTALL/completion.sh diff --git a/snapcraft/application.py b/snapcraft/application.py index 836e2e4801..f2fc50c6dd 100644 --- a/snapcraft/application.py +++ b/snapcraft/application.py @@ -464,6 +464,14 @@ def create_app() -> Snapcraft: return app +def get_app_info() -> tuple[craft_cli.Dispatcher, dict[str, Any]]: + """Retrieve application info. Used by craft-cli's completion module.""" + app = create_app() + dispatcher = app._create_dispatcher() + + return dispatcher, app.app_config + + def main() -> int: """Run craft-application based snapcraft with classic fallback.""" if os.getenv("SNAPCRAFT_BUILD_ENVIRONMENT") == "managed-host": From 359a364cb03805bd4b240e22c6fecc5e88ce2664 Mon Sep 17 00:00:00 2001 From: Callahan Date: Mon, 27 Jan 2025 09:54:25 -0600 Subject: [PATCH 2/3] feat(remotebuild)!: filter build-plan with --build-for, drop --platform (#5216) * Allows using `--build-for` to filter entries in the `architectures` or `platforms` keys in a project file. * Drops the `--platform` argument. * Catches Launchpad errors, which were percolating up as internal errors. Signed-off-by: Callahan Kovacs --- docs/explanation/remote-build.rst | 33 ++-- snapcraft/application.py | 10 +- snapcraft/commands/remote.py | 153 ++++++++-------- .../snaps/all/expected-snaps.txt | 2 +- .../snaps/all/snapcraft.yaml | 2 +- .../snaps/architectures/expected-snaps.txt | 2 - .../snaps/archs/expected-snaps.txt | 2 + .../{architectures => archs}/snapcraft.yaml | 2 +- .../snaps/no-architectures/expected-snaps.txt | 1 - .../snaps/no-archs/expected-snaps.txt | 1 + .../snapcraft.yaml | 2 +- .../core20/remote-build-legacy/task.yaml | 15 +- .../snaps/no-architectures/expected-snaps.txt | 1 - .../snaps/no-archs/expected-snaps.txt | 1 + .../snaps/no-archs}/snapcraft.yaml | 2 +- .../core22/remote-build-legacy/task.yaml | 11 +- .../remote-build/snaps/all/expected-snaps.txt | 2 +- .../remote-build/snaps/all/snapcraft.yaml | 2 +- .../snaps/architectures/expected-snaps.txt | 2 - .../snaps/archs/expected-snaps.txt | 2 + .../{architectures => archs}/snapcraft.yaml | 2 +- .../snaps/build-for-arg/expected-snaps.txt | 2 - .../arguments.txt | 0 .../build-for-with-archs/expected-snaps.txt | 2 + .../snaps/build-for-with-archs/snapcraft.yaml | 20 ++ .../snaps/build-for}/arguments.txt | 0 .../snaps/build-for/expected-snaps.txt | 2 + .../snaps/build-for}/snapcraft.yaml | 2 +- .../snaps/no-architectures/expected-snaps.txt | 1 - .../snaps/no-archs/expected-snaps.txt | 1 + .../snapcraft.yaml | 2 +- tests/spread/core22/remote-build/task.yaml | 21 ++- .../remote-build/snaps/all/expected-snaps.txt | 2 +- .../remote-build/snaps/all/snapcraft.yaml | 2 +- .../snaps/build-for-arg/expected-snaps.txt | 2 - .../snaps/build-for-arg/snapcraft.yaml | 12 -- .../build-for-with-platforms/arguments.txt | 1 + .../expected-snaps.txt | 2 + .../build-for-with-platforms/snapcraft.yaml | 23 +++ .../snaps/build-for/arguments.txt | 1 + .../snaps/build-for/expected-snaps.txt | 2 + .../snapcraft.yaml | 2 +- .../snaps/no-platforms/expected-snaps.txt | 2 +- .../snaps/no-platforms/snapcraft.yaml | 2 +- .../snaps/platform-arg/arguments.txt | 1 - .../snaps/platform-arg/expected-snaps.txt | 2 - .../snaps/platforms/expected-snaps.txt | 6 +- .../snaps/platforms/snapcraft.yaml | 2 +- tests/spread/core24/remote-build/task.yaml | 17 +- tests/unit/commands/test_remote.py | 173 +++++++----------- tests/unit/test_application.py | 12 +- 51 files changed, 308 insertions(+), 261 deletions(-) delete mode 100644 tests/spread/core20/remote-build-legacy/snaps/architectures/expected-snaps.txt create mode 100644 tests/spread/core20/remote-build-legacy/snaps/archs/expected-snaps.txt rename tests/spread/core20/remote-build-legacy/snaps/{architectures => archs}/snapcraft.yaml (88%) delete mode 100644 tests/spread/core20/remote-build-legacy/snaps/no-architectures/expected-snaps.txt create mode 100644 tests/spread/core20/remote-build-legacy/snaps/no-archs/expected-snaps.txt rename tests/spread/core20/remote-build-legacy/snaps/{no-architectures => no-archs}/snapcraft.yaml (81%) delete mode 100644 tests/spread/core22/remote-build-legacy/snaps/no-architectures/expected-snaps.txt create mode 100644 tests/spread/core22/remote-build-legacy/snaps/no-archs/expected-snaps.txt rename tests/spread/core22/{remote-build/snaps/build-for-arg => remote-build-legacy/snaps/no-archs}/snapcraft.yaml (82%) delete mode 100644 tests/spread/core22/remote-build/snaps/architectures/expected-snaps.txt create mode 100644 tests/spread/core22/remote-build/snaps/archs/expected-snaps.txt rename tests/spread/core22/remote-build/snaps/{architectures => archs}/snapcraft.yaml (88%) delete mode 100644 tests/spread/core22/remote-build/snaps/build-for-arg/expected-snaps.txt rename tests/spread/core22/remote-build/snaps/{build-for-arg => build-for-with-archs}/arguments.txt (100%) create mode 100644 tests/spread/core22/remote-build/snaps/build-for-with-archs/expected-snaps.txt create mode 100644 tests/spread/core22/remote-build/snaps/build-for-with-archs/snapcraft.yaml rename tests/spread/{core24/remote-build/snaps/build-for-arg => core22/remote-build/snaps/build-for}/arguments.txt (100%) create mode 100644 tests/spread/core22/remote-build/snaps/build-for/expected-snaps.txt rename tests/spread/core22/{remote-build-legacy/snaps/no-architectures => remote-build/snaps/build-for}/snapcraft.yaml (81%) delete mode 100644 tests/spread/core22/remote-build/snaps/no-architectures/expected-snaps.txt create mode 100644 tests/spread/core22/remote-build/snaps/no-archs/expected-snaps.txt rename tests/spread/core22/remote-build/snaps/{no-architectures => no-archs}/snapcraft.yaml (81%) delete mode 100644 tests/spread/core24/remote-build/snaps/build-for-arg/expected-snaps.txt delete mode 100644 tests/spread/core24/remote-build/snaps/build-for-arg/snapcraft.yaml create mode 100644 tests/spread/core24/remote-build/snaps/build-for-with-platforms/arguments.txt create mode 100644 tests/spread/core24/remote-build/snaps/build-for-with-platforms/expected-snaps.txt create mode 100644 tests/spread/core24/remote-build/snaps/build-for-with-platforms/snapcraft.yaml create mode 100644 tests/spread/core24/remote-build/snaps/build-for/arguments.txt create mode 100644 tests/spread/core24/remote-build/snaps/build-for/expected-snaps.txt rename tests/spread/core24/remote-build/snaps/{platform-arg => build-for}/snapcraft.yaml (82%) delete mode 100644 tests/spread/core24/remote-build/snaps/platform-arg/arguments.txt delete mode 100644 tests/spread/core24/remote-build/snaps/platform-arg/expected-snaps.txt diff --git a/docs/explanation/remote-build.rst b/docs/explanation/remote-build.rst index 9e95faad52..bf636bfe89 100644 --- a/docs/explanation/remote-build.rst +++ b/docs/explanation/remote-build.rst @@ -82,22 +82,30 @@ Remote builds can be orchestrated for multiple platforms and architectures. Current ^^^^^^^ -``--platform`` and ``--build-for`` -********************************** +``--build-for`` +*************** .. note:: - ``--platform`` and ``--build-for`` behave differently than they do for + ``--build-for`` behaves differently for ``remote-build`` than it does for :ref:`lifecycle commands`. -``--platform`` or ``--build-for`` can only be provided when the ``platforms`` -or ``architectures`` keywords are not defined in the project metadata -(`[12]`_). +Remote builds are useful for building snaps on different architectures. Due +to this, the semantics for the ``--build-for`` argument is more complex than +when building a snap locally. + +The argument operates in one of two different ways depending on the presence +of a ``platforms`` or ``architectures`` key in the project file. -These keywords are mutually exclusive and must be a comma-separated list of -debian architectures. +The first mode of operation is when the ``platforms`` or ``architectures`` +key is present in the project file. In this scenario, ``--build-for`` operates +similar to how it does for lifecycle commands. The difference from its usage in +lifecycle commands is that ``--build-for`` may be a comma-separated list, which +allows multiple snaps to be built. For more information about build plans and +filtering, see :ref:`Build plans `. -``core22`` snaps can only use ``--build-for``. ``core24`` and newer snaps -can use ``--platform`` or ``--build-for``. +The second mode of operation is when there isn't a ``platforms`` or +``architectures`` key in the project file. In this scenario, ``--build-for`` +defines the architectures to build for. Project platforms and architectures *********************************** @@ -117,8 +125,8 @@ Snapcraft will request a build for each unique ``build-for`` architecture. ``build-on`` architecture (`[14]`_). If the project metadata does not contain a ``platforms`` or ``architectures`` -entry and no ``--build-for`` or ``--platform`` are passed, Snapcraft will -request a build on, and for, the host's architecture. +entry and ``--build-for`` is not provided, Snapcraft will request a build on, +and for, the host's architecture. The remote builder does not work for ``core20`` snaps because it cannot parse the ``run-on`` keyword in a ``core20`` architecture entry (`[2]`_). @@ -180,6 +188,5 @@ Launchpad is not able to parse this notation (`[9]`_). .. _`[8]`: https://bugs.launchpad.net/snapcraft/+bug/2007789 .. _`[9]`: https://bugs.launchpad.net/snapcraft/+bug/2042167 .. _`[10]`: https://github.com/canonical/snapcraft/issues/4885 -.. _`[12]`: https://github.com/canonical/snapcraft/issues/4992 .. _`[13]`: https://github.com/canonical/snapcraft/issues/4996 .. _`[14]`: https://github.com/canonical/snapcraft/issues/4995 diff --git a/snapcraft/application.py b/snapcraft/application.py index f2fc50c6dd..9bc9bb5bda 100644 --- a/snapcraft/application.py +++ b/snapcraft/application.py @@ -27,7 +27,7 @@ import craft_cli import craft_parts import craft_store -from craft_application import Application, AppMetadata, remote, util +from craft_application import Application, AppMetadata, launchpad, remote, util from craft_application.commands import get_other_command_group from craft_cli import emit from craft_parts.plugins.plugins import PluginType @@ -224,6 +224,14 @@ def _run_inner(self) -> int: err.doc_slug = "/explanation/remote-build" self._emit_error(err) return_code = err.retcode + except launchpad.LaunchpadError as err: + self._emit_error( + craft_cli.errors.CraftError( + f"{err}", doc_slug="/explanation/remote-build" + ), + cause=err, + ) + return_code = 1 return return_code diff --git a/snapcraft/commands/remote.py b/snapcraft/commands/remote.py index a38ea34a1f..cccea0634e 100644 --- a/snapcraft/commands/remote.py +++ b/snapcraft/commands/remote.py @@ -24,14 +24,17 @@ from pathlib import Path from typing import Any, cast +import craft_application.errors import lazr.restfulclient.errors -from craft_application import errors +from craft_application import errors, launchpad +from craft_application.application import filter_plan from craft_application.commands import ExtensibleCommand from craft_application.errors import RemoteBuildError from craft_application.launchpad.models import Build, BuildState from craft_application.remote.utils import get_build_id from craft_application.util import humanize_list from craft_cli import emit +from craft_platforms import DebianArchitecture from overrides import overrides from snapcraft import models @@ -57,9 +60,17 @@ class RemoteBuildCommand(ExtensibleCommand): architecture are retrieved and will be available in the local filesystem. - If not specified in the snapcraft.yaml file, the list of - architectures to build can be set using the --platforms option. - If both are specified, an error will occur. + If the project contains a ``platforms`` or ``architectures`` key, + then the project's build plan is used. The build plan can be filtered + using the ``--build-for`` argument. + + If the project doesn't contain a ``platforms`` or ``architectures`` key, + then the architectures to build for are defined by the ``--build-for`` + argument. + + If there are no architectures defined in the project file or with + ``--build-for``, then the default behavior is to build for the host + architecture of the local machine. Interrupted remote builds can be resumed using the --recover option, followed by the build number informed when the remote @@ -99,18 +110,7 @@ def _fill_parser(self, parser: argparse.ArgumentParser) -> None: "--build-id", metavar="build-id", help="Specific build ID to retrieve" ) - group = parser.add_mutually_exclusive_group() - group.add_argument( - "--platform", - type=lambda arg: [arch.strip() for arch in arg.split(",")], - metavar="name", - default=os.getenv("CRAFT_PLATFORM"), - help="Comma-separated list of platforms to build for", - # '--platform' needs to be handled differently since remote-build can - # build for an architecture that is not in the project metadata - dest="remote_build_platforms", - ) - group.add_argument( + parser.add_argument( "--build-for", type=lambda arg: [arch.strip() for arch in arg.split(",")], metavar="arch", @@ -154,55 +154,17 @@ def _validate(self, parsed_args: argparse.Namespace) -> None: retcode=os.EX_NOPERM, ) - build_fors = parsed_args.remote_build_build_fors or None - platforms = parsed_args.remote_build_platforms or None - parameter = "--build-for" if build_fors else "--platform" if platforms else None - keyword = ( - "architectures" - if self.project._architectures_in_yaml - else "platforms" if self.project.platforms else None - ) - - if keyword and parameter: - raise errors.RemoteBuildError( - f"{parameter!r} cannot be used when {keyword!r} is in the snapcraft.yaml.", - resolution=f"Remove {parameter!r} from the command line or remove {keyword!r} in the snapcraft.yaml.", - doc_slug="/explanation/remote-build.html", - retcode=os.EX_CONFIG, - ) - - if platforms: - if self.project.get_effective_base() == "core22": + for build_for in parsed_args.remote_build_build_fors or []: + if build_for not in [*SUPPORTED_ARCHS, "all"]: raise errors.RemoteBuildError( - "'--platform' cannot be used for core22 snaps.", - resolution="Use '--build-for' instead.", + f"Unsupported build-for architecture {build_for!r}.", + resolution=( + "Use a supported debian architecture. Supported " + f"architectures are: {humanize_list(SUPPORTED_ARCHS, 'and')}" + ), doc_slug="/explanation/remote-build.html", retcode=os.EX_CONFIG, ) - for platform in platforms: - if platform not in SUPPORTED_ARCHS: - raise errors.RemoteBuildError( - f"Unsupported platform {platform!r}.", - resolution=( - "Use a supported debian architecture. Supported " - f"architectures are: {humanize_list(SUPPORTED_ARCHS, 'and')}" - ), - doc_slug="/explanation/remote-build.html", - retcode=os.EX_CONFIG, - ) - - if build_fors: - for build_for in build_fors: - if build_for not in SUPPORTED_ARCHS: - raise errors.RemoteBuildError( - f"Unsupported build-for architecture {build_for!r}.", - resolution=( - "Use a supported debian architecture. Supported " - f"architectures are: {humanize_list(SUPPORTED_ARCHS, 'and')}" - ), - doc_slug="/explanation/remote-build.html", - retcode=os.EX_CONFIG, - ) self._validate_single_artifact_per_build_on() @@ -274,14 +236,7 @@ def _run( # noqa: PLR0915 [too-many-statements] emit.trace(f"Project directory: {project_dir}") self._validate(parsed_args) - if parsed_args.remote_build_build_fors: - architectures = parsed_args.remote_build_build_fors - elif parsed_args.remote_build_platforms: - architectures = parsed_args.remote_build_platforms - else: - architectures = self._get_project_build_fors() - - emit.debug(f"Architectures to build for: {architectures}") + archs = self._get_archs(parsed_args.remote_build_build_fors) if parsed_args.launchpad_timeout: emit.debug(f"Setting timeout to {parsed_args.launchpad_timeout} seconds") @@ -296,10 +251,8 @@ def _run( # noqa: PLR0915 [too-many-statements] "Starting new build. It may take a while to upload large projects." ) try: - builds = builder.start_builds( - project_dir, architectures=architectures or None - ) - except RemoteBuildError: + builds = builder.start_builds(project_dir, architectures=archs) + except (RemoteBuildError, launchpad.LaunchpadError): emit.progress("Starting build failed.", permanent=True) emit.progress("Cleaning up") builder.cleanup() @@ -407,12 +360,56 @@ def _monitor_and_complete( # noqa: PLR0912, PLR0915 ) return return_code - def _get_project_build_fors(self) -> list[str]: - """Get a unique list of build-for architectures from the project. + def _get_archs(self, build_fors: list[str]) -> list[str]: + """Get the architectures to build for. + + If the project contains a ``platforms`` or ``architectures`` key, then project's + build plan is used to determine the architectures to build for. The build plan + can be filtered using the ``--build-for`` argument. + + If the project doesn't contain a ``platforms`` or ``architectures`` key, then + the architectures to build for are defined by the ``--build-for`` argument. + + If there are no architectures defined in the project or as arguments, then the + default behavior is to build for the host architecture of the local machine. + + :param build_fors: A list of build-for entries. + + :raises EmptyBuildPlanError: If the build plan is filtered to an empty list. + :raises RemoteBuildError: If an unsupported architecture is provided. :returns: A list of architectures. """ - build_fors = set({build_info.build_for for build_info in self.build_plan}) - emit.debug(f"Parsed build-for architectures from build plan: {build_fors}") + archs: list[str] = [] + if self.project.platforms or self.project._architectures_in_yaml: + # if the project has platforms, then `--build-for` acts as a filter + if build_fors: + emit.debug("Filtering the build plan using the '--build-for' argument.") + for build_for in build_fors: + filtered_build_plan = filter_plan( + self.build_plan, + platform=None, + build_for=build_for, + host_arch=None, + ) + archs.extend([info.build_for for info in filtered_build_plan]) + if not archs: + raise craft_application.errors.EmptyBuildPlanError() + else: + emit.debug("Using the project's build plan") + archs = [build_info.build_for for build_info in self.build_plan] + # No architectures in the project means '--build-for' no longer acts as a filter. + # Instead, it defines the architectures to build for. + elif build_fors: + emit.debug("Using '--build-for' as the list of architectures to build for") + archs = build_fors + # default is to build for the host architecture + else: + archs = [str(DebianArchitecture.from_host())] + emit.debug( + f"Using host architecture {archs[0]} because no architectures were " + "defined in the project or as a command-line argument." + ) - return list(build_fors) + emit.debug(f"Architectures to build for: {humanize_list(archs, 'and')}") + return archs diff --git a/tests/spread/core20/remote-build-legacy/snaps/all/expected-snaps.txt b/tests/spread/core20/remote-build-legacy/snaps/all/expected-snaps.txt index ff22b906ff..0e0604c25e 100644 --- a/tests/spread/core20/remote-build-legacy/snaps/all/expected-snaps.txt +++ b/tests/spread/core20/remote-build-legacy/snaps/all/expected-snaps.txt @@ -1 +1 @@ -test-snap-all-core20_1.0_all.snap +all-core20_1.0_all.snap diff --git a/tests/spread/core20/remote-build-legacy/snaps/all/snapcraft.yaml b/tests/spread/core20/remote-build-legacy/snaps/all/snapcraft.yaml index f27e56855c..d64d597f06 100644 --- a/tests/spread/core20/remote-build-legacy/snaps/all/snapcraft.yaml +++ b/tests/spread/core20/remote-build-legacy/snaps/all/snapcraft.yaml @@ -1,4 +1,4 @@ -name: test-snap-all-core20 +name: all-core20 base: core20 version: "1.0" summary: Test snap for remote build diff --git a/tests/spread/core20/remote-build-legacy/snaps/architectures/expected-snaps.txt b/tests/spread/core20/remote-build-legacy/snaps/architectures/expected-snaps.txt deleted file mode 100644 index 51a82ced03..0000000000 --- a/tests/spread/core20/remote-build-legacy/snaps/architectures/expected-snaps.txt +++ /dev/null @@ -1,2 +0,0 @@ -test-snap-architectures-core20_1.0_amd64.snap -test-snap-architectures-core20_1.0_arm64.snap diff --git a/tests/spread/core20/remote-build-legacy/snaps/archs/expected-snaps.txt b/tests/spread/core20/remote-build-legacy/snaps/archs/expected-snaps.txt new file mode 100644 index 0000000000..6da419cabc --- /dev/null +++ b/tests/spread/core20/remote-build-legacy/snaps/archs/expected-snaps.txt @@ -0,0 +1,2 @@ +archs-core20_1.0_amd64.snap +archs-core20_1.0_arm64.snap diff --git a/tests/spread/core20/remote-build-legacy/snaps/architectures/snapcraft.yaml b/tests/spread/core20/remote-build-legacy/snaps/archs/snapcraft.yaml similarity index 88% rename from tests/spread/core20/remote-build-legacy/snaps/architectures/snapcraft.yaml rename to tests/spread/core20/remote-build-legacy/snaps/archs/snapcraft.yaml index 7fa5d6d774..1a3bc7903b 100644 --- a/tests/spread/core20/remote-build-legacy/snaps/architectures/snapcraft.yaml +++ b/tests/spread/core20/remote-build-legacy/snaps/archs/snapcraft.yaml @@ -1,4 +1,4 @@ -name: test-snap-architectures-core20 +name: archs-core20 base: core20 version: "1.0" summary: Test snap for remote build diff --git a/tests/spread/core20/remote-build-legacy/snaps/no-architectures/expected-snaps.txt b/tests/spread/core20/remote-build-legacy/snaps/no-architectures/expected-snaps.txt deleted file mode 100644 index 482e43987c..0000000000 --- a/tests/spread/core20/remote-build-legacy/snaps/no-architectures/expected-snaps.txt +++ /dev/null @@ -1 +0,0 @@ -test-snap-no-architectures-core20_1.0_amd64.snap diff --git a/tests/spread/core20/remote-build-legacy/snaps/no-archs/expected-snaps.txt b/tests/spread/core20/remote-build-legacy/snaps/no-archs/expected-snaps.txt new file mode 100644 index 0000000000..1af01c437f --- /dev/null +++ b/tests/spread/core20/remote-build-legacy/snaps/no-archs/expected-snaps.txt @@ -0,0 +1 @@ +no-archs-core20_1.0_amd64.snap diff --git a/tests/spread/core20/remote-build-legacy/snaps/no-architectures/snapcraft.yaml b/tests/spread/core20/remote-build-legacy/snaps/no-archs/snapcraft.yaml similarity index 81% rename from tests/spread/core20/remote-build-legacy/snaps/no-architectures/snapcraft.yaml rename to tests/spread/core20/remote-build-legacy/snaps/no-archs/snapcraft.yaml index d80b302735..a2d18d0ff3 100644 --- a/tests/spread/core20/remote-build-legacy/snaps/no-architectures/snapcraft.yaml +++ b/tests/spread/core20/remote-build-legacy/snaps/no-archs/snapcraft.yaml @@ -1,4 +1,4 @@ -name: test-snap-no-architectures-core20 +name: no-archs-core20 base: core20 version: "1.0" summary: Test snap for remote build diff --git a/tests/spread/core20/remote-build-legacy/task.yaml b/tests/spread/core20/remote-build-legacy/task.yaml index 997b28f3af..f6aabf192a 100644 --- a/tests/spread/core20/remote-build-legacy/task.yaml +++ b/tests/spread/core20/remote-build-legacy/task.yaml @@ -4,10 +4,10 @@ kill-timeout: 180m environment: LAUNCHPAD_TOKEN: "$(HOST: echo ${LAUNCHPAD_TOKEN})" - SNAP: no-architectures + SNAP: no-archs SNAP/all: all - SNAP/no_architectures: no-architectures - SNAP/architectures: architectures + SNAP/no_archs: no-archs + SNAP/archs: archs SNAPCRAFT_REMOTE_BUILD_STRATEGY: force-fallback CREDENTIALS_FILE: "$HOME/.local/share/snapcraft/launchpad-credentials" CREDENTIALS_FILE/new_credentials: "$HOME/.local/share/snapcraft/launchpad-credentials" @@ -29,12 +29,17 @@ prepare: | # set up launchpad token mkdir -p "$(dirname "$CREDENTIALS_FILE")" - echo -e "$LAUNCHPAD_TOKEN" >> "$CREDENTIALS_FILE" + echo -e "$LAUNCHPAD_TOKEN" > "$CREDENTIALS_FILE" + + # build ids are based on the project contents + # adding a date ensures each test has a unique build id + date > date.txt restore: | cd "./snaps/$SNAP" - rm -f ./*.snap ./*.txt + # remove snaps, logs, and date files + rm -f ./*.snap ./snapcraft-*.txt ./date.txt execute: | cd "./snaps/$SNAP" diff --git a/tests/spread/core22/remote-build-legacy/snaps/no-architectures/expected-snaps.txt b/tests/spread/core22/remote-build-legacy/snaps/no-architectures/expected-snaps.txt deleted file mode 100644 index 2388cf27aa..0000000000 --- a/tests/spread/core22/remote-build-legacy/snaps/no-architectures/expected-snaps.txt +++ /dev/null @@ -1 +0,0 @@ -test-snap-no-architectures-core22_1.0_amd64.snap diff --git a/tests/spread/core22/remote-build-legacy/snaps/no-archs/expected-snaps.txt b/tests/spread/core22/remote-build-legacy/snaps/no-archs/expected-snaps.txt new file mode 100644 index 0000000000..a01a99749e --- /dev/null +++ b/tests/spread/core22/remote-build-legacy/snaps/no-archs/expected-snaps.txt @@ -0,0 +1 @@ +no-archs-core22_1.0_amd64.snap diff --git a/tests/spread/core22/remote-build/snaps/build-for-arg/snapcraft.yaml b/tests/spread/core22/remote-build-legacy/snaps/no-archs/snapcraft.yaml similarity index 82% rename from tests/spread/core22/remote-build/snaps/build-for-arg/snapcraft.yaml rename to tests/spread/core22/remote-build-legacy/snaps/no-archs/snapcraft.yaml index 4dede42d0d..24c8d5c70e 100644 --- a/tests/spread/core22/remote-build/snaps/build-for-arg/snapcraft.yaml +++ b/tests/spread/core22/remote-build-legacy/snaps/no-archs/snapcraft.yaml @@ -1,4 +1,4 @@ -name: test-snap-build-for-arg-core22 +name: no-archs-core22 base: core22 version: "1.0" summary: Test snap for remote build diff --git a/tests/spread/core22/remote-build-legacy/task.yaml b/tests/spread/core22/remote-build-legacy/task.yaml index 496dfb7deb..a100d4b5cc 100644 --- a/tests/spread/core22/remote-build-legacy/task.yaml +++ b/tests/spread/core22/remote-build-legacy/task.yaml @@ -4,7 +4,7 @@ kill-timeout: 180m environment: LAUNCHPAD_TOKEN: "$(HOST: echo ${LAUNCHPAD_TOKEN})" - SNAP: no-architectures + SNAP: no-archs SNAPCRAFT_REMOTE_BUILD_STRATEGY: force-fallback CREDENTIALS_FILE: "$HOME/.local/share/snapcraft/launchpad-credentials" CREDENTIALS_FILE/new_credentials: "$HOME/.local/share/snapcraft/launchpad-credentials" @@ -20,12 +20,17 @@ prepare: | # set up launchpad token mkdir -p "$(dirname "$CREDENTIALS_FILE")" - echo -e "$LAUNCHPAD_TOKEN" >> "$CREDENTIALS_FILE" + echo -e "$LAUNCHPAD_TOKEN" > "$CREDENTIALS_FILE" + + # build ids are based on the project contents + # adding a date ensures each test has a unique build id + date > date.txt restore: | cd "./snaps/$SNAP" - rm -f ./*.snap ./*.txt + # remove snaps, logs, and date files + rm -f ./*.snap ./snapcraft-*.txt ./date.txt execute: | cd "./snaps/$SNAP" diff --git a/tests/spread/core22/remote-build/snaps/all/expected-snaps.txt b/tests/spread/core22/remote-build/snaps/all/expected-snaps.txt index c744da54f0..2e731f477f 100644 --- a/tests/spread/core22/remote-build/snaps/all/expected-snaps.txt +++ b/tests/spread/core22/remote-build/snaps/all/expected-snaps.txt @@ -1 +1 @@ -test-snap-all-core22_1.0_all.snap +all-core22_1.0_all.snap diff --git a/tests/spread/core22/remote-build/snaps/all/snapcraft.yaml b/tests/spread/core22/remote-build/snaps/all/snapcraft.yaml index 8d6d872be8..31c62ab6f9 100644 --- a/tests/spread/core22/remote-build/snaps/all/snapcraft.yaml +++ b/tests/spread/core22/remote-build/snaps/all/snapcraft.yaml @@ -1,4 +1,4 @@ -name: test-snap-all-core22 +name: all-core22 base: core22 version: "1.0" summary: Test snap for remote build diff --git a/tests/spread/core22/remote-build/snaps/architectures/expected-snaps.txt b/tests/spread/core22/remote-build/snaps/architectures/expected-snaps.txt deleted file mode 100644 index fe99de9213..0000000000 --- a/tests/spread/core22/remote-build/snaps/architectures/expected-snaps.txt +++ /dev/null @@ -1,2 +0,0 @@ -test-snap-architectures-core22_1.0_amd64.snap -test-snap-architectures-core22_1.0_arm64.snap diff --git a/tests/spread/core22/remote-build/snaps/archs/expected-snaps.txt b/tests/spread/core22/remote-build/snaps/archs/expected-snaps.txt new file mode 100644 index 0000000000..7a41b25956 --- /dev/null +++ b/tests/spread/core22/remote-build/snaps/archs/expected-snaps.txt @@ -0,0 +1,2 @@ +archs-core22_1.0_amd64.snap +archs-core22_1.0_arm64.snap diff --git a/tests/spread/core22/remote-build/snaps/architectures/snapcraft.yaml b/tests/spread/core22/remote-build/snaps/archs/snapcraft.yaml similarity index 88% rename from tests/spread/core22/remote-build/snaps/architectures/snapcraft.yaml rename to tests/spread/core22/remote-build/snaps/archs/snapcraft.yaml index 947152e967..0cac035bdc 100644 --- a/tests/spread/core22/remote-build/snaps/architectures/snapcraft.yaml +++ b/tests/spread/core22/remote-build/snaps/archs/snapcraft.yaml @@ -1,4 +1,4 @@ -name: test-snap-architectures-core22 +name: archs-core22 base: core22 version: "1.0" summary: Test snap for remote build diff --git a/tests/spread/core22/remote-build/snaps/build-for-arg/expected-snaps.txt b/tests/spread/core22/remote-build/snaps/build-for-arg/expected-snaps.txt deleted file mode 100644 index 5b9051821a..0000000000 --- a/tests/spread/core22/remote-build/snaps/build-for-arg/expected-snaps.txt +++ /dev/null @@ -1,2 +0,0 @@ -test-snap-build-for-arg-core22_1.0_amd64.snap -test-snap-build-for-arg-core22_1.0_s390x.snap diff --git a/tests/spread/core22/remote-build/snaps/build-for-arg/arguments.txt b/tests/spread/core22/remote-build/snaps/build-for-with-archs/arguments.txt similarity index 100% rename from tests/spread/core22/remote-build/snaps/build-for-arg/arguments.txt rename to tests/spread/core22/remote-build/snaps/build-for-with-archs/arguments.txt diff --git a/tests/spread/core22/remote-build/snaps/build-for-with-archs/expected-snaps.txt b/tests/spread/core22/remote-build/snaps/build-for-with-archs/expected-snaps.txt new file mode 100644 index 0000000000..3e6847266c --- /dev/null +++ b/tests/spread/core22/remote-build/snaps/build-for-with-archs/expected-snaps.txt @@ -0,0 +1,2 @@ +build-for-with-archs-core22_1.0_amd64.snap +build-for-with-archs-core22_1.0_s390x.snap diff --git a/tests/spread/core22/remote-build/snaps/build-for-with-archs/snapcraft.yaml b/tests/spread/core22/remote-build/snaps/build-for-with-archs/snapcraft.yaml new file mode 100644 index 0000000000..b38bf33998 --- /dev/null +++ b/tests/spread/core22/remote-build/snaps/build-for-with-archs/snapcraft.yaml @@ -0,0 +1,20 @@ +name: build-for-with-archs-core22 +base: core22 +version: "1.0" +summary: Test snap for remote build +description: Test snap for remote build + +grade: stable +confinement: strict + +architectures: + - build-on: [amd64] + build-for: [amd64] + - build-on: [s390x] + build-for: [s390x] + - build-on: [riscv64] + build-for: [riscv64] + +parts: + my-part: + plugin: nil diff --git a/tests/spread/core24/remote-build/snaps/build-for-arg/arguments.txt b/tests/spread/core22/remote-build/snaps/build-for/arguments.txt similarity index 100% rename from tests/spread/core24/remote-build/snaps/build-for-arg/arguments.txt rename to tests/spread/core22/remote-build/snaps/build-for/arguments.txt diff --git a/tests/spread/core22/remote-build/snaps/build-for/expected-snaps.txt b/tests/spread/core22/remote-build/snaps/build-for/expected-snaps.txt new file mode 100644 index 0000000000..af7f1a0372 --- /dev/null +++ b/tests/spread/core22/remote-build/snaps/build-for/expected-snaps.txt @@ -0,0 +1,2 @@ +build-for-core22_1.0_amd64.snap +build-for-core22_1.0_s390x.snap diff --git a/tests/spread/core22/remote-build-legacy/snaps/no-architectures/snapcraft.yaml b/tests/spread/core22/remote-build/snaps/build-for/snapcraft.yaml similarity index 81% rename from tests/spread/core22/remote-build-legacy/snaps/no-architectures/snapcraft.yaml rename to tests/spread/core22/remote-build/snaps/build-for/snapcraft.yaml index ade4c76d0f..11c0c66cca 100644 --- a/tests/spread/core22/remote-build-legacy/snaps/no-architectures/snapcraft.yaml +++ b/tests/spread/core22/remote-build/snaps/build-for/snapcraft.yaml @@ -1,4 +1,4 @@ -name: test-snap-no-architectures-core22 +name: build-for-core22 base: core22 version: "1.0" summary: Test snap for remote build diff --git a/tests/spread/core22/remote-build/snaps/no-architectures/expected-snaps.txt b/tests/spread/core22/remote-build/snaps/no-architectures/expected-snaps.txt deleted file mode 100644 index 2388cf27aa..0000000000 --- a/tests/spread/core22/remote-build/snaps/no-architectures/expected-snaps.txt +++ /dev/null @@ -1 +0,0 @@ -test-snap-no-architectures-core22_1.0_amd64.snap diff --git a/tests/spread/core22/remote-build/snaps/no-archs/expected-snaps.txt b/tests/spread/core22/remote-build/snaps/no-archs/expected-snaps.txt new file mode 100644 index 0000000000..a01a99749e --- /dev/null +++ b/tests/spread/core22/remote-build/snaps/no-archs/expected-snaps.txt @@ -0,0 +1 @@ +no-archs-core22_1.0_amd64.snap diff --git a/tests/spread/core22/remote-build/snaps/no-architectures/snapcraft.yaml b/tests/spread/core22/remote-build/snaps/no-archs/snapcraft.yaml similarity index 81% rename from tests/spread/core22/remote-build/snaps/no-architectures/snapcraft.yaml rename to tests/spread/core22/remote-build/snaps/no-archs/snapcraft.yaml index ade4c76d0f..24c8d5c70e 100644 --- a/tests/spread/core22/remote-build/snaps/no-architectures/snapcraft.yaml +++ b/tests/spread/core22/remote-build/snaps/no-archs/snapcraft.yaml @@ -1,4 +1,4 @@ -name: test-snap-no-architectures-core22 +name: no-archs-core22 base: core22 version: "1.0" summary: Test snap for remote build diff --git a/tests/spread/core22/remote-build/task.yaml b/tests/spread/core22/remote-build/task.yaml index feee247997..6283eb800b 100644 --- a/tests/spread/core22/remote-build/task.yaml +++ b/tests/spread/core22/remote-build/task.yaml @@ -4,11 +4,12 @@ kill-timeout: 180m environment: LAUNCHPAD_TOKEN: "$(HOST: echo ${LAUNCHPAD_TOKEN})" - SNAP: no-architectures + SNAP: no-archs SNAP/all: all - SNAP/no_architectures: no-architectures - SNAP/architectures: architectures - SNAP/build_for_arg: build-for-arg + SNAP/no_archs: no-archs + SNAP/archs: archs + SNAP/build_for: build-for + SNAP/build_for_with_archs: build-for-with-archs SNAPCRAFT_REMOTE_BUILD_STRATEGY: disable-fallback CREDENTIALS_FILE: "$HOME/.local/share/snapcraft/launchpad-credentials" CREDENTIALS_FILE/new_credentials: "$HOME/.local/share/snapcraft/launchpad-credentials" @@ -30,12 +31,20 @@ prepare: | # set up launchpad token mkdir -p "$(dirname "$CREDENTIALS_FILE")" - echo -e "$LAUNCHPAD_TOKEN" >> "$CREDENTIALS_FILE" + echo -e "$LAUNCHPAD_TOKEN" > "$CREDENTIALS_FILE" + + # build ids are based on the project contents + # adding a date ensures each test has a unique build id + date > date.txt restore: | cd "./snaps/$SNAP" - rm -f ./*.snap ./*.txt + # remove snaps, logs, and date files + rm -f ./*.snap ./snapcraft-*.txt ./date.txt + + # remove the temporary git repository + rm -rf .git execute: | cd "./snaps/$SNAP" diff --git a/tests/spread/core24/remote-build/snaps/all/expected-snaps.txt b/tests/spread/core24/remote-build/snaps/all/expected-snaps.txt index 851f79af8f..30675ea7fb 100644 --- a/tests/spread/core24/remote-build/snaps/all/expected-snaps.txt +++ b/tests/spread/core24/remote-build/snaps/all/expected-snaps.txt @@ -1 +1 @@ -test-snap-all-core24_1.0_all.snap +all-core24_1.0_all.snap diff --git a/tests/spread/core24/remote-build/snaps/all/snapcraft.yaml b/tests/spread/core24/remote-build/snaps/all/snapcraft.yaml index 2ff2511a3e..ce5b686f27 100644 --- a/tests/spread/core24/remote-build/snaps/all/snapcraft.yaml +++ b/tests/spread/core24/remote-build/snaps/all/snapcraft.yaml @@ -1,4 +1,4 @@ -name: test-snap-all-core24 +name: all-core24 base: core24 version: "1.0" summary: Test snap for remote build diff --git a/tests/spread/core24/remote-build/snaps/build-for-arg/expected-snaps.txt b/tests/spread/core24/remote-build/snaps/build-for-arg/expected-snaps.txt deleted file mode 100644 index ecd71f79c8..0000000000 --- a/tests/spread/core24/remote-build/snaps/build-for-arg/expected-snaps.txt +++ /dev/null @@ -1,2 +0,0 @@ -test-snap-build-for-arg-core24_1.0_amd64.snap -test-snap-build-for-arg-core24_1.0_s390x.snap diff --git a/tests/spread/core24/remote-build/snaps/build-for-arg/snapcraft.yaml b/tests/spread/core24/remote-build/snaps/build-for-arg/snapcraft.yaml deleted file mode 100644 index 1bafa9fbc4..0000000000 --- a/tests/spread/core24/remote-build/snaps/build-for-arg/snapcraft.yaml +++ /dev/null @@ -1,12 +0,0 @@ -name: test-snap-build-for-arg-core24 -base: core24 -version: "1.0" -summary: Test snap for remote build -description: Test snap for remote build - -grade: stable -confinement: strict - -parts: - my-part: - plugin: nil diff --git a/tests/spread/core24/remote-build/snaps/build-for-with-platforms/arguments.txt b/tests/spread/core24/remote-build/snaps/build-for-with-platforms/arguments.txt new file mode 100644 index 0000000000..c9eaf14f09 --- /dev/null +++ b/tests/spread/core24/remote-build/snaps/build-for-with-platforms/arguments.txt @@ -0,0 +1 @@ +--build-for amd64,s390x diff --git a/tests/spread/core24/remote-build/snaps/build-for-with-platforms/expected-snaps.txt b/tests/spread/core24/remote-build/snaps/build-for-with-platforms/expected-snaps.txt new file mode 100644 index 0000000000..b86312abb6 --- /dev/null +++ b/tests/spread/core24/remote-build/snaps/build-for-with-platforms/expected-snaps.txt @@ -0,0 +1,2 @@ +build-for-with-platforms-core24_1.0_amd64.snap +build-for-with-platforms-core24_1.0_s390x.snap diff --git a/tests/spread/core24/remote-build/snaps/build-for-with-platforms/snapcraft.yaml b/tests/spread/core24/remote-build/snaps/build-for-with-platforms/snapcraft.yaml new file mode 100644 index 0000000000..b2e5b618bd --- /dev/null +++ b/tests/spread/core24/remote-build/snaps/build-for-with-platforms/snapcraft.yaml @@ -0,0 +1,23 @@ +name: build-for-with-platforms-core24 +base: core24 +version: "1.0" +summary: Test snap for remote build +description: Test snap for remote build + +grade: stable +confinement: strict + +platforms: + amd64: + build-on: [amd64] + build-for: [amd64] + s390x: + build-on: [s390x] + build-for: [s390x] + riscv64: + build-on: [riscv64] + build-for: [riscv64] + +parts: + my-part: + plugin: nil diff --git a/tests/spread/core24/remote-build/snaps/build-for/arguments.txt b/tests/spread/core24/remote-build/snaps/build-for/arguments.txt new file mode 100644 index 0000000000..c9eaf14f09 --- /dev/null +++ b/tests/spread/core24/remote-build/snaps/build-for/arguments.txt @@ -0,0 +1 @@ +--build-for amd64,s390x diff --git a/tests/spread/core24/remote-build/snaps/build-for/expected-snaps.txt b/tests/spread/core24/remote-build/snaps/build-for/expected-snaps.txt new file mode 100644 index 0000000000..71662211d4 --- /dev/null +++ b/tests/spread/core24/remote-build/snaps/build-for/expected-snaps.txt @@ -0,0 +1,2 @@ +build-for-core24_1.0_amd64.snap +build-for-core24_1.0_s390x.snap diff --git a/tests/spread/core24/remote-build/snaps/platform-arg/snapcraft.yaml b/tests/spread/core24/remote-build/snaps/build-for/snapcraft.yaml similarity index 82% rename from tests/spread/core24/remote-build/snaps/platform-arg/snapcraft.yaml rename to tests/spread/core24/remote-build/snaps/build-for/snapcraft.yaml index 7f793ff460..980030e78d 100644 --- a/tests/spread/core24/remote-build/snaps/platform-arg/snapcraft.yaml +++ b/tests/spread/core24/remote-build/snaps/build-for/snapcraft.yaml @@ -1,4 +1,4 @@ -name: test-snap-platform-arg-core24 +name: build-for-core24 base: core24 version: "1.0" summary: Test snap for remote build diff --git a/tests/spread/core24/remote-build/snaps/no-platforms/expected-snaps.txt b/tests/spread/core24/remote-build/snaps/no-platforms/expected-snaps.txt index bea51286d6..537298831a 100644 --- a/tests/spread/core24/remote-build/snaps/no-platforms/expected-snaps.txt +++ b/tests/spread/core24/remote-build/snaps/no-platforms/expected-snaps.txt @@ -1 +1 @@ -test-snap-no-platforms-core24_1.0_amd64.snap +no-platforms-core24_1.0_amd64.snap diff --git a/tests/spread/core24/remote-build/snaps/no-platforms/snapcraft.yaml b/tests/spread/core24/remote-build/snaps/no-platforms/snapcraft.yaml index 4cc212fa35..03f6718651 100644 --- a/tests/spread/core24/remote-build/snaps/no-platforms/snapcraft.yaml +++ b/tests/spread/core24/remote-build/snaps/no-platforms/snapcraft.yaml @@ -1,4 +1,4 @@ -name: test-snap-no-platforms-core24 +name: no-platforms-core24 base: core24 version: "1.0" summary: Test snap for remote build diff --git a/tests/spread/core24/remote-build/snaps/platform-arg/arguments.txt b/tests/spread/core24/remote-build/snaps/platform-arg/arguments.txt deleted file mode 100644 index dddd614311..0000000000 --- a/tests/spread/core24/remote-build/snaps/platform-arg/arguments.txt +++ /dev/null @@ -1 +0,0 @@ ---platform amd64,s390x diff --git a/tests/spread/core24/remote-build/snaps/platform-arg/expected-snaps.txt b/tests/spread/core24/remote-build/snaps/platform-arg/expected-snaps.txt deleted file mode 100644 index 1185b31b0c..0000000000 --- a/tests/spread/core24/remote-build/snaps/platform-arg/expected-snaps.txt +++ /dev/null @@ -1,2 +0,0 @@ -test-snap-platform-arg-core24_1.0_amd64.snap -test-snap-platform-arg-core24_1.0_s390x.snap diff --git a/tests/spread/core24/remote-build/snaps/platforms/expected-snaps.txt b/tests/spread/core24/remote-build/snaps/platforms/expected-snaps.txt index 6106e568ff..3c041f2bfb 100644 --- a/tests/spread/core24/remote-build/snaps/platforms/expected-snaps.txt +++ b/tests/spread/core24/remote-build/snaps/platforms/expected-snaps.txt @@ -1,3 +1,3 @@ -test-snap-platforms-core24_1.0_amd64.snap -test-snap-platforms-core24_1.0_arm64.snap -test-snap-platforms-core24_1.0_armhf.snap +platforms-core24_1.0_amd64.snap +platforms-core24_1.0_arm64.snap +platforms-core24_1.0_armhf.snap diff --git a/tests/spread/core24/remote-build/snaps/platforms/snapcraft.yaml b/tests/spread/core24/remote-build/snaps/platforms/snapcraft.yaml index 2be885a16d..435656f1fc 100644 --- a/tests/spread/core24/remote-build/snaps/platforms/snapcraft.yaml +++ b/tests/spread/core24/remote-build/snaps/platforms/snapcraft.yaml @@ -1,4 +1,4 @@ -name: test-snap-platforms-core24 +name: platforms-core24 base: core24 version: "1.0" summary: Test snap for remote build diff --git a/tests/spread/core24/remote-build/task.yaml b/tests/spread/core24/remote-build/task.yaml index 152d3abec4..14bd5dfefd 100644 --- a/tests/spread/core24/remote-build/task.yaml +++ b/tests/spread/core24/remote-build/task.yaml @@ -11,8 +11,8 @@ environment: SNAP/all: all SNAP/platforms: platforms SNAP/no_platforms: no-platforms - SNAP/platform_arg: platform-arg - SNAP/build_for_arg: build-for-arg + SNAP/build_for: build-for + SNAP/build_for_with_platforms: build-for-with-platforms CREDENTIALS_FILE: "$HOME/.local/share/snapcraft/launchpad-credentials" CREDENTIALS_FILE/new_credentials: "$HOME/.local/share/snapcraft/launchpad-credentials" CREDENTIALS_FILE/old_credentials: "$HOME/.local/share/snapcraft/provider/launchpad/credentials" @@ -33,13 +33,20 @@ prepare: | # set up launchpad token mkdir -p "$(dirname "$CREDENTIALS_FILE")" - echo -e "$LAUNCHPAD_TOKEN" >> "$CREDENTIALS_FILE" + echo -e "$LAUNCHPAD_TOKEN" > "$CREDENTIALS_FILE" + + # build ids are based on the project contents + # adding a date ensures each test has a unique build id + date > date.txt restore: | cd "./snaps/$SNAP" - rm -f ./*.snap ./*.txt - rm -rf snap .git + # remove snaps, logs, and date files + rm -f ./*.snap ./snapcraft-*.txt ./date.txt + + # remove the temporary git repository + rm -rf .git execute: | cd "./snaps/$SNAP" diff --git a/tests/unit/commands/test_remote.py b/tests/unit/commands/test_remote.py index 0535031bd0..eb9a32c8ec 100644 --- a/tests/unit/commands/test_remote.py +++ b/tests/unit/commands/test_remote.py @@ -414,10 +414,12 @@ def test_default_architecture( ) +@pytest.mark.parametrize("args", [[], ["--build-for", "all"]]) @pytest.mark.parametrize("base", const.CURRENT_BASES - {"core22", "devel"}) def test_platform_build_for_all( mocker, snapcraft_yaml, + args, base, fake_services, mock_confirm, @@ -431,7 +433,7 @@ def test_platform_build_for_all( }, } snapcraft_yaml(**snapcraft_yaml_dict) - mocker.patch.object(sys, "argv", ["snapcraft", "remote-build"]) + mocker.patch.object(sys, "argv", ["snapcraft", "remote-build", *args]) mock_start_builds = mocker.patch( "craft_application.services.remotebuild.RemoteBuildService.start_builds" ) @@ -442,7 +444,9 @@ def test_platform_build_for_all( assert mock_start_builds.call_args[1]["architectures"] == ["all"] +@pytest.mark.parametrize("args", [[], ["--build-for", "all"]]) def test_platform_build_for_all_core22( + args, mocker, snapcraft_yaml, fake_services, @@ -457,7 +461,7 @@ def test_platform_build_for_all_core22( ], } snapcraft_yaml(**snapcraft_yaml_dict) - mocker.patch.object(sys, "argv", ["snapcraft", "remote-build"]) + mocker.patch.object(sys, "argv", ["snapcraft", "remote-build", *args]) mock_start_builds = mocker.patch( "craft_application.services.remotebuild.RemoteBuildService.start_builds" ) @@ -536,9 +540,9 @@ def test_architecture_in_project_metadata( ) -@pytest.mark.parametrize("base", const.CURRENT_BASES - {"core22", "devel"}) +@pytest.mark.parametrize("base", const.CURRENT_BASES - {"devel"}) @pytest.mark.parametrize( - ("platforms", "expected_platforms"), + ("build_fors", "expected_build_fors"), [ *zip(const.SnapArch, [[arch] for arch in const.SnapArch]), ("amd64,riscv64", ["amd64", "riscv64"]), @@ -547,26 +551,26 @@ def test_architecture_in_project_metadata( pytest.param( "amd64,amd64,riscv64", ["amd64", "amd64", "riscv64"], - id="launchpad-handles-duplicates", + id="duplicates-passthrough-to-launchpad", ), ], ) -def test_platform_argument( +def test_build_for_argument( mocker, snapcraft_yaml, base, fake_services, mock_confirm, mock_remote_builder_fake_build_process, - platforms, - expected_platforms, + build_fors, + expected_build_fors, ): - """Use architectures provided by the `--platform` argument.""" + """Use architectures provided by the `--build-for` argument.""" snapcraft_yaml(base=base) mocker.patch.object( sys, "argv", - ["snapcraft", "remote-build", "--platform", platforms], + ["snapcraft", "remote-build", "--build-for", build_fors], ) mock_start_builds = mocker.patch( "craft_application.services.remotebuild.RemoteBuildService.start_builds" @@ -574,40 +578,39 @@ def test_platform_argument( app = application.create_app() app.run() - mock_start_builds.assert_called_once_with(ANY, architectures=expected_platforms) + mock_start_builds.assert_called_once_with(ANY, architectures=expected_build_fors) -@pytest.mark.parametrize("base", const.CURRENT_BASES - {"devel"}) @pytest.mark.parametrize( - ("build_fors", "expected_build_fors"), + ("archs", "expected_archs"), [ - *zip(const.SnapArch, [[arch] for arch in const.SnapArch]), + ("amd64", ["amd64"]), + ("riscv64", ["riscv64"]), ("amd64,riscv64", ["amd64", "riscv64"]), - ("amd64,riscv64,s390x", ["amd64", "riscv64", "s390x"]), - pytest.param(" amd64 , riscv64 ", ["amd64", "riscv64"], id="with-whitespace"), - pytest.param( - "amd64,amd64,riscv64", - ["amd64", "amd64", "riscv64"], - id="duplicates-passthrough-to-launchpad", - ), ], ) -def test_build_for_argument( +def test_architectures_filter( mocker, snapcraft_yaml, - base, fake_services, mock_confirm, mock_remote_builder_fake_build_process, - build_fors, - expected_build_fors, + archs, + expected_archs, ): - """Use architectures provided by the `--build-for` argument.""" - snapcraft_yaml(base=base) + """Filter an 'architectures' key with '--build-for'.""" + snapcraft_yaml_dict = { + "base": "core22", + "architectures": [ + {"build-on": ["amd64"], "build-for": ["amd64"]}, + {"build-on": ["riscv64"], "build-for": ["riscv64"]}, + ], + } + snapcraft_yaml(**snapcraft_yaml_dict) mocker.patch.object( sys, "argv", - ["snapcraft", "remote-build", "--build-for", build_fors], + ["snapcraft", "remote-build", "--build-for", archs], ) mock_start_builds = mocker.patch( "craft_application.services.remotebuild.RemoteBuildService.start_builds" @@ -615,17 +618,17 @@ def test_build_for_argument( app = application.create_app() app.run() - mock_start_builds.assert_called_once_with(ANY, architectures=expected_build_fors) + mock_start_builds.assert_called_once_with(ANY, architectures=expected_archs) -def test_architecture_defined_twice_error( +def test_architectures_filter_error( capsys, mocker, snapcraft_yaml, fake_services, mock_confirm, ): - """Error if architectures are in the project metadata and as a build argument.""" + """Error if '--build-for' entirely filters the build plan.""" snapcraft_yaml_dict = { "base": "core22", "architectures": [{"build-on": ["riscv64"], "build-for": ["riscv64"]}], @@ -634,36 +637,42 @@ def test_architecture_defined_twice_error( mocker.patch.object( sys, "argv", - ["snapcraft", "remote-build", "--build-for", "riscv64"], + ["snapcraft", "remote-build", "--build-for", "arm64"], ) app = application.create_app() app.run() _, err = capsys.readouterr() + assert "No build matches the current execution environment." in err assert ( - "'--build-for' cannot be used when 'architectures' is in the snapcraft.yaml." - ) in err - assert ( - "Remove '--build-for' from the command line or remove 'architectures' in the snapcraft.yaml." + "Check the project's 'platforms' declaration, and the " + "'--platform' and '--build-for' parameters." ) in err -@pytest.mark.parametrize("base", const.CURRENT_BASES - {"core22", "devel"}) -@pytest.mark.parametrize("argument", ["--build-for", "--platform"]) -def test_platform_defined_twice_error( - base, - argument, - capsys, +@pytest.mark.parametrize( + ("archs", "expected_archs"), + [ + ("amd64", ["amd64"]), + ("riscv64", ["riscv64"]), + ("amd64,riscv64", ["amd64", "riscv64"]), + ], +) +def test_platforms_filter( mocker, snapcraft_yaml, fake_services, mock_confirm, + mock_remote_builder_fake_build_process, + archs, + expected_archs, ): - """Error if platforms are in the project metadata and as a build argument.""" + """Filter a 'platforms' key with '--build-for'.""" snapcraft_yaml_dict = { - "base": base, + "base": "core24", "platforms": { + "amd64": {"build-on": "amd64", "build-for": "amd64"}, "riscv64": {"build-on": "riscv64", "build-for": "riscv64"}, }, } @@ -671,61 +680,46 @@ def test_platform_defined_twice_error( mocker.patch.object( sys, "argv", - ["snapcraft", "remote-build", argument, "riscv64"], + ["snapcraft", "remote-build", "--build-for", archs], + ) + mock_start_builds = mocker.patch( + "craft_application.services.remotebuild.RemoteBuildService.start_builds" ) app = application.create_app() app.run() - _, err = capsys.readouterr() - - assert ( - f"{argument!r} cannot be used when 'platforms' is in the snapcraft.yaml." - ) in err - assert ( - f"Remove {argument!r} from the command line or remove 'platforms' in the snapcraft.yaml." - ) in err + mock_start_builds.assert_called_once_with(ANY, architectures=expected_archs) -@pytest.mark.parametrize( - "platforms", - [ - "nonexistent", - "nonexistent,riscv64", - "riscv64,nonexistent", - "riscv64,nonexistent,amd64", - ], -) -@pytest.mark.parametrize("base", const.CURRENT_BASES - {"core22"}) -def test_unknown_platform_error( +def test_platforms_filter_error( capsys, mocker, snapcraft_yaml, - platforms, - base, fake_services, mock_confirm, ): - """Error if `--platform` is not a valid debian architecture.""" + """Error if '--build-for' entirely filters the build plan.""" snapcraft_yaml_dict = { - "base": base, - "build-base": "devel", - "grade": "devel", + "base": "core24", + "platforms": { + "riscv64": {"build-on": "riscv64", "build-for": "riscv64"}, + }, } snapcraft_yaml(**snapcraft_yaml_dict) mocker.patch.object( sys, "argv", - ["snapcraft", "remote-build", "--platform", platforms], + ["snapcraft", "remote-build", "--build-for", "arm64"], ) - app = application.create_app() - assert app.run() == os.EX_CONFIG + app.run() _, err = capsys.readouterr() - assert "Unsupported platform 'nonexistent'" in err + + assert "No build matches the current execution environment." in err assert ( - "Recommended resolution: Use a supported debian architecture. " - "Supported architectures are:" + "Check the project's 'platforms' declaration, and the " + "'--platform' and '--build-for' parameters." ) in err @@ -771,33 +765,6 @@ def test_unknown_build_for_error( ) in err -def test_platform_core22_error( - capsys, - mocker, - snapcraft_yaml, - fake_services, - mock_confirm, - mock_remote_builder_fake_build_process, -): - """Error on `--platform` for core22 snaps.""" - snapcraft_yaml(base="core22") - mocker.patch.object( - sys, - "argv", - ["snapcraft", "remote-build", "--platform", "amd64"], - ) - mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) - app = application.create_app() - assert app.run() == os.EX_CONFIG - - _, err = capsys.readouterr() - - assert "--platform' cannot be used for core22 snaps" in err - assert "Use '--build-for' instead." in err - - @pytest.mark.parametrize( ("base", "build_info", "error_messages"), [ diff --git a/tests/unit/test_application.py b/tests/unit/test_application.py index ea86a2b518..96510664a3 100644 --- a/tests/unit/test_application.py +++ b/tests/unit/test_application.py @@ -21,6 +21,7 @@ import sys from textwrap import dedent +import craft_application.launchpad import craft_application.remote import craft_cli import craft_parts.plugins @@ -704,11 +705,18 @@ def test_store_key_error(mocker, capsys): ) -def test_remote_build_error(mocker, capsys): +@pytest.mark.parametrize( + "error_class", + [ + craft_application.remote.RemoteBuildError, + craft_application.launchpad.LaunchpadError, + ], +) +def test_remote_build_error(mocker, capsys, error_class): """Catch remote build errors and include a documentation link.""" mocker.patch( "snapcraft.application.Application._run_inner", - side_effect=craft_application.remote.RemoteBuildError(message="test-error"), + side_effect=error_class("test-error"), ) return_code = application.main() From 0a7f753acb84af6579dee89972ad218c9c281a9c Mon Sep 17 00:00:00 2001 From: Sergio Costas Date: Mon, 27 Jan 2025 18:42:07 +0100 Subject: [PATCH 3/3] fix: don't modify 'prefix' for relocatable pkg-config files (#5157) A relocatable `.pc` file has a `prefix` key beginning with `${pcfiledir}`. The `prefix` key is not modified if the `.pc` file is relocatable. Co-authored-by: Callahan --- requirements-devel.txt | 2 +- requirements-docs.txt | 2 +- requirements.txt | 2 +- setup.py | 2 +- snapcraft_legacy/internal/repo/_base.py | 11 +++++++++++ tests/legacy/unit/repo/test_base.py | 16 ++++++++++++++++ 6 files changed, 31 insertions(+), 4 deletions(-) diff --git a/requirements-devel.txt b/requirements-devel.txt index fef6e3a9a8..7880a30c26 100644 --- a/requirements-devel.txt +++ b/requirements-devel.txt @@ -59,7 +59,7 @@ craft-grammar==2.0.1 # via # craft-application # snapcraft (setup.py) -craft-parts==2.3.0 +craft-parts==2.4.1 # via # craft-application # snapcraft (setup.py) diff --git a/requirements-docs.txt b/requirements-docs.txt index 24faa7c7f8..9f311008c2 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -73,7 +73,7 @@ craft-grammar==2.0.1 # via # craft-application # snapcraft (setup.py) -craft-parts==2.3.0 +craft-parts==2.4.1 # via # craft-application # snapcraft (setup.py) diff --git a/requirements.txt b/requirements.txt index a586bcdd41..932ff5a8e5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -41,7 +41,7 @@ craft-grammar==2.0.1 # via # craft-application # snapcraft (setup.py) -craft-parts==2.3.0 +craft-parts==2.4.1 # via # craft-application # snapcraft (setup.py) diff --git a/setup.py b/setup.py index 13eb7ca3f4..87cec33c05 100755 --- a/setup.py +++ b/setup.py @@ -102,7 +102,7 @@ def recursive_data_files(directory, install_directory): "craft-archives~=2.0", "craft-cli>=2.15.0", "craft-grammar>=2.0.1,<3.0.0", - "craft-parts==2.3.0", + "craft-parts==2.4.1", "craft-platforms~=0.4", "craft-providers>=2.0.4,<3.0.0", "craft-store>=3.0.2,<4.0.0", diff --git a/snapcraft_legacy/internal/repo/_base.py b/snapcraft_legacy/internal/repo/_base.py index 6f7c2b432a..e5ebbafc15 100644 --- a/snapcraft_legacy/internal/repo/_base.py +++ b/snapcraft_legacy/internal/repo/_base.py @@ -346,6 +346,10 @@ def fix_pkg_config( - From snaps built locally: `/stage` - Built during the build stage: the install directory + But if the prefix begins with `pcfiledir` variable, it must be kept as-is, + because that variable refers to the current location of the .pc file. It + allows to create "relocatable" pkgconfig files, so no changes are required. + :param pkg_config_file: pkg-config (.pc) file to modify :param prefix_prepend: directory to prepend to the prefix :param prefix_trim: directory to remove from prefix @@ -358,10 +362,17 @@ def fix_pkg_config( f"^prefix=(?P{'|'.join(prefixes_to_trim)})(?P.*)" ) pattern = re.compile("^prefix=(?P.*)") + pattern_pcfiledir = re.compile("^prefix *= *[$]{pcfiledir}.*") # process .pc file with fileinput.input(pkg_config_file, inplace=True) as input_file: for line in input_file: + # If the prefix begins with ${pcfiledir} statement, this is + # a position-independent (thus, "relocatable") .pc file, so + # no changes are required. + if pattern_pcfiledir.search(line) is not None: + print(line, end="") + continue match = pattern.search(line) match_trim = pattern_trim.search(line) diff --git a/tests/legacy/unit/repo/test_base.py b/tests/legacy/unit/repo/test_base.py index d4607c12d7..c9634a879c 100644 --- a/tests/legacy/unit/repo/test_base.py +++ b/tests/legacy/unit/repo/test_base.py @@ -369,6 +369,22 @@ def test_fix_pkg_config_trim_prefix( ) +def test_fix_pkg_config_with_pcfiledir( + tmpdir, + pkg_config_file, + expected_pkg_config_content, +): + """Verify prefixes that begin with ${pcfiledir} aren't modified.""" + pc_file = tmpdir / "my-file.pc" + pkg_config_file(pc_file, "${pcfiledir}/../../..") + + fix_pkg_config(tmpdir, pc_file) + + assert pc_file.read_text(encoding="utf-8") == expected_pkg_config_content( + "${pcfiledir}/../../.." + ) + + def test_normalize_fix_pkg_config(tmpdir, pkg_config_file, expected_pkg_config_content): """Verify normalization fixes pkg-config files.""" pc_file = tmpdir / "my-file.pc"