Files
slm-design/.gitea/workflows/ci.yml
S.Gromov 6c82d9d747
All checks were successful
CI/CD Pipeline / docs (push) Successful in 12s
CI/CD Pipeline / docker (push) Successful in 37s
CI/CD Pipeline / deploy (push) Successful in 6s
chore: генерация README_RU.md в CI с подстановкой URL тега
- concat-md.js: восстановлена генерация README_RU.md из index.md
- CI: подставляет URL с тегом в README_RU.md перед коммитом
- README_RU.md убран из .gitignore
2026-04-19 01:24:13 +03:00

165 lines
5.5 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: CI/CD Pipeline
on:
push:
branches: [main]
jobs:
docs:
runs-on: ubuntu-latest
if: "!contains(github.event.head_commit.message, '[skip ci]')"
outputs:
new_tag: ${{ steps.tag.outputs.new_tag }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 24
- name: Генерация ARCHITECTURE.md
run: |
npm ci
npm run docs
- name: Автоматический тег (semver patch)
id: tag
run: |
LAST_TAG=$(git tag -l 'v*' --sort=-v:refname | head -1)
if [ -z "$LAST_TAG" ]; then
NEW_TAG="v0.1.0"
else
MAJOR=$(echo "$LAST_TAG" | cut -d. -f1)
MINOR=$(echo "$LAST_TAG" | cut -d. -f2)
PATCH=$(echo "$LAST_TAG" | cut -d. -f3)
NEW_TAG="${MAJOR}.${MINOR}.$((PATCH + 1))"
fi
git tag "$NEW_TAG"
git push origin "$NEW_TAG"
echo "new_tag=$NEW_TAG" >> $GITHUB_OUTPUT
echo "Создан тег: $NEW_TAG"
- name: Подставить URL с тегом и коммит
run: |
NEW_TAG=${{ steps.tag.outputs.new_tag }}
sed -i "s|raw/branch/main/generated|raw/tag/${NEW_TAG}/generated|" README_RU.md
git config user.name "CI Bot"
git config user.email "ci@gromlab.ru"
git add generated/ README_RU.md
if git diff --cached --quiet; then
echo "Нет изменений, пропуск"
else
git commit -m "docs: обновить ARCHITECTURE.md и README (${NEW_TAG}) [skip ci]"
git push origin main
fi
docker:
runs-on: ubuntu-latest
needs: docs
if: "!contains(github.event.head_commit.message, '[skip ci]')"
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: main
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Setup variables
run: |
DOCKER_REGISTRY=$(echo "${{ gitea.server_url }}" | sed 's|https://||')
echo "DOCKER_REGISTRY=$DOCKER_REGISTRY" >> $GITHUB_ENV
REGISTRY_IMAGE="$DOCKER_REGISTRY/$(echo "${{ github.repository }}" | tr '[:upper:]' '[:lower:]')"
echo "REGISTRY_IMAGE=$REGISTRY_IMAGE" >> $GITHUB_ENV
- name: Login to Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.DOCKER_REGISTRY }}
username: ${{ secrets.CR_USER }}
password: ${{ secrets.CR_TOKEN }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY_IMAGE }}
tags: |
type=ref,event=branch
type=sha,prefix=
type=raw,value=latest,enable={{is_default_branch}}
type=raw,value=${{ needs.docs.outputs.new_tag }}
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
platforms: linux/amd64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
VERSION_TAG=${{ needs.docs.outputs.new_tag }}
provenance: false
sbom: false
deploy:
runs-on: ubuntu-latest
needs: docker
steps:
- name: Setup variables
run: |
DOCKER_REGISTRY=$(echo "${{ gitea.server_url }}" | sed 's|https://||')
echo "DOCKER_REGISTRY=$DOCKER_REGISTRY" >> $GITHUB_ENV
REGISTRY_IMAGE="$DOCKER_REGISTRY/$(echo "${{ github.repository }}" | tr '[:upper:]' '[:lower:]')"
echo "REGISTRY_IMAGE=$REGISTRY_IMAGE" >> $GITHUB_ENV
- name: Настройка SSH
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/deploy_key
chmod 600 ~/.ssh/deploy_key
ssh-keyscan -H 188.225.47.78 >> ~/.ssh/known_hosts
- name: Деплой
run: |
ssh -i ~/.ssh/deploy_key root@188.225.47.78 bash -s <<'SCRIPT'
set -e
IMAGE="${{ env.REGISTRY_IMAGE }}:latest"
CONTAINER="slm-design"
# Логин в реестр
echo '${{ secrets.CR_TOKEN }}' | docker login ${{ env.DOCKER_REGISTRY }} -u '${{ secrets.CR_USER }}' --password-stdin
# Сохранить ID текущего образа до pull
OLD_IMAGE_ID=$(docker images -q "$IMAGE" 2>/dev/null || true)
# Скачать новый образ
docker pull "$IMAGE"
# Перезапустить контейнер
docker stop "$CONTAINER" 2>/dev/null || true
docker rm "$CONTAINER" 2>/dev/null || true
docker run -d --name "$CONTAINER" --network web --restart unless-stopped "$IMAGE"
# Удалить старый образ если он отличается от нового
NEW_IMAGE_ID=$(docker images -q "$IMAGE")
if [ -n "$OLD_IMAGE_ID" ] && [ "$OLD_IMAGE_ID" != "$NEW_IMAGE_ID" ]; then
docker rmi "$OLD_IMAGE_ID" 2>/dev/null || true
fi
# Очистка
docker image prune -af --filter "label=org.opencontainers.image.title=$CONTAINER"
docker image prune -f
docker builder prune -f 2>/dev/null || true
# Статус
docker ps --filter "name=$CONTAINER"
SCRIPT