# ───────────────────────────────────────────────────────────────────────────── # 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/intradbot # 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}" 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}" # всегда — нужно для отката 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/intrabot:/deploy commands: - | set -e cd /deploy # Сохраняем ID текущего контейнерного образа (для отката) CONTAINER=$(docker compose ps -q intrabot 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