Перейти к содержимому
WebShield Docs

Сайт обновляется сам после git push

При ручной сборке и заливке сайта на Hugo, Astro или другом генераторе на сайте может оказаться не та версия. Как публиковать его автоматически из GitHub Actions, GitLab CI, Gitea или Forgejo.

При ручной сборке и заливке сайта на генераторе правки копятся, и на сайте может оказаться сборка, которой нет в репозитории.

Решение — публиковать из CI: что в основной ветке, то и на сайте. Для этого есть токен, который умеет только публиковать один сайт.

Что получится: каждый push в main попадает на сайт, как только завершится задание CI; ручных заливок больше нет. Понадобится: созданный сайт у нас, репозиторий на GitHub, GitLab, Gitea или Forgejo и работающая команда сборки. Время: 10 минут.

В кабинете откройте сайт кнопкой Управление, блок Токены публикации (CI) → Создать токен. Скопируйте его сразу: полностью он показывается один раз.

Токен умеет только загружать файлы и публиковать этот сайт. Настройки сайта, домен, DNS и другие сайты ему недоступны, так что утечка из CI обойдётся дёшево — и отозвать его можно там же одной кнопкой.

Имя — WS_TOKEN: так его найдёт CLI без дополнительных флагов.

  • GitHub, Gitea, Forgejo: Settings → Secrets → Actions → New secret.
  • GitLab: Settings → CI/CD → Variables, с галочками Masked и Protected. Первая не пустит токен в лог задания, вторая — в сборки чужих веток.

Токен не должен попасть в сам репозиторий, даже в приватный.

GitHub Actions, Gitea, Forgejo — синтаксис общий:

# .github/workflows/deploy.yml (в Gitea и Forgejo — .gitea/workflows/ или .forgejo/workflows/)
name: Deploy site
on:
push:
branches: [main]
# Несколько push подряд — публикует последний, остальные отменяются.
concurrency:
group: deploy-site
cancel-in-progress: true
jobs:
deploy:
runs-on: ubuntu-latest
env:
WS_TOKEN: ${{ secrets.WS_TOKEN }}
steps:
- uses: actions/checkout@v5
- run: npm ci && npm run build # ваша сборка → ./dist
- name: Установка CLI
run: curl -fsSL https://raw.githubusercontent.com/webshieldpro/webshield-cli/main/install.sh | sh
- name: Публикация
run: ~/.local/bin/webshield sites publish www.example.com --dir ./dist

GitLab CI:

.gitlab-ci.yml
deploy:
image: node:24
rules:
- if: $CI_COMMIT_BRANCH == "main"
interruptible: true
script:
- npm ci && npm run build # ваша сборка → ./dist
- curl -fsSL https://raw.githubusercontent.com/webshieldpro/webshield-cli/main/install.sh | sh
- ~/.local/bin/webshield sites publish www.example.com --dir ./dist

Подставьте свою команду сборки и папку результата. Для популярных генераторов они есть в таблице: Hugo кладёт сайт в public/, Astro — в dist/, MkDocs — в site/. Hugo собирается не через npm, а своей командой — замените строку сборки, например, на готовое действие peaceiris/actions-hugo и hugo --minify.

Перед первым настоящим запуском посмотрите план на своей машине:

Terminal window
WS_TOKEN=… webshield sites publish www.example.com --dir ./dist --dry-run

CLI посчитает, сколько файлов зальёт, сколько удалит и сколько оставит как есть, и ничего не тронет. Если к удалению — весь сайт, указана не та папка.

Затем сделайте push. В журнале задания будет та же сводка и строка об успешной публикации.

  • Загружается только разница. CLI сравнивает файлы с тем, что уже лежит у нас, и отправляет изменившиеся. Правка одной страницы — один файл, а не весь сайт.
  • Публикация атомарна. Посетитель видит либо прежнюю версию, либо новую целиком — никогда смесь из старого CSS и нового HTML.
  • Кеш сбрасывать не нужно. Каждая публикация — новая версия, и старый кеш к ней не относится.
  • Упавшая публикация не останется висеть. Если файлы залились, а публикация не прошла, следующий запуск это заметит и опубликует заново.
Terminal window
curl -sI https://www.example.com/ | head -1

Ответ HTTP/2 200, на сайте — свежая правка. Если её не видно, обновите страницу без кеша браузера (Ctrl+F5).

Симптом Причина и решение
Ошибка авторизации Секрет не передан в задание: проверьте env: WS_TOKEN, а в GitLab — что ветка защищённая, иначе Protected-переменная в неё не попадает.
Сайт не найден Токен выпущен для другого сайта или имя в команде опечатано. Токен публикации видит только свой сайт.
В сводке к удалению — весь сайт --dir указывает не на папку сборки, или сборка упала раньше и папка пуста.
Задание проходит, сайт не меняется Публикуется другой хост: сверьте имя в команде с именем сайта в кабинете.
Отклонены .exe, .apk и подобные Исполняемые файлы доступны только на коммерческих тарифах.