根据维基百科,二进制存储库管理器 (BRM)是“一种软件工具,旨在优化软件开发中使用和生成的二进制文件的下载和存储”,例如 .jar、.tar 或 .zip 档案。作为大多数DevOps 工具链的关键组件,BRM 位于构建管道之后。这就是为什么它有时被称为“构建存储库”、“工件存储库”或“管道状态存储库”的原因。
传统的DevOps 管道需要自动验证、测试、打包和版本化到工件(二进制文件)中的源代码。然后,工件必须存储在源代码存储库之外,并可供持续交付管道的后续阶段使用。作为管理二进制文件和依赖项的中心点,以及用于构建内部开发软件促销的集成库,BRM 应该托管这些工件。
图 1. 普通软件开发团队的交付管道
几乎任何规模的软件项目都需要将其二进制工件保存在存储库中,以便程序员或确保持续集成 (CI)、交付 (CD) 和部署 (CD)的工具能够访问它们。由于管理存储库的软件质量很重要,因此 BRM 应满足以下要求:
- 可集成性——每种编程语言都有大量的构建自动化工具,例如用于 Java 的 Maven、用于 JavaScript 的 Npm 或用于 Ruby 的 Rake。还有很多持续集成工具,比如 Jenkins 或 Travis。由于自动化是 DevOps 最重要的方面,因此预计每个或大部分都有插件,从而能够与 BRM 无缝集成。
- 可用性——工件是软件开发过程的重要组成部分,它们必须在需要时立即可供程序员或构建工具使用,甚至没有微小的延迟,并以尽可能快的速度交付。
- 可扩展性——大多数构建工件都是大型二进制文件;其中一些可能大于 1Gb,例如 Docker 映像或 .war(生产就绪的 Java 档案)。BRM 必须能够维护大型数据集,几乎没有大小限制。
- 可靠性——必须尽可能排除因软件或硬件故障而损坏数据的能力。
Artipie 是一个免费的二进制工件管理工具。Artipie 不仅仅是一个二进制工件 Web 服务器——它是一个工件管理构造函数,它包含许多内置在服务器组件中的组件。这是一个开源项目,始于 2020 年,并且正在积极发展。
所有 Artipie 组件均基于反应式、异步、非阻塞和背压流和原则,使 Artipie 能够以少量内核线程承受繁重的工作负载。
Artipie 架构由 3 个基本部分组成:
- Artipie HTTP 引擎
- 存储库适配器
- 存储
图 2. Artipie 结构
Artipie HTTP 引擎Artipie 引擎是一个 Java 应用程序,它公开了一个用于存储库访问和管理操作的 HTTP 端点。它将 HTTP 请求路由到存储库适配器并提供身份验证机制。Artipie HTTP 引擎基于Vert.x和RxJava框架构建,通过异步、反应式和非阻塞操作为项目提供轻量级的灵活性和可扩展性。
Artipie 上传操作最常见的数据流如下:客户端正在向服务器发送一些二进制工件,服务器会找到负责的存储库适配器来处理请求;存储库适配器将流保存到存储;完成后,它会更新存储库的元数据(某些存储库的工作方式不同,例如,Docker 使用元数据作为路径)。
图 3. 使用 S3 实现存储的 Artipie Maven 存储库的上传操作
存储库适配器存储库适配器是独立项目,旨在实现 API 以与特定包类型(npm、maven 等)的存储库客户端和元信息生成层进行交互。Artipie 引擎使用适配器来提供 BRM 功能。每个存储库适配器都封装存储 API 以访问二进制 blob 和元数据文件。
Artipie 支持以下类型的存储库:
- Docker - 用于镜像的私有 Docker 注册表。
- Maven - Java、Kotlin、Groovy、Scala、Clojure 工件和各种类型的依赖项,如 .jar、.war、.klib 等。
- NPM - JavaScript 代码共享和包存储。
- PyPI - Python 包索引。
- Anaconda - 为 Python、R、Lua、C、C 等构建数据科学包。
- RPM - 用于 RHEL、PCLinuxOS、Fedora、AlmaLinux、CentOS、openSUSE、OpenMandriva、Oracle Linux 等的 .rpm 软件包存储库。
- Gem - Ruby 的 RubyGem 托管服务.
- Go - Go 包裹存储。
- 文件(二进制)存储 - 托管您喜欢的任何文件。
- Helm - Helm 图表存储库。
- NuGet - .NET 包的托管服务。
- Debian - 基于 Debian 的 Linux 发行版的软件包存储库:Ubuntu、MX Linux、Mint、Raspberry Pi OS、Parrot OS 等。
- Composer - PHP 包的包源。
存储库适配器将上传和创建的二进制文件放置在存储中。Artipie 具有抽象存储,它提供了对物理数据存储系统的抽象。简单性使得为几乎任何数据存储系统实现接口变得容易。它有两个主要操作:从存储中放入和获取项目以及一些附加功能,例如检查项目是否存在、列出存储项目或获取项目元数据。
目前,有以下存储实现:
- 文件系统存储
- Redis 存储
- 基于 S3 的存储
抽象存储还提供了一个接口,可以实现该接口以支持您需要的任何类型的存储。
开始使用 Artipie使用 Artipie 有两种选择:
- 使用 Docker Compose 运行 Artipie Docker 映像
- 在 JVM 上运行 Artipie jar 存档
我将展示一个简单的示例,说明如何使用 Docker Compose 在本地运行 Artipie,并将其配置为 Windows 机器上 Docker 映像的存储库。
准备中要运行 Artipie,您需要安装Docker,然后您可以简单地克隆GitHub 存储库,并使用路径上的示例C:\,或按照以下步骤操作:
- 为 Artipie 项目创建一个文件夹(例如C:\artipie)
- 为 Artipie 配置创建一个文件夹(例如C:\artipie\config),并将包含 Artipie 服务器配置的 yml 文件放在该文件夹中。在我的示例中,该文件称为artipie.yml. 您必须指定 Artipie 将找到所有存储库配置的路径。我将 Docker 存储库的配置路径指定为,因为在第 4 步中进行设置时var/artipie/repo,我将文件夹从本地 Windows 机器安装C:\artipie\repo到 Artipie Docker 容器中的目录。
meta:
storage:
type: fs
path: /var/artipie/repo #path to repository configurations
layout: flat
3.为存储库配置文件(例如C:\artipie\repo)创建一个文件夹,然后将包含存储库配置的 yml 文件放入该文件夹。此文件的名称将是要创建的存储库的名称。例如,文件将被命名my-docker.yml,存储库将相应地命名为my-docker。要使用 FileStorage 类型配置存储,设置 Artipie 将存储所有项目的路径就足够了。系统必须具有读写权限才能在此路径上创建文件。在我的示例中,路径将是/var/artipie/images.
meta:
storage:
type: fs
path: /var/artipie/repo #path to repository configurations
layout: flat
4.docker-compose.yml使用以下说明 创建文件:
version: "3.3"
services:
artipie:
image: artipie/artipie:latest
container_name: artipie
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- /C/artipie/repo:/var/artipie/repo # mount folder with repository configuration
- /C/artipie/config:/etc/artipie/ # mount folder with Artipie server configuration
Launch
现在,打开 CLI,转到包含文件的docker-compose.yml文件夹并使用控制台命令启动 Artipie docker-compose up:
在 CLI 中,我们看到 Artipie 已经在端口 8080 上启动并找到了一个存储库配置文件my-docker.yml。
C:\>cd C:/artipie
C:\artipie>docker-compose up
[ ] Running 2/2
- Network artipie_default Created 0.7s
- Container artipie Created 0.1s
Attaching to artipie
…
artipie | [INFO] main com.artipie.VertxMain - Artipie was started on port 8080
artipie | [INFO] ForkJoinPool.commonPool-worker-1 com.artipie.asto.fs.FileStorage - Found 1 objects by the prefix "" in /var/artipie/repo by /var/artipie/repo: [my-docker.yml]
…
用法
在推送任何镜像之前,让我们从 Docker Hub 中拉出一个现有的镜像。我的选择是hub image。使用以下命令拉取 alpine 映像docker pull alpine:
C:\artipie>docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
Digest: sha256:686d8c9dfa6f3ccfc8230bc3178d23f84eeaf7e457f36f271ab1acc53015037c
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
使用下一个命令,我们从 alpine 映像创建名为myfirstimage 的 docker映像,以将其推送到我们的 Artipie 存储库:
docker image tag alpine localhost:8080/my-docker/myfirstimage. 检查 docker 是否有 2 个image:alpine 和localhost:8080/my-docker/myfirstimage,使用命令docker images::
C:\artipie>docker image tag alpine localhost:8080/my-docker/myfirstimage
C:\artipie>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost:8080/my-docker/myfirstimage latest e66264b98777 7 weeks ago 5.53MB
alpine latest e66264b98777 7 weeks ago 5.53MB
现在,我们必须使用默认用户 artipie|artipie 登录我们自己的注册表,因为 Docker 注册表仅支持授权用户docker login --username artipie localhost:8080:
C:\artipie>docker login --username artipie localhost:8080
Password: artipie
Login Succeeded
最后,我们可以使用以下命令将我们的image推送到存储库docker push localhost:8080/my-docker/myfirstimage:
C:\artipie>docker push localhost:8080/my-docker/myfirstimage
Using default tag: latest
The push refers to repository [localhost:8080/my-docker/myfirstimage]
24302eb7d908: Pushed
latest: digest: sha256:4ff3ca91275773af45cb4b0834e12b7eb47d1c18f770a0b151381cd227f4c253 size: 528
为了检查结果,我们可以使用命令附加到容器:docker exec -it artipie bash然后/var/artipie/images/my-docker找到带有子文件夹和 blob 文件的 docker 文件夹。
C:\artipie>docker exec -it artipie bash
bash-4.4$ cd /var/artipie/images/my-docker/
bash-4.4$ ls
docker
在从我们的存储库中提取image之前,请使用以下命令从本地 docker image中删除image:docker image rm localhost:8080/my-docker/myfirstimage.
验证image是否已删除,并且我们只有 1 个image(alpine)docker images::
电源外壳
C:\artipie>docker image rm localhost:8080/my-docker/myfirstimage
Untagged: localhost:8080/my-docker/myfirstimage:latest
Untagged: localhost:8080/my-docker/myfirstimage@sha256:4ff3ca91275773af45cb4b0834e12b7eb47d1c18f770a0b151381cd227f4c253
C:\artipie>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest e66264b98777 7 weeks ago 5.53MB
image也可以拉出:docker pull localhost:8080/my-docker/myfirstimage. 执行命令后,再次检查我们是否有 2 个image(alpine 和localhost:8080/my-docker/myfirstimage)docker images:
C:\artipie>docker pull localhost:8080/my-docker/myfirstimage
Using default tag: latest
latest: Pulling from my-docker/myfirstimage
Digest: sha256:4ff3ca91275773af45cb4b0834e12b7eb47d1c18f770a0b151381cd227f4c253
Status: Downloaded newer image for localhost:8080/my-docker/myfirstimage:latest
localhost:8080/my-docker/myfirstimage:latest
C:\artipie>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost:8080/my-docker/myfirstimage latest e66264b98777 7 weeks ago 5.53MB
alpine latest e66264b98777 7 weeks ago 5.53MB
结论
二进制存储库是任何 DevOps 管道中的关键元素,各种项目需要各种类型的二进制存储库来存储工件。几乎每个编程语言生态系统都有自己的工件存储库。Artipie 为一个产品中的主要包装格式提供了广泛的适配器,从而可以从一个地方管理所有工件。Artipie 正在迅速成长和发展,除了 File、Redis 和 S3 存储之外,它还提供了添加自己的二进制数据存储实现的能力。
Artipie 是存储二进制工件的好选择,因为它易于配置。它支持多种类型的存储库。作为开源产品,它完全免费使用。