节点在线、应用在线、配置在线使用令牌查询
|
# GITEA-2 部署æ¥éª¤ï¼ˆåˆ†é˜¶æ®µè½å®žï¼‰
> 版本:v1.0 | 日期:2026-08-15 | å…³è”:[GITEA-1-方案规划](/NewLife/Stardust/Blob/master/Doc/GITEA-1-方案规划.md)
> 用法:按 G0→G5 顺åºè½å®žã€‚带 âš ï¸ çš„æ¥éª¤ä¾èµ– [GITEA-1](/NewLife/Stardust/Blob/master/Doc/GITEA-1-方案规划.md) §6 待确认项结果,确认åŽå†æ‰§è¡Œã€‚命令默认在 Git Bash ä¸è¿è¡Œï¼›æ•°æ®å·ç»Ÿä¸€åœ¨ `D:\ci\`(仓库外)。
---
## G0 准备 Docker è¿è¡Œæ—¶ï¼ˆå‰ç½®ï¼Œé˜»å¡žé¡¹ï¼‰
> âš ï¸ ä¾èµ– Q1(Rancher Desktop 切 dockerd / 装 Docker Desktopï¼‰ã€‚å½“å‰ daemon 未è¿è¡Œï¼Œå¿…须先行解决,å¦åˆ™åŽç»å…¨éƒ¨å¡ä½ã€‚
1. å¯ç”¨ Docker è¿è¡Œæ—¶å¹¶ç¡®è®¤å¯ç”¨ï¼š
```bash
docker version # 应能看到 Server ç‰ˆæœ¬ï¼Œè€Œéž npipe 报错
docker compose version # 已有 v5.3.1
```
2. å»ºæ•°æ®æ ¹ç›®å½•(仓库外,ä¸è¿› git):
```bash
mkdir -p /d/ci/gitea/data /d/ci/registry/data /d/ci/runner
```
---
## G0.5 获å–å¹¶å¯¼å…¥æ ¸å¿ƒé•œåƒï¼ˆtar 路线)
> âš ï¸ **镜åƒèŽ·å–背景(2026-08-15 实测)**:本机直连 Docker Hub / MCR / ghcr çš„é•œåƒ blob å‡è¢«ä¼ä¸šç½‘拦截(DNS 把 `docker.io` 劫æŒåˆ° Facebook 段 `31.13.94.49`ï¼Œä»…æ ¹è·¯å¾„é€šã€blob CDN 全拦);内网 `harbor.luxvisions-inno.com` è§£æžåˆ° `10.188.23.13` 但æœåŠ¡ä¸å¯è¾¾ï¼›æœ¬åœ° `127.0.0.1:10808` 代ç†å®žæµ‹ä¸å‡ºç½‘(实为 Rancher 内部 `rdx-proxy`)。已验è¯ï¼šé˜¿é‡Œäº‘ ACR / åŽä¸ºäº‘ SWR çš„ docker å议层å¯è¾¾ï¼ˆé•œåƒ blob 在自家 `*.aliyuncs.com` / `*.myhuaweicloud.com` 域å,被白å啿”¾è¡Œï¼Œä½†éœ€è´¦å·ç™»å½•)。**tar è·¯çº¿æ— éœ€ä»»ä½•äº‘è´¦å·ï¼Œæœ€ç¨³**,故采用。
> 已实测:本机 `docker load` 本地管线å¯ç”¨ï¼ˆä¸ä¾èµ–网络);本机已装 .NET SDK 10.0.302 / 8.0.418 / 7.0.410,故**构建阶段走宿主 dotnet,ä¸éœ€è¦ dotnet/sdk 容器镜åƒ**。
1. 在**能è”网的机器**(公å¸å†…别的机 / 家里 / 云æœåŠ¡å™¨ï¼Œéœ€è£… dockerï¼‰ç”Ÿæˆ tar:
```bash
docker pull gitea/gitea:1.23
docker pull gitea/act_runner:latest
docker pull registry:2
docker save -o gitea_stack.tar gitea/gitea:1.23 gitea/act_runner:latest registry:2
```
> 三个镜åƒåˆè®¡çº¦ 500MB+ï¼Œä¼ è¾“ç”¨ U 盘 / 内网共享 / 云盘ä¸è½¬å‡å¯ã€‚
2. 把 `gitea_stack.tar` ä¼ å›žæœ¬æœºï¼Œæ”¾åˆ° `D:\ci\images\`(新建该目录):
```bash
mkdir -p /d/ci/images
```
3. 本机导入(ä¸ä¾èµ–网络):
```bash
docker load -i /d/ci/images/gitea_stack.tar
docker images | grep -E "gitea|registry"
```
4. 验è¯ä¸‰é•œåƒé½ï¼š`gitea/gitea:1.23`ã€`gitea/act_runner:latest`ã€`registry:2`。
---
## G1 部署 Gitea
1. 写 `D:\ci\docker-compose.yml`(Gitea + registry åŒæ ˆï¼Œä¾¿äºŽç®¡ç†ï¼‰ï¼š
```yaml
services:
gitea:
image: gitea/gitea:1.23
container_name: gitea
environment:
- GITEA__database__DB_TYPE=sqlite3
- GITEA__server__ROOT_URL=http://localhost:3000/
- GITEA__actions__ENABLED=true
- GITEA__actions__DEFAULT_ACTIONS_URL=https://gitea.com
ports:
- "3000:3000"
- "222:22"
volumes:
- /d/ci/gitea/data:/data
restart: unless-stopped
registry:
image: registry:2
container_name: registry
environment:
- REGISTRY_AUTH=htpasswd # 本机验è¯å¯ä¸´æ—¶å…³é—ï¼Œè§ G2 注
- REGISTRY_AUTH_HTPASSWD_REALM=Registry
- REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
- REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/var/lib/registry
ports:
- "5000:5000"
volumes:
- /d/ci/registry/data:/var/lib/registry
restart: unless-stopped
```
> DB 默认 SQLite(Q2 选 Postgres 时改为 Postgres æœåŠ¡ï¼‰ã€‚Actions 已在 `GITEA__actions__ENABLED=true` å¼€å¯ã€‚
2. å¯åŠ¨ï¼š
```bash
cd /d/ci && docker compose up -d gitea
```
3. æµè§ˆå™¨å¼€ `http://localhost:3000` → 首次安装å‘导建管ç†å‘˜ï¼ˆå¦‚ `stardust`/`******`,记牢)。
4. 建仓库 `stardust-flows-demo`(或把现有 Stardust 方案推é€ä¸Šæ¥åšçœŸå®žæž„建对象)。
---
## G2 部署镜åƒåº“ registry:2
1. 本机验è¯é˜¶æ®µå…³é—鉴æƒä»¥ä¾¿åŒ¿å pull/push(**仅本机**,勿外网):把 `REGISTRY_AUTH` æ•´æ®µåˆ æŽ‰æˆ–è®¾ä¸ºç©ºï¼Œé‡å¯ï¼š
```bash
cd /d/ci && docker compose up -d registry
```
2. 验è¯å¯ç”¨ï¼ˆç”¨ `oras` 推一个测试制å“ï¼›`oras` 需先安装到 PATH):
```bash
echo hello > /tmp/test.txt
oras push localhost:5000/test/hello:1 /tmp/test.txt
oras pull localhost:5000/test/hello:1 -o /tmp/pulled
```
> `oras` 安装:从 https://github.com/oras-project/oras/releases å– Windows 版解压到 PATH。
3. 若用 `htpasswd` 鉴æƒï¼š`docker run --rm httpd:2 htpasswd -Bc /auth/htpasswd <user> <pass>` ç”Ÿæˆæ–‡ä»¶æŒ‚入容器。
---
## G3 部署并注册 act_runner
1. å¯åЍ runner 容器(挂载宿主 `docker.sock` 以起任务容器):
```bash
docker run -d --name act_runner --restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /d/ci/runner:/data \
-e GITEA_INSTANCE_URL=http://host.docker.internal:3000 \
-e GITEA_RUNNER_REGISTRATION_TOKEN=<TOKEN> \
gitea/act_runner:latest
```
> `<TOKEN>`:Gitea 管ç†åŽå° `ç«™ç‚¹ç®¡ç† â†’ Actions → Runners → 创建 Runner` 获å–;或仓库 Settings→Actions。
> `host.docker.internal` 在 Windows Docker 默认å¯è¾¾ï¼›è‹¥ç”¨ dockerd(Moby) 需确ä¿å¼€å¯ã€‚
2. 看日志确认 `online`:
```bash
docker logs -f act_runner
```
3. Gitea åŽå°ç¡®è®¤ Runner 状æ€ä¸º `active`。
---
## G4 æµæ°´çº¿ï¼šæž„建并推制å“
1. ä»“åº“å†…åŠ `.gitea/workflows/build.yml`:
```yaml
name: build-and-push-artifact
on: [push, workflow_dispatch]
jobs:
build:
runs-on: ubuntu-latest
# ä¸å£°æ˜Ž container:job 在 act_runner 宿主直接跑,调用本机已装 .NET SDKï¼ˆæ— éœ€ dotnet/sdk 容器镜åƒï¼‰
steps:
- uses: actions/checkout@v4
- name: publish
run: dotnet publish -c Release -o out
- name: pack
run: tar czf app.tgz -C out .
- name: push artifact
run: |
oras push ${{ secrets.REGISTRY }}/<repo>/<app>:${GITHUB_SHA::8} app.tgz
```
> `<repo>/<app>`ã€registry 地å€ç”¨ä»“库 Secrets(`REGISTRY=localhost:5000`,runner 内访问用 `host.docker.internal:5000` 视网络定)。
2. push 触å‘,Gitea Actions 页é¢ç¡®è®¤ï¼šrestore→publish→pack→oras push 全绿。
3. æ ¡éªŒåˆ¶å“已入镜åƒåº“:`oras pull ...` 或 `curl http://localhost:5000/v2/_catalog`。
---
## G5 对接 Stardust Flows 并端到端测试
> 把"构建"从 Flows 内的 `DotNetBuilder` 移交 Gitea Runnerï¼›Flows ä¾§ `K8sDeployExecutor` 改/增"åˆ¶å“æ¨¡å¼"仅负责部署。
1. **Flows æ”¹é€ **ï¼ˆåˆ¶å“æ¨¡å¼ï¼‰ï¼š
- 新增/调整 `K8sDeployExecutor`:`BuildAsync` 改为**è§¦å‘ Gitea æµæ°´çº¿å¹¶ç‰å¾…制å“产出**ï¼ˆæˆ–ä»…åœ¨å·²æœ‰åˆ¶å“æ—¶è·³è¿‡æž„建),ä¸å†å†…è” `dotnet publish` + `docker build`。
- `DeployAsync` 渲染"基础è¿è¡Œæ—¶é•œåƒ + init 容器拉制å“"çš„ Deploymentï¼ˆè§ GITEA-1 §5.2),`AppDeployVersion.Image` 写基础镜åƒã€`Url` å†™åˆ¶å“ OCI 引用。
- `DeploymentManifestBuilder` å¢žåŠ "åˆ¶å“æ¨¡å¼"分支(initContainer=`curlimages/curl` 拉 `AppDeploy.Url` 解压到 emptyDir)。
2. **è§¦å‘æ–¹å¼**:由 `PipelineTrigger.RunAsync` 先调 Gitea API è§¦å‘ workflow(`Stardust.K8s.Flows` å†…åŠ `IGiteaClient` è–„å°è£…,或用 `System.Net.Http` ç›´è°ƒ `/api/v1/repos/{owner}/{repo}/actions/workflows/{name}/dispatches`)。
3. **端到端验è¯**(本机 k3s):
```bash
# è·‘ Flows 测试/示例,触å‘完整链
STARDUST_K8S_INTEGRATION=1 dotnet test Stardust.K8s.Flows.Tests/... --filter 集æˆ
# ç‹¬ç«‹æ ¸å¯¹ k3s 真实状æ€
kubectl get deployment <app> -n <ns>
kubectl get pods -n <ns> -l app=<app>
# æ ¸å¯¹é•œåƒåº“制å“
oras pull localhost:5000/<repo>/<app>:<version> -o /tmp/v
```
4. **ä¸€è‡´æ€§æ ¸å¯¹**ï¼ˆå¯¹é½ K8S é›†æˆæµ‹è¯•æ—¢æœ‰åšæ³•):部署åŽé•œåƒ=基础è¿è¡Œæ—¶é•œåƒã€Pod Readyã€åˆ¶å“ digest 与 Gitea 推的一致。
---
## 完æˆåˆ¤æ®
- [ ] Gitea å¯è®¿é—®ã€å¯å»ºä»“库ã€Actions å·²å¯ç”¨
- [ ] registry:5000 å¯åŒ¿å push/pull 制å“
- [ ] act_runner 注册为 active,能在宿主跑 `.NET` 构建(本机已装 SDKï¼Œæ— éœ€ dotnet/sdk 镜åƒï¼‰
- [ ] 推é€ä»£ç è§¦å‘æž„建,`dotnet publish` 产物以 OCI 制å“入镜åƒåº“
- [ ] è§¦å‘ Flows åŽ k3s 拉起应用 Podï¼ˆåŸºç¡€é•œåƒ + init 拉制å“),`kubectl` 与 `oras` åŒå‘æ ¸å¯¹ä¸€è‡´
|