From cfcd2564d67fbd88696dfa80c7ea426ba4d1e460 Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Tue, 23 Apr 2024 11:53:02 +0200 Subject: [PATCH] Local recipes index post (#266) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * review * review * wip * wip * Update _posts/2024-04-23-Introducing-local-recipes-index-remote.markdown Co-authored-by: Rubén Rincón Blanco * Update _posts/2024-04-23-Introducing-local-recipes-index-remote.markdown * Update _posts/2024-04-23-Introducing-local-recipes-index-remote.markdown * Update _posts/2024-04-23-Introducing-local-recipes-index-remote.markdown Co-authored-by: Daniel * Update _posts/2024-04-23-Introducing-local-recipes-index-remote.markdown Co-authored-by: Daniel * Update _posts/2024-04-23-Introducing-local-recipes-index-remote.markdown Co-authored-by: Rubén Rincón Blanco * Update _posts/2024-04-23-Introducing-local-recipes-index-remote.markdown Co-authored-by: Rubén Rincón Blanco * Update _posts/2024-04-23-Introducing-local-recipes-index-remote.markdown Co-authored-by: Rubén Rincón Blanco * Update _posts/2024-04-23-Introducing-local-recipes-index-remote.markdown Co-authored-by: Rubén Rincón Blanco * Update _posts/2024-04-23-Introducing-local-recipes-index-remote.markdown Co-authored-by: Rubén Rincón Blanco --------- Co-authored-by: Rubén Rincón Blanco Co-authored-by: Daniel --- ...ducing-local-recipes-index-remote.markdown | 323 ++++++++++++++++++ .../2024-04-23/general-flow-diagram.png | Bin 0 -> 39933 bytes 2 files changed, 323 insertions(+) create mode 100644 _posts/2024-04-23-Introducing-local-recipes-index-remote.markdown create mode 100644 assets/post_images/2024-04-23/general-flow-diagram.png diff --git a/_posts/2024-04-23-Introducing-local-recipes-index-remote.markdown b/_posts/2024-04-23-Introducing-local-recipes-index-remote.markdown new file mode 100644 index 00000000..fd63dc0d --- /dev/null +++ b/_posts/2024-04-23-Introducing-local-recipes-index-remote.markdown @@ -0,0 +1,323 @@ +--- +layout: post +comments: false +title: "Introducing the Local-Recipes-Index: A New Repository Type in Conan" +meta_title: "Understanding Conan's Local-Recipes-Index to improve package management for C/C++ - Conan Blog" +description: "Explore the capabilities of Conan's local-recipes-index feature and how it enhances dependency management for C and C++ libraries." +--- + +ConanCenter, the central open-source repository for C and C++ libraries, is a success +story, containing a vast collection of C and C++ open-source packages. It processes hundreds +of thousands of download requests daily, building its packages [from a central GitHub +repository](https://github.com/conan-io/conan-center-index), which is organized in a +specific folder layout and received nearly 6,000 pull requests from contributors in +2023 alone. + +However, ConanCenter does not fit all use cases. For instance, it cannot include +closed-source libraries or tools that might still be beneficial to the community. +Additionally, some organizations, particularly large enterprises, prefer not to use +binaries downloaded from the internet. Instead, they build their own binaries in-house +using the `conan-center-index` recipes. These organizations often need to customize these +recipes to meet unique requirements that are not applicable to the broader community, +making such contributions unsuitable for the upstream repository. The Conan documentation +[acknowledges this +practice](https://docs.conan.io/2/devops/conancenter/hosting_binaries.html), recommending +working from a fork of `conan-center-index` for such needs. + +For all those reasons in version 2.2.0, Conan introduced a new repository type called +`local-recipes-index`, designed to offer more flexibility by allowing a Conan remote to +point to a local copy of Conan recipes with a specific layout. + +The `local-recipes-index` allows users to maintain a local folder with the same structure +as the `conan-center-index` GitHub repository, using it as a source for package recipes. +This new type of repository is recipes-only, necessitating the construction of package +binaries from source on each machine where the package is used. For sharing binaries +across teams, we continue to recommend [using a Conan remote server like +Artifactory](https://docs.conan.io/2/tutorial/conan_repositories/setting_up_conan_remotes/artifactory/artifactory_ce_cpp.html) +for production purposes. + +

+ Diagram of the general workflow +

+ +In this post, we will explore how this feature facilitates the following: + +- This feature enables contributors to share package recipes with the community for + libraries that might not be suitable for ConanCenter due to various reasons, such as + licensing constraints or binary distribution policies. An example of this could be CUDA + or other proprietary libraries, which are distributed as precompiled closed-source + binaries. + +- It simplifies the adoption of best practices outlined [in the Conan + documentation](https://docs.conan.io/2/devops/conancenter/hosting_binaries.html) for + organizations requiring custom-built binaries or modified ConanCenter recipes to meet + unique requirements. This approach grants users complete control over their third-party + dependencies, ensuring they are both robust and fully customizable. + +Next, we'll delve into practical examples to demonstrate these two use cases of the +`local-recipes-index` repository. + +## Using a local-recipes-index repository with your own recipes + +In this section, we will illustrate how to use the `local-recipes-index` feature for +scenarios where certain libraries or tools, due to licensing restrictions or proprietary +nature, are not suitable for ConanCenter. + +For demonstration purposes, let's create a `local-recipes-index` repository for a hypothetical +`hello` closed-source library using the `local_recipes_index` template for the `conan new` +command: + + $ mkdir repo && cd repo + $ conan new local_recipes_index -d name=hello -d version=0.1 \ + -d url=https://github.com/conan-io/libhello/archive/refs/tags/0.0.1.zip \ + -d sha256=1dfb66cfd1e2fb7640c88cc4798fe25853a51b628ed9372ffc0ca285fe5be16b + $ cd .. + +The `conan new local_recipes_index` command creates a template that assumes CMake as the +build system alongside other heavy assumptions. In practice, it will require customizing +it, but for this demo, it works as-is. It will create a folder layout equal to the +`conan-center-index` GitHub repository: + + . + └── repo + └── recipes + └── hello + ├── all + │ ├── conandata.yml + │ ├── conanfile.py + │ └── test_package + │ ├── CMakeLists.txt + │ ├── conanfile.py + │ └── src + │ └── example.cpp + └── config.yml + +After setting up the repository, we add it as a local remote to Conan: + + $ conan remote add mylocalrepo ./repo --allowed-packages="hello/*" + +Please pay special attention to the `--allowed-packages` argument. This argument ensures +that all packages other than `hello` are discarded by Conan. This can be used to minimize +the surface area for a potential supply chain attack. + +Now you can list and install packages from this new repository: + + $ conan list "*" -r=mylocalrepo + $ conan install --requires=hello/0.1 -r=mylocalrepo --build=missing + +At this point, you could push this repository to your GitHub account and share it with the +community. Please be aware that, as we commented earlier, this feature is specifically +tailored for scenarios where certain libraries are not suitable for ConanCenter. Remember, +a "local-recipes-index" repository has limitations: it is not fully reproducible as it +models only versions and not revisions, and it does not provide binaries. Therefore, +outside of these cases, it is advised to use a remote package server such as Artifactory. + +Now, users simply need to clone the GitHub repository and add the cloned folder as a local +repository themselves. + +## Building Binaries from a private `conan-center-index` fork + +As outlined in [the Conan DevOps +Guide](https://docs.conan.io/2/devops/using_conancenter.html), there are many cases where +organizations need to operate independently of ConanCenter by building their own binaries. +Being decoupled from the public upstream ConanCenter server and building your own binaries +from a fork of ``conan-center-index`` as suggested in the linked documentation page can have +many advantages, including absolute control and possibility to customize recipes, giving +us the ability for the repository to act as a snapshot of versions, be completely robust +against possible continuous changes and new releases in upstream ConanCenter, etc. + +The `local-recipes-index` repository allows you to easily build binaries from a fork of +`conan-center-index`, and then hosting them on a Conan remote repository like Artifactory. +The main difference with the process explained [in the Conan DevOps +guide](https://docs.conan.io/2/devops/conancenter/hosting_binaries.html) is the ability +to immediately test multiple local changes without the need to export each time a recipe +is modified. + +Note that in this case, mixing binaries from ConanCenter with locally built binaries is +not recommended for several reasons: + +- Binary compatibility: There may be small differences in setup between the ConanCenter CI +and the user's CI. Maintaining a consistent setup for all binaries can mitigate some issues. + +- Full control over builds: Building all binaries yourself ensures you have complete control +over the compilation environment and dependency versions. + +Instead, it's recommended to build all your direct and transitive dependencies from the fork. +To begin, remove the upstream ConanCenter as it will not be used, everything will come +from our own fork: + + $ conan remote remove conancenter + +Then we will clone our fork (in this case, we are cloning directly the upstream for demo +purposes, but you would be cloning your fork instead): + + $ git clone https://github.com/conan-io/conan-center-index + +Add this as our `mycenter` remote: + + # Add the mycenter remote pointing to the local folder + $ conan remote add mycenter ./conan-center-index + +And that’s all! Now you're set to list and use packages from your `conan-center-index` local folder: + + $ conan list "zlib/*" -r=mycenter + mycenter + zlib + zlib/1.2.11 + zlib/1.2.12 + zlib/1.2.13 + zlib/1.3 + zlib/1.3.1 + +We can also install packages from this repo, for example we can do: + + $ conan install --requires=zlib/1.3 + ... + ======== Computing dependency graph ======== + zlib/1.3: Not found in local cache, looking in remotes... + zlib/1.3: Checking remote: mycenter + zlib/1.3: Downloaded recipe revision 5c0f3a1a222eebb6bff34980bcd3e024 + Graph root + cli + Requirements + zlib/1.3#5c0f3a1a222eebb6bff34980bcd3e024 - Downloaded (mycenter) + + ======== Computing necessary packages ======== + Requirements + zlib/1.3#5c0f3a1a222eebb6bff34980bcd3e024:72c852c5f0ae27ca0b1741e5fd7c8b8be91a590a - Missing + ERROR: Missing binary: zlib/1.3:72c852c5f0ae27ca0b1741e5fd7c8b8be91a590a + +As we can see, Conan managed to get the recipe for ``zlib/1.3`` from ``mycenter``, but +then it failed because there is no binary. This is expected, **the repository only contains +the recipes, but not the binaries**. We can build the binary from source with +``--build=missing`` argument: + + $ conan install --requires=zlib/1.3 --build=missing + ... + zlib/1.3: package(): Packaged 2 '.h' files: zconf.h, zlib.h + zlib/1.3: package(): Packaged 1 file: LICENSE + zlib/1.3: package(): Packaged 1 '.a' file: libz.a + zlib/1.3: Created package revision 0466b3475bcac5c2ce37bb5deda835c3 + zlib/1.3: Package '72c852c5f0ae27ca0b1741e5fd7c8b8be91a590a' created + zlib/1.3: Full package reference: zlib/1.3#5c0f3a1a222eebb6bff34980bcd3e024:72c852c5f0ae27ca0b1741e5fd7c8b8be91a590a#0466b3475bcac5c2ce37bb5deda835c3 + zlib/1.3: Package folder /home/conan/.conan2/p/b/zlib1ed9fe13537a2/p + WARN: deprecated: Usage of deprecated Conan 1.X features that will be removed in Conan 2.X: + WARN: deprecated: 'cpp_info.names' used in: zlib/1.3 + + ======== Finalizing install (deploy, generators) ======== + cli: Generating aggregated env files + cli: Generated aggregated env files: ['conanbuild.sh', 'conanrun.sh'] + Install finished successfully + +We can see now the binary package in our local cache: + + $ conan list zlib:* + Local Cache + zlib + zlib/1.3 + revisions + 5c0f3a1a222eebb6bff34980bcd3e024 (2024-04-10 11:50:34 UTC) + packages + 72c852c5f0ae27ca0b1741e5fd7c8b8be91a590a + info + settings + arch: x86_64 + build_type: Release + compiler: gcc + compiler.version: 9 + os: Linux + options + fPIC: True + shared: False + +Finally, upload the binary package to our Artifactory repository to make it available for +our organization, users and CI jobs: + + $ conan remote add myartifactoryrepo + $ conan upload zlib* -r=myartifactoryrepo -c + +This way, consumers of the packages will not only enjoy the pre-compiled binaries and +avoid having to always re-build from source all dependencies, but that will also provide +stronger guarantees that the dependencies build and work correctly, that all dependencies +and transitive dependencies play well together, etc. Decoupling the binary creation +process from the binary consumption process is the way to achieve faster and more reliable +usage of dependencies. + +Remember, in a production setting, the `conan upload` command should be executed by CI, +not developers, following the [Conan +guidelines](https://docs.conan.io/2/knowledge/guidelines.html). This approach ensures that +package consumers enjoy pre-compiled binaries and consistency across dependencies. + +### Modifying the local-recipes-index repository files + +One of the advantages of this approach is that all the changes that we do in every single +recipe are automatically available for the Conan client. For example, changes to the +`recipes/zlib/config.yml` file are immediately recognized by the Conan client. If you +edit that file and remove all versions but the latest and then we `list` the recipes: + + $ conan list "zlib/*" -r=mycenter + mycenter + zlib + zlib/1.3.1 + +When some of the recipes change, then note that the current Conan home already contains a +cached copy of the package, so it will not update it unless we explicitly use the +``--update``, as any other Conan remote. + +So if we do a change in the ``zlib`` recipe in ``recipes/zlib/all/conanfile.py`` and +repeat: + + $ conan install --requires=zlib/1.3.1 -r=mycenter --update --build=missing + +We will immediately have the new package binary locally built from source from the new +modified recipe in our Conan home. + +### Using local-recipes-index Repositories in Production + +Several important points should be considered when using this new feature: + +- It is designed for **third-party packages**, where recipes in one repository are creating + packages with sources located elsewhere. To package your own code, the standard practice + of adding `conanfile.py` recipes along with the source code and using the standard + `conan create` flow is recommended. + +- The `local-recipes-index` repositories point to **local folders in the filesystem**. + While users may choose to sync that folder with a git repository or other version + control mechanisms, Conan is agnostic to this, as it is only aware of the folder in the + filesystem that points to the (current) state of the repository. Users may choose to run + git commands directly to switch branches/commit/tags and Conan will automatically + recognise the changes + +- This approach operates at the source level and does not generate package binaries. For + deployment for development and production environments, the use of a remote package + server such as Artifactory is crucial. It's important to note that this feature is not a + replacement for Conan's remote package servers, which play a vital role in hosting + packages for regular use. + +- Also, note that a server remote can retain a history of changes storing multiple recipe + revisions. In contrast, a `local-recipes-index` remote can only represent a single + snapshot at any given time. + +Furthermore, this feature does not support placing server URLs directly in recipes; remote +repositories must be explicitly added with `conan remote add`. Decoupling abstract package +requirements, such as "zlib/1.3.1", from their specific origins is crucial to resolving +dependencies correctly and leveraging Conan's graph capabilities, including version +conflict detection and resolution, version-ranges resolution, [opting into +pre-releases](https://docs.conan.io/2/devops/versioning/resolve_prereleases.html), +[platform_requires](https://docs.conan.io/2/reference/config_files/profiles.html#platform-requires), +[replace_requires](https://docs.conan.io/2/reference/config_files/profiles.html#replace-requires), +etc. This separation also facilitates the implementation of modern DevOps practices, such +as package immutability, full relocatability and package promotions. + +## Conclusions + +The `local-recipes-index` repository type introduces a new tool that enables workflows +previously not possible with Conan 1.X: + +- It allows the easy creation of packages from forks of the `conan-center-index` GitHub + repository. Many enterprises require this due to policies necessitating private + customizations in recipes that are unsuitable for merging into the upstream repository. + +- It provides a solution for packaging closed-source libraries and tools within the C/C++ + ecosystem that cannot be included in ConanCenter, enabling their recipes to be shared + and conveniently used within the Conan community. diff --git a/assets/post_images/2024-04-23/general-flow-diagram.png b/assets/post_images/2024-04-23/general-flow-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..39bdcd00887a63e985e8f1dc45f9a8e4f390c766 GIT binary patch literal 39933 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 Yqhetp^BlDg%Nc;c)78&qol`;+0D*l{QUCw| literal 0 HcmV?d00001