106 lines
4.6 KiB
YAML
106 lines
4.6 KiB
YAML
# ─────────────────────────────────────────────────────────────────────────────
|
||
# Woodpecker CI Pipeline
|
||
#
|
||
# Шаги:
|
||
# 1. docker-build — сборка и пуш образа (push в main)
|
||
# 2. docker-build-tag — сборка и пуш образа с semver-тегом (git tag v*)
|
||
# 3. deploy — деплой на сервер (выполняется на агенте role=work_woodpecker)
|
||
#
|
||
# Секреты (Settings → Secrets репозитория):
|
||
# forgejo_host — хост реестра, например git.example.com
|
||
# forgejo_image — полный путь образа, например git.example.com/user/intradesk-monitor
|
||
# forgejo_username — логин (обычно = gitea.actor)
|
||
# forgejo_token — токен с правом package:write
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
|
||
steps:
|
||
|
||
# ── 1а. Сборка при push в main ─────────────────────────────────────────────
|
||
- name: docker-build
|
||
image: woodpeckerci/plugin-docker-buildx
|
||
settings:
|
||
registry:
|
||
from_secret: forgejo_host
|
||
repo:
|
||
from_secret: forgejo_image
|
||
username:
|
||
from_secret: forgejo_username
|
||
password:
|
||
from_secret: forgejo_token
|
||
tags:
|
||
- latest
|
||
- "sha-${CI_COMMIT_SHA:0:8}"
|
||
cache_from:
|
||
from_secret: forgejo_image # значение: git.example.com/user/intradesk-monitor:latest
|
||
build_args:
|
||
- "GIT_COMMIT=${CI_COMMIT_SHA:0:8}"
|
||
- "BUILDKIT_INLINE_CACHE=1"
|
||
when:
|
||
- event: push
|
||
branch: main
|
||
|
||
# ── 1б. Сборка при git tag v* (semver) ────────────────────────────────────
|
||
- name: docker-build-tag
|
||
image: woodpeckerci/plugin-docker-buildx
|
||
settings:
|
||
registry:
|
||
from_secret: forgejo_host
|
||
repo:
|
||
from_secret: forgejo_image_2
|
||
username:
|
||
from_secret: forgejo_username
|
||
password:
|
||
from_secret: forgejo_token
|
||
tags:
|
||
- "${CI_COMMIT_TAG}" # v1.2.3
|
||
- latest
|
||
- "sha-${CI_COMMIT_SHA:0:8}" # всегда — нужно для отката
|
||
cache_from:
|
||
from_secret: forgejo_image # значение: git.example.com/user/intradesk-monitor:latest
|
||
build_args:
|
||
- "GIT_COMMIT=${CI_COMMIT_SHA:0:8}"
|
||
- "BUILDKIT_INLINE_CACHE=1"
|
||
when:
|
||
- event: tag
|
||
|
||
# ── 2. Деплой на продакшн-сервер ──────────────────────────────────────────
|
||
# Выполняется на Woodpecker-агенте с меткой role=work_woodpecker.
|
||
# Требует: репозиторий помечен «trusted» в настройках Woodpecker-сервера
|
||
# (иначе монтирование volumes запрещено).
|
||
- name: deploy
|
||
image: docker:cli
|
||
volumes:
|
||
- /var/run/docker.sock:/var/run/docker.sock
|
||
- /opt/intra_monitor:/deploy
|
||
commands:
|
||
- |
|
||
set -e
|
||
cd /deploy
|
||
|
||
# Проверяем наличие .env на сервере
|
||
test -f .env || (echo "Missing /opt/intra_monitor/.env on deploy host" && exit 1)
|
||
|
||
# Сохраняем ID текущего образа (для отката)
|
||
CONTAINER=$(docker compose ps -q intradesk-monitor 2>/dev/null | head -1)
|
||
if [ -n "$CONTAINER" ]; then
|
||
OLD_IMAGE=$(docker inspect --format='{{.Image}}' "$CONTAINER")
|
||
printf '%s' "$OLD_IMAGE" > .previous_image
|
||
echo "Snapshot for rollback: $OLD_IMAGE"
|
||
fi
|
||
|
||
# Удаляем legacy-контейнер со статичным именем, чтобы избежать name conflict
|
||
if docker ps -a --format '{{.Names}}' | grep -Eq '^intradesk-monitor$'; then
|
||
docker rm -f intradesk-monitor || true
|
||
fi
|
||
|
||
# Обновляем образ и перезапускаем
|
||
docker compose pull
|
||
docker compose up -d --remove-orphans
|
||
|
||
echo "Deployed: ${CI_COMMIT_SHA:0:8} (${CI_COMMIT_MESSAGE})"
|
||
labels:
|
||
role: work_woodpecker
|
||
when:
|
||
- event: push
|
||
branch: main
|
||
- event: tag
|