This commit is contained in:
dv 2026-03-18 14:41:05 +03:00
parent 299f69abd5
commit 2cb2b3f53e
4 changed files with 41 additions and 32 deletions

View file

@ -2,18 +2,20 @@
# Woodpecker CI Pipeline # Woodpecker CI Pipeline
# #
# Шаги: # Шаги:
# 1. docker-build — сборка и push образа при push в main # 1. docker-build — сборка и пуш образа (push в main)
# 2. docker-build-tag — сборка и push образа при git tag # 2. docker-build-tag — сборка и пуш образа с semver-тегом (git tag v*)
# 3. deploy — деплой на сервер на агенте role=work_woodpecker # 3. deploy — деплой на сервер (выполняется на агенте role=work_woodpecker)
# #
# Секреты (Settings -> Secrets): # Секреты (Settings → Secrets репозитория):
# forgejo_host — хост registry # forgejo_host — хост реестра, например git.example.com
# forgejo_image — полный путь образа # forgejo_image — полный путь образа, например git.example.com/user/intradesk-monitor
# forgejo_username — пользователь registry # forgejo_username — логин (обычно = gitea.actor)
# forgejo_token — токен для push # forgejo_token — токен с правом package:write
# ───────────────────────────────────────────────────────────────────────────── # ─────────────────────────────────────────────────────────────────────────────
steps: steps:
# ── 1а. Сборка при push в main ─────────────────────────────────────────────
- name: docker-build - name: docker-build
image: woodpeckerci/plugin-docker-buildx image: woodpeckerci/plugin-docker-buildx
settings: settings:
@ -28,12 +30,16 @@ steps:
tags: tags:
- latest - latest
- "sha-${CI_COMMIT_SHA:0:8}" - "sha-${CI_COMMIT_SHA:0:8}"
cache_from:
from_secret: forgejo_image_cache # значение: git.example.com/user/intradesk-monitor:latest
build_args: build_args:
- "GIT_COMMIT=${CI_COMMIT_SHA:0:8}"
- "BUILDKIT_INLINE_CACHE=1" - "BUILDKIT_INLINE_CACHE=1"
when: when:
- event: push - event: push
branch: main branch: main
# ── 1б. Сборка при git tag v* (semver) ────────────────────────────────────
- name: docker-build-tag - name: docker-build-tag
image: woodpeckerci/plugin-docker-buildx image: woodpeckerci/plugin-docker-buildx
settings: settings:
@ -46,14 +52,21 @@ steps:
password: password:
from_secret: forgejo_token from_secret: forgejo_token
tags: tags:
- "${CI_COMMIT_TAG}" - "${CI_COMMIT_TAG}" # v1.2.3
- latest - latest
- "sha-${CI_COMMIT_SHA:0:8}" - "sha-${CI_COMMIT_SHA:0:8}" # всегда — нужно для отката
cache_from:
from_secret: forgejo_image_cache # значение: git.example.com/user/intradesk-monitor:latest
build_args: build_args:
- "GIT_COMMIT=${CI_COMMIT_SHA:0:8}"
- "BUILDKIT_INLINE_CACHE=1" - "BUILDKIT_INLINE_CACHE=1"
when: when:
- event: tag - event: tag
# ── 2. Деплой на продакшн-сервер ──────────────────────────────────────────
# Выполняется на Woodpecker-агенте с меткой role=work_woodpecker.
# Требует: репозиторий помечен «trusted» в настройках Woodpecker-сервера
# (иначе монтирование volumes запрещено).
- name: deploy - name: deploy
image: docker:cli image: docker:cli
volumes: volumes:
@ -62,12 +75,12 @@ steps:
commands: commands:
- | - |
set -e set -e
cp docker-compose.deploy.yml /deploy/docker-compose.yml
test -f /deploy/.env || (echo "Missing /opt/intradesk-monitor/.env on deploy host" && exit 1)
cd /deploy cd /deploy
# Проверяем наличие .env на сервере
test -f .env || (echo "Missing /opt/intradesk-monitor/.env on deploy host" && exit 1)
# Сохраняем ID текущего образа (для отката)
CONTAINER=$(docker compose ps -q intradesk-monitor 2>/dev/null | head -1) CONTAINER=$(docker compose ps -q intradesk-monitor 2>/dev/null | head -1)
if [ -n "$CONTAINER" ]; then if [ -n "$CONTAINER" ]; then
OLD_IMAGE=$(docker inspect --format='{{.Image}}' "$CONTAINER") OLD_IMAGE=$(docker inspect --format='{{.Image}}' "$CONTAINER")
@ -75,6 +88,7 @@ steps:
echo "Snapshot for rollback: $OLD_IMAGE" echo "Snapshot for rollback: $OLD_IMAGE"
fi fi
# Обновляем образ и перезапускаем
docker compose pull docker compose pull
docker compose up -d --remove-orphans docker compose up -d --remove-orphans
@ -84,4 +98,4 @@ steps:
when: when:
- event: push - event: push
branch: main branch: main
- event: tag - event: tag

View file

@ -6,6 +6,10 @@ ENV NODE_ENV=production
ENV LANG=C.UTF-8 ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8 ENV LC_ALL=C.UTF-8
# Build-аргумент для трассировки коммита (используется при сборке образа)
ARG GIT_COMMIT=unknown
ENV GIT_COMMIT=${GIT_COMMIT}
# Зависимости для better-sqlite3 (нужна компиляция) # Зависимости для better-sqlite3 (нужна компиляция)
RUN apk add --no-cache python3 make g++ RUN apk add --no-cache python3 make g++
@ -27,4 +31,4 @@ ENV DB_PATH=/data/intradesk.db
HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \
CMD node -e "const http=require('http');const req=http.get('http://127.0.0.1:3000/healthz',res=>process.exit(res.statusCode===200?0:1));req.on('error',()=>process.exit(1));" CMD node -e "const http=require('http');const req=http.get('http://127.0.0.1:3000/healthz',res=>process.exit(res.statusCode===200?0:1));req.on('error',()=>process.exit(1));"
CMD ["node", "server.js"] CMD ["node", "server.js"]

View file

@ -1,14 +0,0 @@
services:
intradesk-monitor:
image: ${IMAGE_NAME}:latest
container_name: intradesk-monitor
restart: always
env_file: .env
ports:
- "${APP_PORT:-3000}:3000"
volumes:
- ./data:/data
environment:
NODE_ENV: production
PORT: 3000
DB_PATH: /data/intradesk.db

View file

@ -1,8 +1,7 @@
services: services:
intradesk-monitor: intradesk-monitor:
image: ${IMAGE_NAME}:latest
container_name: intradesk-monitor container_name: intradesk-monitor
build:
context: .
restart: always restart: always
env_file: .env env_file: .env
ports: ports:
@ -13,3 +12,9 @@ services:
NODE_ENV: production NODE_ENV: production
PORT: 3000 PORT: 3000
DB_PATH: /data/intradesk.db DB_PATH: /data/intradesk.db
healthcheck:
test: ["CMD", "node", "-e", "const http=require('http');const req=http.get('http://127.0.0.1:3000/healthz',res=>process.exit(res.statusCode===200?0:1));req.on('error',()=>process.exit(1));"]
interval: 30s
timeout: 5s
retries: 3
start_period: 15s