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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user