Anton Malykhin commited on
Commit
2526f60
·
1 Parent(s): f74d713

ci: add Hugging Face Space deployment pipeline

Browse files

Add 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

Files changed (2) hide show
  1. .gitlab-ci.yml +39 -0
  2. 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
+ ```