78 lines
3.3 KiB
YAML
78 lines
3.3 KiB
YAML
# CI/CD веба через Gitea Actions (встроенный в Gitea, раннер на сервере).
|
||
#
|
||
# push/PR: проверка синтаксиса JS + сборка прод-образа (локальные теги
|
||
# latest и короткий SHA, реестр не используется).
|
||
# Деплой — ТОЛЬКО ручной запуск workflow (кнопка Run workflow): job скачивает
|
||
# compose-файлы репо бэкенда по API (секреты CI_HOST/CI_USER/
|
||
# CI_TOKEN) и перезапускает web-сервис стека свежим образом.
|
||
#
|
||
# Требования к раннеру (см. README бэкенда, раздел «CI/CD (Gitea Actions)»):
|
||
# runner.labels: должна покрывать runs-on ниже (ubuntu-latest);
|
||
# container.valid_volumes: /var/run/docker.sock, /opt/building-mgmt —
|
||
# сокет docker для сборки/деплоя и каталог стека с .env.
|
||
name: web
|
||
|
||
on:
|
||
push:
|
||
branches: [main]
|
||
pull_request:
|
||
workflow_dispatch:
|
||
|
||
jobs:
|
||
check:
|
||
runs-on: ubuntu-latest
|
||
container: node:20-alpine
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- name: Синтаксис JS
|
||
run: |
|
||
node --check js/api.js
|
||
node --check js/app.js
|
||
|
||
build-web:
|
||
runs-on: ubuntu-latest
|
||
container: docker:27-cli
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- name: Сборка прод-образа
|
||
run: |
|
||
short="$(echo "$GITHUB_SHA" | cut -c1-7)"
|
||
docker build -t building-mgmt-web:latest -t "building-mgmt-web:${short}" .
|
||
|
||
deploy:
|
||
if: github.event_name == 'workflow_dispatch'
|
||
needs: build-web
|
||
runs-on: ubuntu-latest
|
||
container:
|
||
image: docker:27-cli
|
||
volumes:
|
||
# Тома объявляем явно: valid_volumes у раннера — только белый
|
||
# список, без заявки внутри джобы в контейнере не попадут ни
|
||
# сокет docker, ни постоянный .env стека (/opt/building-mgmt).
|
||
- /var/run/docker.sock:/var/run/docker.sock
|
||
- /opt/building-mgmt:/opt/building-mgmt
|
||
env:
|
||
GITEA_HOST: ${{ secrets.CI_HOST }}
|
||
GITEA_USER: ${{ secrets.CI_USER }}
|
||
GITEA_TOKEN: ${{ secrets.CI_TOKEN }}
|
||
steps:
|
||
- name: Compose-файлы бэкенда (compose.prod.yaml)
|
||
run: |
|
||
# compose-CLI и утилиты в джоб-контейнере; docker — через
|
||
# смонтированный сокет хоста (valid_volumes у раннера).
|
||
apk add --no-cache docker-cli-compose
|
||
auth="$(printf '%s:%s' "$GITEA_USER" "$GITEA_TOKEN" | base64 | tr -d '\n')"
|
||
wget -q -O /tmp/axe.tar.gz \
|
||
--header="Authorization: Basic ${auth}" \
|
||
"http://${GITEA_HOST}/api/v1/repos/edadmin/axe/tarball/main"
|
||
mkdir -p /opt/building-mgmt
|
||
tar -xzf /tmp/axe.tar.gz -C /tmp
|
||
cp /tmp/axe-*/compose.prod.yaml /opt/building-mgmt/
|
||
- name: Перезапуск web-сервиса стека
|
||
# --no-deps: трогаем только web, api/db/minio не пересоздаются.
|
||
run: |
|
||
docker compose -p building-mgmt \
|
||
--env-file /opt/building-mgmt/.env \
|
||
-f /opt/building-mgmt/compose.prod.yaml \
|
||
up -d --no-deps web
|