ci: registry-based releases — multi-arch images built in CI, servers only pull

- release workflow: buildx multi-arch (amd64+arm64) build+push of bot and admin images to Gitea Container Registry (git.softuniq.eu/telegram-market/telegram-shop[-admin])
- docker-compose: bot/admin use registry images (IMAGE_TAG for pinning); tor-proxy stays local alpine build
- install.sh: pull from registry instead of local docker build (no native compilation on weak hardware); interactive .env setup preserved
- new buildx runner gitea-host-buildx (label buildx) on x86_64 host
- REGISTRY_TOKEN replaced with package-scoped token (write:package)
- README/VERSION/.env.example updated
This commit is contained in:
NW
2026-08-11 10:37:09 +01:00
parent 33ec420fc0
commit 5c7bc242c5
6 changed files with 272 additions and 85 deletions

View File

@@ -1,70 +1,96 @@
name: "Release: ARM64 Docker Image"
name: "Release: multi-arch Docker images"
on:
push:
tags:
- "v*"
workflow_dispatch:
inputs:
version:
description: "Version tag (without v prefix)"
required: false
default: ""
jobs:
build-arm64:
# Нативный ARM64 runner на Orange Pi Zero 2 (aarch64).
# GitHub недоступен в этой сети — НЕ используем actions/*, только чистые run: шаги.
# node:22-alpine не содержит bash → используем sh
runs-on: arm64
build-push:
# Buildx runner на x86_64 хосте (docker:27.5-cli + host docker.sock).
# Собирает linux/amd64 + linux/arm64 одним buildx build (qemu из коробки)
# и пушит оба образа (бот + Next.js админка) в Gitea Container Registry.
runs-on: buildx
defaults:
run:
shell: sh
env:
REGISTRY: git.softuniq.eu
REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }}
VERSION: ""
steps:
- name: Checkout code
run: |
set -e
apk add --no-cache git >/dev/null 2>&1 || true
apk add --no-cache git curl >/dev/null 2>&1 || true
if [ -n "${GITHUB_REF_NAME}" ] && [ "${GITHUB_REF_NAME}" != "main" ]; then
# Запуск по тегу: clone конкретного тега
REF=${GITHUB_REF_NAME}
elif [ -n "${{ github.event.inputs.version }}" ]; then
REF=v${{ github.event.inputs.version }}
else
REF=${GITHUB_REF_NAME}
fi
echo "REF=${REF}"
cd /tmp
rm -rf release-src
git clone --depth 1 --branch "${GITHUB_REF_NAME}" \
"https://oauth2:${REGISTRY_TOKEN}@git.softuniq.eu/Telegram-Market/telegram-shop.git" release-src
git clone --depth 1 --branch "${REF}" \
"https://oauth2:${REGISTRY_TOKEN}@${REGISTRY}/Telegram-Market/telegram-shop.git" release-src
cd release-src
git rev-parse --short HEAD
- name: Extract version
run: |
VERSION=${GITHUB_REF_NAME#v}
echo "VERSION=${VERSION}" >> "$GITHUB_ENV"
echo "Build version: ${VERSION}"
if [ -n "${{ github.event.inputs.version }}" ]; then
V=${{ github.event.inputs.version }}
else
V=${GITHUB_REF_NAME#v}
fi
echo "VERSION=${V}" >> "$GITHUB_ENV"
echo "Build version: ${V}"
- name: Build ARM64 image
- name: Login to Gitea Container Registry
run: |
apk add --no-cache docker-cli >/dev/null 2>&1 || true
echo "${REGISTRY_TOKEN}" | docker login ${REGISTRY} -u oauth2 --password-stdin
- name: Build and push bot image (amd64 + arm64)
working-directory: /tmp/release-src
run: |
set -e
# docker-cli не входит в node:22-alpine — ставим через apk
apk add --no-cache docker-cli >/dev/null 2>&1
docker build \
docker buildx build \
--platform linux/amd64,linux/arm64 \
--file ./Dockerfile \
--tag git.softuniq.eu/telegram-market/telegram-shop:${VERSION} \
--tag git.softuniq.eu/telegram-market/telegram-shop:latest \
--tag ${REGISTRY}/telegram-market/telegram-shop:${VERSION} \
--tag ${REGISTRY}/telegram-market/telegram-shop:latest \
--push \
.
- name: Push to Gitea Container Registry (best effort)
- name: Build and push admin image (amd64 + arm64)
working-directory: /tmp/release-src
run: |
set -e
apk add --no-cache docker-cli >/dev/null 2>&1 || true
echo "${REGISTRY_TOKEN}" | docker login git.softuniq.eu -u oauth2 --password-stdin \
|| { echo "registry login failed, skipping push"; exit 0; }
docker push git.softuniq.eu/telegram-market/telegram-shop:${VERSION} \
|| echo "push tag failed (may need package scope)"
docker push git.softuniq.eu/telegram-market/telegram-shop:latest \
|| echo "push latest failed (may need package scope)"
docker logout git.softuniq.eu || true
docker buildx build \
--platform linux/amd64,linux/arm64 \
--file ./admin-next/Dockerfile \
--tag ${REGISTRY}/telegram-market/telegram-shop-admin:${VERSION} \
--tag ${REGISTRY}/telegram-market/telegram-shop-admin:latest \
--push \
./admin-next
- name: Save image tarball artifact
working-directory: /tmp/release-src
- name: Verify pushed manifests
run: |
set -e
apk add --no-cache docker-cli >/dev/null 2>&1 || true
mkdir -p /tmp/release-artifacts
docker save git.softuniq.eu/telegram-market/telegram-shop:${VERSION} \
-o /tmp/release-artifacts/telegram-shop-arm64-${VERSION}.tar
ls -lah /tmp/release-artifacts/
echo "${REGISTRY_TOKEN}" | docker login ${REGISTRY} -u oauth2 --password-stdin >/dev/null 2>&1 || true
docker buildx imagetools inspect ${REGISTRY}/telegram-market/telegram-shop:${VERSION} \
| grep -E "Platform|Digest" | head -4
docker buildx imagetools inspect ${REGISTRY}/telegram-market/telegram-shop-admin:${VERSION} \
| grep -E "Platform|Digest" | head -4
docker logout ${REGISTRY} || true