Многочисленные санкционные ограничения могут стать преградой для использования существующих систем управления бинарными репозиториями, например, при приобретении необходимых лицензий. Таким образом, альтернатива существующим инструментам может сыграть положительную роль при организации работы с артефактами организации.

Artipie - это бесплатный менеджер бинарных репозиториев с открытым исходным кодом, поддерживающий все основные форматы пакетов и артефактов, который позволяет размещать их локально или в облачном хранилище.

Двоичные закрутки
Двоичные закрутки

Введение

Менеджер бинарных репозиториев (МБР) - это программный инструмент предназначенный для оптимизации загрузки, выгрузки и хранения файлов в бинарном формате, используемых и производимых в контексте разработки программного обеспечения (ПО). Являясь одним из ключевых компонентов DevOps инструментов, МБР расположен сразу после конвейера сборки. Именно поэтому его иногда называют “хранилищем сборок”, “хранилищем артефактов” или “хранилищем состояния конвейера”.

Традиционный конвейер DevOps ожидает исходный код, который автоматически проверяется, тестируется, упаковывается и версионируется в артефакт (бинарный файл), такой как .jar, .tar, .zip или другие форматы. Затем артефакт, как правило, хранится вне репозитория исходного кода и должен быть доступным для последующих этапов конвейера непрерывной доставки (Continuous Delivery). Будучи центральной точкой для управления двоичными файлами и их зависимостями, а также интегрированным хранилищем для сборок программного обеспечения, разработанного внутри компании, предполагается, что МБР будет размещать эти артефакты.

Конвейер поставки среднестатистической команды разработчиков ПО
Конвейер поставки среднестатистической команды разработчиков ПО

Программный проект практически любого размера должен хранить свои бинарные артефакты в репозитории, чтобы обеспечить доступ к ним программистов или инструментов, обеспечивающих непрерывную интеграцию (Continuous Integration), доставку (Continuous Delivery) и развертывание (Continuous Deployment). Поскольку качество программного обеспечения, управляющего репозиториями, оказывает существенное влияние на работу команд разработчиков, МБР должен отвечать таким требованиям, как:

  • Интегрируемость - существует множество инструментов автоматизации сборки для каждого языка программирования, например, Maven для Java, Npm для JavaScript или Rake для Ruby. Существует также множество инструментов непрерывной интеграции, таких как Jenkins, CircleCI или Travis. Поскольку автоматизация является наиболее важным аспектом DevOps, ожидается, что для каждого или большинства из них будут установлены плагины, обеспечивающие бесшовную интеграцию с МБР.

  • Доступность - артефакты являются важными компонентами процесса разработки программного обеспечения, и они должны быть доступны программисту или инструменту сборки немедленно, когда это необходимо, без даже незначительных задержек, и поставляться с максимально возможной скоростью.

  • Масштабируемость - большинство артефактов сборки представляют собой большие двоичные файлы; размер некоторых из них может превышать 1 Гб, например, образы Docker или .war (полное веб-приложение для Java). МБР должен быть способен поддерживать большие наборы данных, вплоть до практически полного отсутствия ограничений по размеру.

  • Надежность - возможность повреждения данных из-за программных или аппаратных сбоев должна быть исключена настолько, насколько это возможно.

Artipie

Artipie - это бесплатный инструмент для управления артефактами. Это не просто сервис, это конструктор, который включает в себя множество компонентов для обеспечения поддержки практически всех широко используемых форматов пакетов, таких как: Maven, Docker, Debian, NPM, Go, Helm, Ruby, Python, Anaconda, HexPm, Composer. Artipie позволяет использовать различные варианты хранения данных, такие как: файловое хранилище, S3-совместимое облачное хранилище, Redis хранилище, а также предоставляет интерфейс для использования хранилища, реализуемого пользователем. Кроме того, существует функционал, позволяющий управлять доступом пользователей и при настройке с использованием организаций - групп пользователей.

Artipie это проект с открытым исходным кодом, который стартовал в 2020 году и активно развивается в настоящее время. Все его компоненты основаны на принципах реактивности, асинхронного взаимодействия и неблокирующих потоках.

Архитектура Artipie состоит из 3 основных частей:

  1. HTTP-движок Artipie

  2. Адаптеры репозиториев

  3. Хранилища

Структура Artipie
Структура Artipie

HTTP-движок Artipie

HTTP-движок Artipie - это Java-приложение, которое предоставляет API для операций операций доступа к репозиторию и управления им. Он маршрутизирует запросы к адаптеру репозитория  и обеспечивает механизмы аутентификации и авторизации. HTTP-движок Artipie построен на базе фреймворков Vert.x и RxJava, что обеспечивает легкость, гибкость и масштабируемость проекта за счет асинхронных, реактивных и неблокирующих операций.

Наиболее распространенный поток действий для операции загрузки данных в Artipie выглядит следующим образом: клиент отправляет некоторый бинарный артефакт на сервер, который находит ответственный адаптер репозитория для обработки запроса; адаптер репозитория сохраняет данные в хранилище; после завершения он обновляет метаданные репозитория (некоторые репозитории работают иначе, например, Docker использует метаданные как путь).

Схема загрузки артефакта для Maven-репозитория с реализацией S3 для хранения данных
Схема загрузки артефакта для Maven-репозитория с реализацией S3 для хранения данных

Адаптеры репозиториев

Адаптеры репозиториев - это независимые проекты, направленные на реализацию API для взаимодействия с клиентом репозитория и слоями генерации метаинформации для конкретного типа пакета (npm, maven, hexpm и т.д.). HTTP-движок Artipie использует адаптеры для обеспечения функциональности МБР. Каждый адаптер репозитория инкапсулирует API для доступа к бинарным данным и файлам метаданных.

Artipie поддерживает следующие типы репозиториев:

  • Docker - приватный реестр для Docker образов.

  • Maven - репозиторий для Java, Kotlin, Groovy, Scala и Clojure артефактов и зависимостей различных типов, таких как: .jar, .war, .klib и т.д.

  • NPM - хранилище для доступа к коду и пакетам языка JavaScript.

  • PyPI - каталог пакетов Python.

  • Anaconda - пакеты для data science для языков Python, R, Lua, C, C++ и т.д.RPM - репозиторий пакетов .rpm для RHEL, PCLinuxOS, Fedora, AlmaLinux, CentOS, openSUSE, OpenMandriva, Oracle Linux и др.

  • Gem - хостинг RubyGem для языка Ruby.

  • Go - репозиторий пакетов для языка Go.

  • Хранение бинарных файлов - размещайте любые файлы, которые вам нужны.

  • Helm - репозиторий Helm-чартов.

  • NuGet - сервис хранения для .NET пакетов.

  • Debian - репозиторий пакетов для дистрибутивов Linux на базе Debian: Ubuntu, MX Linux, Mint, Raspberry Pi OS, Parrot OS и т.д.

  • HexPM - менеджер пакетов для экосистемы Erlang и Elixir.

  • Composer - репозиторий пакетов для языка PHP.

Количество адаптеров постоянно растет, и вы можете увидеть будущие адаптеры на дорожной карте Artipie

Хранилища

Адаптеры репозиториев помещают загруженные и созданные бинарные файлы в хранилище. В Artipie используется абстрактное хранилище, которое обеспечивает абстрагирование над физической системой хранения данных, что позволяет легко реализовать интерфейс практически для любой системы хранения данных. Хранилище выполняет две основные операции: поместить и получить элемент из хранилища, а также несколько дополнительных функций, таких как: проверка существования элемента, получение списка элементов хранилища или получение метаданных элемента.

На данный момент существуют следующие реализации хранилищ:

  1. Хранение в файловой системе.

  2. Хранилище на базе протокола S3.

  3. Redis хранилище.

Абстрактное хранилище также предоставляет интерфейс, который может быть расширен и реализован для поддержки любого нужного типа хранилища.

Использование Artipie

Существует два варианта работы с Artipie:

Далее рассмотрим простой пример локального запуска Artipie и его настройки для хранения docker-образов на компьютере с ОС Windows.

Подготовка

Для запуска Artipie необходимо установить Docker и Docker Compose, затем вы можете просто клонировать репозиторий GitHub с примером, разместив его по пути C:\, или выполнить следующие шаги:

  1. Создайте директорию для проекта Artipie (например C:\artipie).

  2. Создайте директорию для конфигурационного файла Artipie (например C:\artipie\config) и разместите там yml файл с конфигурацией сервера Artipie. В данном примере файл называется artipie.yml. Вы должны указать путь, по которому Artipie найдет все конфигурации репозиториев. В настоящем примере путь к конфигурации docker репозитория указан как /var/artipie/repo, потому что монтируется директория с локальной Windows машины C:\artipie\repo в каталог /var/artipie/repo в docker контейнере Artipie. Это описано в docker-compose.yml на шаге №4.

meta:
  storage:
    type: fs
    path: /var/artipie/repo #path to repository configurations
  layout: flat
  1. Создайте директорию для конфигурационных файлов репозиториев (например C:\artipie\repo), затем поместите в нее yml-файл с конфигурацией репозитория. Имя этого файла будет именем создаваемого репозитория. К примеру, файл называется my-docker.yml и соответственно репозиторий будет доступен с использованием имени my-docker. Чтобы настроить хранилище с типом FileStorage достаточно задать путь, по которому Artipie будет хранить все элементы. Система должна иметь права на чтение и запись в этой директории, чтобы создавать файлы по этому пути. В данном примере используется диретория /var/artipie/images.

repo:
  type: docker
  storage:
    type: fs   #тип = FileStorage
    path: /var/artipie/images   #место где будут сохранятся файлы
  1. Создайте файл 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 # монтируем папку с конфигурацией репозитория
      - /C/artipie/config:/etc/artipie/ # монтируем папку с конфигурацией сервера Artipie

Запуск

Теперь откройте консоль, перейдите в папку с файлом docker-compose.yml и запустите Artipie с помощью команды: docker-compose up. Следующий вывод в консоль показывает, что 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]
…

Использование

Push образа

Для создания образа, который будет использоваться в данном примере, мы воспользуемся уже существующим образом, доступным на Docker Hub. В данном случае - это легковесный образ с Alpine Linux.

  1. Скачайте образ 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
  1. С помощью следующей команды мы создадим наш docker образ под названием myfirstimage, который основан на образе alpine, чтобы разместить его в нашем репозитории Artipie: docker image tag alpine localhost:8080/my-docker/myfirstimage. Прверим, что Docker содержит 2 образа - 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
  1. Теперь нам нужно войти в наш собственный реестр под стандартным пользователем artipie|artipie, поскольку реестр Docker поддерживает только авторизованных пользователей: docker login --username artipie localhost:8080:

C:\artipie>docker login --username artipie localhost:8080
Password: artipie
Login Succeeded
  1. И наконец, мы можем поместить данный образ в наш репозиторий командой: 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
  1. Для проверки результата мы можем подключиться к контейнеру командой: docker exec -it artipie bash и перейти в директорию/var/artipie/images/my-docker для того, чтобы найти папку docker с созданными папками и blob-файлами.

Pull образа

Перед скачиванием образа из нашего репозитория удалите существующий образ из списка локальных образов командой: docker image rm localhost:8080/my-docker/myfirstimage. Убедитесь, что образ был удален, и теперь есть только 1 образ(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

Образ можно извлечь с помощью команды: docker pull localhost:8080/my-docker/myfirstimage. После выполнения команды можно убедиться, что теперь снова доступны два образа (alpine and 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 предоставляет широкий спектр адаптеров для основных форматов упаковки в одном продукте, позволяя управлять всеми артефактами из одного места. Он даёт возможность добавления реализации собственного хранилища бинарных данных в дополнение к файловому хранилищу, Redis и S3.

Artipie - хороший выбор для хранения бинарных артефактов, поскольку он прост в настройке, быстро растет и развивается, а также поддерживает множество существующих типов репозиториев. Являясь продуктом с открытым исходным кодом, он не требует оплаты для использования.

Более подробную информацию об Artipie вы можете найти на GitHub. Если у вас есть вопросы или предложения - можете задать их в Telegram группе.

Чтобы поддержать развитие Artipie, не стесняйтесь поставить проекту звезду на GitHub.

Комментарии (3)


  1. pit_art
    09.09.2022 17:28
    +1

    изучил гит этого прекрасного поделия, фраппирован крайне.

    ацл - в файле на хосте

    полиси - там же

    Хочешь кластер и синхронизировать учетки с полисями на разных нодах - ну пиши энсибловый темплейт и разливай

    нет выделенной субд, никакой интеграции с внешними аус-провайдерами, но грозятся при этом жить с 100ТБ стораджем артефактов в s3 на нескольких нодах. Уж не знаю врут или нет.

    Вайтпепер, понятно что устарел (20 года), но изобилует тупейшими ошибками даже для своего времени. Наверное можно использовать эту штуку как что-то легковесное, для совсем небольших команд, но даже при таком раскладе nexus-oss даст ему фору во всем, кроме кластеризации.


    1. Swizbiz Автор
      09.09.2022 19:33

      Спасибо за ревью.

      Проработка ACL уже в работе. Расширение способов авторизации уже запланировано.


    1. ggo
      12.09.2022 11:10

      ацл - в файле на хосте

      полиси - там же

      configuration-as-a-code же...