# ───────────────────────────────────────────────────────────────────────────── # 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_cache # значение: 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 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_cache # значение: 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/intradesk-monitor:/deploy commands: - | set -e 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) if [ -n "$CONTAINER" ]; then OLD_IMAGE=$(docker inspect --format='{{.Image}}' "$CONTAINER") printf '%s' "$OLD_IMAGE" > .previous_image echo "Snapshot for rollback: $OLD_IMAGE" 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