fix2
This commit is contained in:
parent
299f69abd5
commit
2cb2b3f53e
4 changed files with 41 additions and 32 deletions
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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++
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
||||||
Loading…
Add table
Reference in a new issue