Работа с Alpine

CodeScoring.Save поддерживает репозитории Alpine (APK), совместимые со стандартным клиентом apk:

  • proxy-репозиторий — кэширующее зеркало внешнего APK-репозитория;
  • hosted-репозиторий — хранилище собственных пакетов .apk с автоматическим обновлением APKINDEX.tar.gz.

Создание репозитория

В веб-интерфейсе откройте проект, нажмите Create repository, выберите Format: Alpine / APK и Type: Proxy или Hosted. Общие поля описаны в разделе Управление репозиториями.

Proxy-репозиторий

В Proxy URL укажите адрес зеркала, например https://dl-cdn.alpinelinux.org/alpine. В Cache TTL, seconds задайте время обновления кэша метаданных.

Создание через API:

curl -X POST https://save.example.com/api/v1/repos \
  -H "Content-Type: application/json" \
  -u "<username>:<password>" \
  -d '{
    "project": "infra",
    "name": "apk-proxy",
    "format": "apk",
    "repository_type": "proxy",
    "remote_url": "https://dl-cdn.alpinelinux.org/alpine",
    "cache_ttl": 3600
  }'

Hosted-репозиторий

curl -X POST https://save.example.com/api/v1/repos \
  -H "Content-Type: application/json" \
  -u "<username>:<password>" \
  -d '{
    "project": "infra",
    "name": "apk-hosted",
    "format": "apk",
    "repository_type": "hosted"
  }'

Настройка клиента

Добавьте адреса Save в /etc/apk/repositories, указав ветку Alpine и компонент:

https://<username>:<password>@save.example.com/cs-save/apk/<project>/apk-proxy/v3.24/main
https://<username>:<password>@save.example.com/cs-save/apk/<project>/apk-proxy/v3.24/community
apk update
apk add curl

Замените v3.24 на ветку вашей системы. Архитектуру (x86_64, aarch64 и т. д.) клиент добавляет к URL сам. Чтобы все загрузки шли через Save, замените исходные адреса зеркал в /etc/apk/repositories.

Если Proxy URL уже содержит ветку или компонент, не повторяйте их в клиентском URL. Например, для upstream https://dl-cdn.alpinelinux.org/alpine/v3.24/main строка подключения заканчивается на /apk-proxy.

Аутентификация

Специальные символы в логине и пароле в URL нужно URL-кодировать. Для CI/CD можно использовать robot-аккаунт: логин sa$<robot-name> ($ в URL — %24), пароль — API-ключ. Подробнее — в разделе Аутентификация.

Доверие к ключу репозитория

Proxy. Save сохраняет подписи upstream: для официального зеркала Alpine используются стандартные ключи из пакета alpine-keys.

Hosted. Если на сервере включена подпись метаданных (METADATA_SIGNING_ENABLED), перед подключением репозитория скачайте его публичный ключ:

curl -fsSLOJ -u "<username>:<password>" \
  --output-dir /etc/apk/keys \
  "https://save.example.com/cs-save/apk/<project>/apk-hosted/repository.rsa.pub"

Сохраните имя файла, которое отдаёт сервер: apk находит ключ по этому имени. Готовая команда также доступна в Useful snippets на странице репозитория. Для hosted-репозитория без подписи используйте apk update --allow-untrusted и apk add --allow-untrusted <package>.

Публикация пакетов в hosted-репозиторий

Загрузите пакет по пути <branch>/<component>/<architecture>/<name>-<version>.apk:

curl -u "<username>:<password>" \
  -T hello-1.0-r0.apk \
  "https://save.example.com/cs-save/apk/<project>/apk-hosted/v3.24/main/x86_64/hello-1.0-r0.apk"

Save берёт имя и версию из пакета. Имя файла и архитектура в пути должны совпадать с данными пакета. Пакеты noarch загружаются в каталоги конкретных архитектур, например x86_64 и aarch64, отдельно для каждой нужной архитектуры. Повторная загрузка по тому же пути возвращает 409.

Индекс обновляется автоматически в течение нескольких секунд. Подключите /apk-hosted/v3.24/main в /etc/apk/repositories, настройте доверие к ключу и выполните:

apk update
apk add hello

Устранение неполадок

Проверить доступность индекса для нужной ветки, компонента и архитектуры:

curl -f -u "<username>:<password>" \
  -o APKINDEX.tar.gz \
  "https://save.example.com/cs-save/apk/<project>/apk-hosted/v3.24/main/x86_64/APKINDEX.tar.gz"

Если пакет ещё не виден клиенту, дождитесь обновления индекса и повторите apk update. При ошибке доверия проверьте, что ключ репозитория установлен в /etc/apk/keys под исходным именем.

Страница была полезна?