Anton Malykhin commited on
Commit ·
2526f60
1
Parent(s): f74d713
ci: add Hugging Face Space deployment pipeline
Browse filesAdd GitLab CI validation and production deploy flow for the private Hugging Face Docker Space.
- run pnpm check and build in the validate stage
- deploy prod branch commits to the Hugging Face Space repository
- document required Space settings, runtime secrets, CI variables and local Docker smoke test
- .gitlab-ci.yml +39 -0
- docs/huggingface-space-deploy.md +134 -0
.gitlab-ci.yml
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
stages:
|
| 2 |
+
- validate
|
| 3 |
+
- deploy
|
| 4 |
+
|
| 5 |
+
default:
|
| 6 |
+
interruptible: true
|
| 7 |
+
|
| 8 |
+
validate:
|
| 9 |
+
stage: validate
|
| 10 |
+
image: node:24-alpine
|
| 11 |
+
cache:
|
| 12 |
+
key:
|
| 13 |
+
files:
|
| 14 |
+
- pnpm-lock.yaml
|
| 15 |
+
paths:
|
| 16 |
+
- .pnpm-store/
|
| 17 |
+
before_script:
|
| 18 |
+
- corepack enable
|
| 19 |
+
- pnpm config set store-dir .pnpm-store
|
| 20 |
+
- pnpm install --frozen-lockfile
|
| 21 |
+
script:
|
| 22 |
+
- pnpm check
|
| 23 |
+
- pnpm build
|
| 24 |
+
|
| 25 |
+
deploy:huggingface:
|
| 26 |
+
stage: deploy
|
| 27 |
+
image: alpine:3.20
|
| 28 |
+
needs:
|
| 29 |
+
- validate
|
| 30 |
+
rules:
|
| 31 |
+
- if: '$CI_COMMIT_BRANCH == "prod"'
|
| 32 |
+
- when: never
|
| 33 |
+
before_script:
|
| 34 |
+
- apk add --no-cache ca-certificates git
|
| 35 |
+
- git config --global user.email "${GITLAB_USER_EMAIL:-ci@hivetrace.local}"
|
| 36 |
+
- git config --global user.name "${GITLAB_USER_NAME:-GitLab CI}"
|
| 37 |
+
script:
|
| 38 |
+
- git remote add huggingface "https://${HF_USERNAME}:${HF_SPACE_TOKEN}@huggingface.co/spaces/${HF_SPACE_REPO}"
|
| 39 |
+
- git push huggingface "HEAD:main" --force
|
docs/huggingface-space-deploy.md
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Hugging Face Space deploy
|
| 2 |
+
|
| 3 |
+
Целевая схема:
|
| 4 |
+
|
| 5 |
+
```text
|
| 6 |
+
Corporate GitLab repository
|
| 7 |
+
↓ GitLab CI
|
| 8 |
+
Private Hugging Face Docker Space
|
| 9 |
+
↓ CPU Basic / Free
|
| 10 |
+
HiveTrace Leaderboard
|
| 11 |
+
```
|
| 12 |
+
|
| 13 |
+
## Hugging Face Space
|
| 14 |
+
|
| 15 |
+
Space создается вручную один раз.
|
| 16 |
+
|
| 17 |
+
Рекомендуемые настройки:
|
| 18 |
+
|
| 19 |
+
- Visibility: `Private`
|
| 20 |
+
- SDK: `Docker`
|
| 21 |
+
- Hardware: `CPU Basic` / free
|
| 22 |
+
- App port: `5173`
|
| 23 |
+
|
| 24 |
+
В `README.md` проекта уже есть Space frontmatter:
|
| 25 |
+
|
| 26 |
+
```yaml
|
| 27 |
+
---
|
| 28 |
+
title: HiveTrace Leaderboard
|
| 29 |
+
emoji: 🛡️
|
| 30 |
+
colorFrom: green
|
| 31 |
+
colorTo: indigo
|
| 32 |
+
sdk: docker
|
| 33 |
+
app_port: 5173
|
| 34 |
+
pinned: true
|
| 35 |
+
---
|
| 36 |
+
```
|
| 37 |
+
|
| 38 |
+
## Runtime secrets and variables in Hugging Face
|
| 39 |
+
|
| 40 |
+
В Space Settings нужно добавить runtime secret:
|
| 41 |
+
|
| 42 |
+
```text
|
| 43 |
+
HF_TOKEN=hf_...
|
| 44 |
+
```
|
| 45 |
+
|
| 46 |
+
Этот токен нужен приложению для чтения приватного Hugging Face bucket. Его нельзя делать
|
| 47 |
+
`PUBLIC_*` переменной и нельзя коммитить в репозиторий.
|
| 48 |
+
|
| 49 |
+
Variables:
|
| 50 |
+
|
| 51 |
+
```text
|
| 52 |
+
HF_BUCKET_ID=hivetrace/leaderboard_frontend_v2
|
| 53 |
+
HF_BUCKET_PREFIX=latest
|
| 54 |
+
HF_BUCKET_CACHE_TTL_MS=300000
|
| 55 |
+
HF_BUCKET_REQUEST_TIMEOUT_MS=10000
|
| 56 |
+
```
|
| 57 |
+
|
| 58 |
+
Опционально:
|
| 59 |
+
|
| 60 |
+
```text
|
| 61 |
+
HF_BUCKET_ENDPOINT=https://huggingface.co
|
| 62 |
+
```
|
| 63 |
+
|
| 64 |
+
## GitLab CI variables
|
| 65 |
+
|
| 66 |
+
В корпоративном GitLab нужно добавить CI/CD variables:
|
| 67 |
+
|
| 68 |
+
```text
|
| 69 |
+
HF_USERNAME=<huggingface-user-or-service-account-name>
|
| 70 |
+
HF_SPACE_TOKEN=<huggingface-write-token-for-space-repo>
|
| 71 |
+
HF_SPACE_REPO=<namespace>/<space-name>
|
| 72 |
+
```
|
| 73 |
+
|
| 74 |
+
Пример:
|
| 75 |
+
|
| 76 |
+
```text
|
| 77 |
+
HF_SPACE_REPO=hivetrace/guard-leaderboard
|
| 78 |
+
```
|
| 79 |
+
|
| 80 |
+
`HF_SPACE_TOKEN` должен иметь право записи в Space repository.
|
| 81 |
+
|
| 82 |
+
Важно: `HF_SPACE_TOKEN` и runtime `HF_TOKEN` для чтения bucket лучше держать разными
|
| 83 |
+
токенами.
|
| 84 |
+
|
| 85 |
+
`HF_SPACE_TOKEN` в GitLab лучше пометить как masked/protected variable.
|
| 86 |
+
|
| 87 |
+
## Deploy flow
|
| 88 |
+
|
| 89 |
+
`.gitlab-ci.yml` делает два этапа:
|
| 90 |
+
|
| 91 |
+
1. `validate`
|
| 92 |
+
- `pnpm install --frozen-lockfile`
|
| 93 |
+
- `pnpm check`
|
| 94 |
+
- `pnpm build`
|
| 95 |
+
|
| 96 |
+
2. `deploy:huggingface`
|
| 97 |
+
- срабатывает только на ветке `prod`
|
| 98 |
+
- пушит текущий commit в private Hugging Face Space repository
|
| 99 |
+
- использует force push, потому что Hugging Face Space является deploy-репозиторием
|
| 100 |
+
- Space автоматически пересобирает Docker image после push
|
| 101 |
+
|
| 102 |
+
## Production branch
|
| 103 |
+
|
| 104 |
+
Продакшн-деплой запускается только из ветки `prod`.
|
| 105 |
+
|
| 106 |
+
Типовой flow:
|
| 107 |
+
|
| 108 |
+
```bash
|
| 109 |
+
git checkout prod
|
| 110 |
+
git merge main
|
| 111 |
+
git push origin prod
|
| 112 |
+
```
|
| 113 |
+
|
| 114 |
+
После push в `prod` GitLab CI выполнит validate-этап и затем отправит этот commit в
|
| 115 |
+
ветку `main` Hugging Face Space repository.
|
| 116 |
+
|
| 117 |
+
## Local Docker smoke test
|
| 118 |
+
|
| 119 |
+
Перед первым deploy желательно локально проверить Docker image:
|
| 120 |
+
|
| 121 |
+
```bash
|
| 122 |
+
docker build -t hivetrace-leaderboard .
|
| 123 |
+
docker run --rm -p 5173:5173 \
|
| 124 |
+
-e HF_TOKEN=hf_... \
|
| 125 |
+
-e HF_BUCKET_ID=hivetrace/leaderboard_frontend_v2 \
|
| 126 |
+
-e HF_BUCKET_PREFIX=latest \
|
| 127 |
+
hivetrace-leaderboard
|
| 128 |
+
```
|
| 129 |
+
|
| 130 |
+
После запуска открыть:
|
| 131 |
+
|
| 132 |
+
```text
|
| 133 |
+
http://127.0.0.1:5173/
|
| 134 |
+
```
|