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

Приложение обновляется само после push в приватный репозиторий

Выкатка Node.js, Python, Go или Docker-приложения из GitHub Actions, GitLab CI, Gitea или Forgejo — без открытого доступа к репозиторию и без своего сервера.

Чтобы выкатить приложение из приватного репозитория, платформе обычно дают доступ к репозиторию. Здесь он не нужен: код уже лежит в раннере CI, и задание само отправляет его нам архивом.

Решение — задание CI, которое на каждый push в main вызывает webshield apps deploy с токеном, умеющим выкатывать только один проект.

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

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

Токен умеет только выкатывать приложения этого проекта и смотреть их статус и журнал. Переменные, домены, другие проекты и всё остальное в аккаунте ему недоступны. Отозвать его можно там же.

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

  • GitHub, Gitea, Forgejo: Settings → Secrets → Actions → New secret.
  • GitLab: Settings → CI/CD → Variables, с галочками Masked и Protected.

Файл webshield.toml в корне репозитория:

[app]
project = "shop"
name = "web"

Если в репозитории есть то, что не нужно для сборки (node_modules, результаты сборки, тестовые данные), исключите это в .gitignore или .webshieldignore — архив будет меньше, выкатка быстрее. Предел — 100 МБ.

GitHub Actions, Gitea, Forgejo:

# .github/workflows/deploy.yml (в Gitea и Forgejo — .gitea/workflows/ или .forgejo/workflows/)
name: Deploy app
on:
push:
branches: [main]
# Несколько push подряд — выкатывается последний.
concurrency:
group: deploy-app
cancel-in-progress: true
jobs:
deploy:
runs-on: ubuntu-latest
env:
WS_TOKEN: ${{ secrets.WS_TOKEN }}
steps:
- uses: actions/checkout@v5
- name: Установка CLI
run: curl -fsSL https://raw.githubusercontent.com/webshieldpro/webshield-cli/main/install.sh | sh
- name: Выкатка
run: ~/.local/bin/webshield apps deploy

GitLab CI:

.gitlab-ci.yml
deploy:
image: debian:stable-slim
rules:
- if: $CI_COMMIT_BRANCH == "main"
interruptible: true
script:
- apt-get update -qq && apt-get install -yqq curl ca-certificates
- curl -fsSL https://raw.githubusercontent.com/webshieldpro/webshield-cli/main/install.sh | sh
- ~/.local/bin/webshield apps deploy

Собирать код в CI не нужно: сборка идёт у нас, по Dockerfile или по стеку проекта.

Сделайте push. В журнале задания будут строки статус: building, статус: deploying и выкатка #N работает. Откройте адрес приложения — на нём свежая версия.

Симптом Причина и решение
приложение … не найдено Имена в webshield.toml не совпадают с кабинетом, или токен выпущен для другого проекта.
403 при выкатке Токен отозван или выпущен не как токен для CI. Выпустите новый и обновите секрет.
архив больше 100 МБ В архив попали зависимости или результаты сборки — добавьте их в .gitignore или .webshieldignore.
Задание упало с журналом сборки Ошибка в сборке приложения: журнал в выводе задания и в кабинете (Журнал сборки). Прежняя версия при этом работает.
Another deployment of this service is in progress Предыдущая выкатка ещё идёт. concurrency в задании выше снимает эту гонку.