Compare commits
7 Commits
runtime-2d
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| e6643bdc4d | |||
| 537315f0fc | |||
| ddae3b3574 | |||
| bfbe038ab2 | |||
| b29b85025b | |||
| 6eb16afb14 | |||
| 3ce3c6fb66 |
31
.github/workflows/deploy-ai-workspace-iac.yaml
vendored
31
.github/workflows/deploy-ai-workspace-iac.yaml
vendored
@ -18,8 +18,8 @@ name: Deploy AI Workspace (IaC + Ansible + Cloudflare)
|
|||||||
# VULTR_API_KEY → Vultr 账号 API key(provision 创主机)
|
# VULTR_API_KEY → Vultr 账号 API key(provision 创主机)
|
||||||
# SSH_PRIVATE_DEPLOY_KEY_B64 → 部署 SSH 私钥 base64(deploy 登录主机,优先)
|
# SSH_PRIVATE_DEPLOY_KEY_B64 → 部署 SSH 私钥 base64(deploy 登录主机,优先)
|
||||||
# SSH_PRIVATE_DEPLOY_KEY → 同上原始多行格式(回退,二选一必填)
|
# SSH_PRIVATE_DEPLOY_KEY → 同上原始多行格式(回退,二选一必填)
|
||||||
# CLOUDFLARE_DNS_API_TOKEN → CF Zone DNS Edit token(dns 同步,兼容旧名)
|
# CLOUDFLARE_DNS_API_TOKEN → CF Zone DNS Edit token(dns 同步)
|
||||||
# CLOUDFLARE_API_TOKEN → 同上,Cloudflare 角色兼容别名
|
# CLOUDFLARE_API_TOKEN → 兼容旧名;DNS job 优先使用 CLOUDFLARE_DNS_API_TOKEN
|
||||||
# kv/openclaw:
|
# kv/openclaw:
|
||||||
# DEEPSEEK_API_KEY → LLM provider key(deploy 注入主机)
|
# DEEPSEEK_API_KEY → LLM provider key(deploy 注入主机)
|
||||||
# NVIDIA_API_KEY → 同上
|
# NVIDIA_API_KEY → 同上
|
||||||
@ -43,6 +43,15 @@ name: Deploy AI Workspace (IaC + Ansible + Cloudflare)
|
|||||||
# ai-workspace-infra/vultr-vps/config/resources/ai-workspace-hosts.yaml
|
# ai-workspace-infra/vultr-vps/config/resources/ai-workspace-hosts.yaml
|
||||||
# 的 ssh_keys[].public,否则 Terraform 创机后 runner 无法 SSH 登录。
|
# 的 ssh_keys[].public,否则 Terraform 创机后 runner 无法 SSH 登录。
|
||||||
#
|
#
|
||||||
|
# 7. AI_WORKSPACE_AUTH_TOKEN(统一服务 token:LiteLLM master key / bridge / vault 等)
|
||||||
|
# - 三级优先级(on-host installer resolve_unified_auth_token 统一解析):
|
||||||
|
# 1) workflow_dispatch 输入 ai_workspace_auth_token(非空时覆盖)
|
||||||
|
# 2) Vault kv/CICD/AI_WORKSPACE_AUTH_TOKEN(输入留空时回退)
|
||||||
|
# 3) 两者皆空:installer 复用 ~/.ai_workspace_auth_token 或自动生成并持久化
|
||||||
|
# - 存储位置:vault kv patch kv/CICD AI_WORKSPACE_AUTH_TOKEN=<your-token>
|
||||||
|
# - TLDR 生成:python3 -c 'import uuid; print(uuid.uuid4())'
|
||||||
|
# - 经 run-on-host-bootstrap.sh 透传到主机 env,注入 all-in-one 各 role
|
||||||
|
#
|
||||||
# ── 流水线结构 ───────────────────────────────────────────────────────────────
|
# ── 流水线结构 ───────────────────────────────────────────────────────────────
|
||||||
#
|
#
|
||||||
# provision : 批量起机模式(开关:terraform_action=apply / run_deploy)。
|
# provision : 批量起机模式(开关:terraform_action=apply / run_deploy)。
|
||||||
@ -114,6 +123,11 @@ on:
|
|||||||
required: false
|
required: false
|
||||||
default: true
|
default: true
|
||||||
type: boolean
|
type: boolean
|
||||||
|
ai_workspace_auth_token:
|
||||||
|
description: "AI Workspace auth token 覆盖(留空则取 Vault kv/CICD/AI_WORKSPACE_AUTH_TOKEN;生成: python3 -c 'import uuid; print(uuid.uuid4())')"
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
type: string
|
||||||
|
|
||||||
# id-token: write 用于 Vault 的 GitHub OIDC(JWT) 认证;contents: read 拉代码
|
# id-token: write 用于 Vault 的 GitHub OIDC(JWT) 认证;contents: read 拉代码
|
||||||
permissions:
|
permissions:
|
||||||
@ -316,7 +330,8 @@ jobs:
|
|||||||
${{ env.VAULT_KV }} SSH_PRIVATE_DEPLOY_KEY_B64 | ANSIBLE_SSH_KEY_B64 ;
|
${{ env.VAULT_KV }} SSH_PRIVATE_DEPLOY_KEY_B64 | ANSIBLE_SSH_KEY_B64 ;
|
||||||
${{ env.VAULT_KV_OPENCLAW }} DEEPSEEK_API_KEY | DEEPSEEK_API_KEY ;
|
${{ env.VAULT_KV_OPENCLAW }} DEEPSEEK_API_KEY | DEEPSEEK_API_KEY ;
|
||||||
${{ env.VAULT_KV_OPENCLAW }} NVIDIA_API_KEY | NVIDIA_API_KEY ;
|
${{ env.VAULT_KV_OPENCLAW }} NVIDIA_API_KEY | NVIDIA_API_KEY ;
|
||||||
${{ env.VAULT_KV_OPENCLAW }} OLLAMA_API_KEY | OLLAMA_API_KEY
|
${{ env.VAULT_KV_OPENCLAW }} OLLAMA_API_KEY | OLLAMA_API_KEY ;
|
||||||
|
${{ env.VAULT_KV }} AI_WORKSPACE_AUTH_TOKEN | AI_WORKSPACE_AUTH_TOKEN
|
||||||
|
|
||||||
- name: Report provider key wiring
|
- name: Report provider key wiring
|
||||||
run: |
|
run: |
|
||||||
@ -403,6 +418,9 @@ jobs:
|
|||||||
# 离线包重新发布后可设为 auto 恢复离线加速。
|
# 离线包重新发布后可设为 auto 恢复离线加速。
|
||||||
AI_WORKSPACE_OFFLINE_MODE: ${{ github.event.inputs.offline_mode || 'off' }}
|
AI_WORKSPACE_OFFLINE_MODE: ${{ github.event.inputs.offline_mode || 'off' }}
|
||||||
XWORKMATE_BRIDGE_DOMAIN: ${{ github.event.inputs.bridge_domain }}
|
XWORKMATE_BRIDGE_DOMAIN: ${{ github.event.inputs.bridge_domain }}
|
||||||
|
# input 非空则覆盖;否则取 Vault kv/CICD/AI_WORKSPACE_AUTH_TOKEN;
|
||||||
|
# 两者皆空时由 on-host installer (resolve_unified_auth_token) 自动生成并持久化。
|
||||||
|
AI_WORKSPACE_AUTH_TOKEN: ${{ github.event.inputs.ai_workspace_auth_token != '' && github.event.inputs.ai_workspace_auth_token || steps.vault.outputs.AI_WORKSPACE_AUTH_TOKEN }}
|
||||||
DEEPSEEK_API_KEY: ${{ github.event.inputs.use_deepseek == 'false' && '' || steps.vault.outputs.DEEPSEEK_API_KEY }}
|
DEEPSEEK_API_KEY: ${{ github.event.inputs.use_deepseek == 'false' && '' || steps.vault.outputs.DEEPSEEK_API_KEY }}
|
||||||
NVIDIA_API_KEY: ${{ github.event.inputs.use_nvidia == 'false' && '' || steps.vault.outputs.NVIDIA_API_KEY }}
|
NVIDIA_API_KEY: ${{ github.event.inputs.use_nvidia == 'false' && '' || steps.vault.outputs.NVIDIA_API_KEY }}
|
||||||
OLLAMA_API_KEY: ${{ github.event.inputs.use_ollama == 'false' && '' || steps.vault.outputs.OLLAMA_API_KEY }}
|
OLLAMA_API_KEY: ${{ github.event.inputs.use_ollama == 'false' && '' || steps.vault.outputs.OLLAMA_API_KEY }}
|
||||||
@ -425,18 +443,16 @@ jobs:
|
|||||||
jwtGithubAudience: vault
|
jwtGithubAudience: vault
|
||||||
ignoreNotFound: true
|
ignoreNotFound: true
|
||||||
secrets: |
|
secrets: |
|
||||||
${{ env.VAULT_KV }} CLOUDFLARE_DNS_API_TOKEN | CLOUDFLARE_DNS_API_TOKEN ;
|
${{ env.VAULT_KV }} CLOUDFLARE_DNS_API_TOKEN | CLOUDFLARE_DNS_API_TOKEN
|
||||||
${{ env.VAULT_KV }} CLOUDFLARE_API_TOKEN | CLOUDFLARE_API_TOKEN
|
|
||||||
|
|
||||||
- name: Validate required secrets
|
- name: Validate required secrets
|
||||||
env:
|
env:
|
||||||
CLOUDFLARE_DNS_API_TOKEN: ${{ steps.vault.outputs.CLOUDFLARE_DNS_API_TOKEN }}
|
CLOUDFLARE_DNS_API_TOKEN: ${{ steps.vault.outputs.CLOUDFLARE_DNS_API_TOKEN }}
|
||||||
CLOUDFLARE_API_TOKEN: ${{ steps.vault.outputs.CLOUDFLARE_API_TOKEN }}
|
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
# 只校验 REQUIRED 机密非空(不打印任何值,仅判空);INFRA_REPO_TOKEN 可选不校验。
|
# 只校验 REQUIRED 机密非空(不打印任何值,仅判空);INFRA_REPO_TOKEN 可选不校验。
|
||||||
missing=0
|
missing=0
|
||||||
if [ -z "${CLOUDFLARE_DNS_API_TOKEN:-}" ] && [ -z "${CLOUDFLARE_API_TOKEN:-}" ]; then
|
if [ -z "${CLOUDFLARE_DNS_API_TOKEN:-}" ]; then
|
||||||
echo "::error::缺少必需机密 CLOUDFLARE_DNS_API_TOKEN (Vault: ${VAULT_KV}/CLOUDFLARE_DNS_API_TOKEN)"
|
echo "::error::缺少必需机密 CLOUDFLARE_DNS_API_TOKEN (Vault: ${VAULT_KV}/CLOUDFLARE_DNS_API_TOKEN)"
|
||||||
missing=1
|
missing=1
|
||||||
fi
|
fi
|
||||||
@ -466,7 +482,6 @@ jobs:
|
|||||||
working-directory: ${{ env.PLAYBOOKS_DIR }}
|
working-directory: ${{ env.PLAYBOOKS_DIR }}
|
||||||
env:
|
env:
|
||||||
CLOUDFLARE_DNS_API_TOKEN: ${{ steps.vault.outputs.CLOUDFLARE_DNS_API_TOKEN }}
|
CLOUDFLARE_DNS_API_TOKEN: ${{ steps.vault.outputs.CLOUDFLARE_DNS_API_TOKEN }}
|
||||||
CLOUDFLARE_API_TOKEN: ${{ steps.vault.outputs.CLOUDFLARE_API_TOKEN }}
|
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
# 只为本次新建的 ai_workspace 组主机同步 A 记录(域名取各主机
|
# 只为本次新建的 ai_workspace 组主机同步 A 记录(域名取各主机
|
||||||
|
|||||||
44
.github/workflows/validate-release-pr.yml
vendored
Normal file
44
.github/workflows/validate-release-pr.yml
vendored
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
name: Validate Release PR
|
||||||
|
|
||||||
|
# release/* 分支的发布策略门禁:仅接受 hotfix/* 或带 cherry-pick/backport 标签的 PR。
|
||||||
|
# 详见 iac_modules/docs/tldr-github-branch-model.md
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types: [opened, synchronize, reopened, labeled, unlabeled]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
validate-release-source:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: startsWith(github.base_ref, 'release/')
|
||||||
|
steps:
|
||||||
|
- name: Check PR source branch
|
||||||
|
run: |
|
||||||
|
SRC="${{ github.head_ref }}"
|
||||||
|
TGT="${{ github.base_ref }}"
|
||||||
|
LABELS="${{ join(github.event.pull_request.labels.*.name, ',') }}"
|
||||||
|
|
||||||
|
echo "🔍 Validating PR into release branch"
|
||||||
|
echo " source: $SRC"
|
||||||
|
echo " target: $TGT"
|
||||||
|
echo " labels: $LABELS"
|
||||||
|
|
||||||
|
if [[ "$SRC" =~ ^hotfix/ ]]; then
|
||||||
|
echo "✅ Allowed: hotfix/* branch"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$LABELS" =~ (^|,)(cherry-pick|backport)(,|$) ]]; then
|
||||||
|
echo "✅ Allowed: cherry-pick/backport labeled PR"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "❌ Rejected."
|
||||||
|
echo "release/* 仅接受:"
|
||||||
|
echo " - 来自 hotfix/* 的 PR"
|
||||||
|
echo " - 带 cherry-pick 或 backport 标签的 PR(已验证 feature 的 backport/cherry-pick)"
|
||||||
|
echo "禁止从 main / develop / feature/* 直接合并到 release/*。"
|
||||||
|
exit 1
|
||||||
@ -46,6 +46,8 @@ trap 'rm -f "$remote_payload"' EXIT
|
|||||||
{
|
{
|
||||||
printf 'AI_WORKSPACE_OFFLINE_MODE=%q\n' "${AI_WORKSPACE_OFFLINE_MODE:-off}"
|
printf 'AI_WORKSPACE_OFFLINE_MODE=%q\n' "${AI_WORKSPACE_OFFLINE_MODE:-off}"
|
||||||
printf 'XWORKMATE_BRIDGE_DOMAIN=%q\n' "$domain"
|
printf 'XWORKMATE_BRIDGE_DOMAIN=%q\n' "$domain"
|
||||||
|
# 空则不写,让 on-host installer 的 resolve_unified_auth_token 走"复用持久化/自动生成"分支。
|
||||||
|
printf 'AI_WORKSPACE_AUTH_TOKEN=%q\n' "${AI_WORKSPACE_AUTH_TOKEN:-}"
|
||||||
printf 'DEEPSEEK_API_KEY=%q\n' "${DEEPSEEK_API_KEY:-}"
|
printf 'DEEPSEEK_API_KEY=%q\n' "${DEEPSEEK_API_KEY:-}"
|
||||||
printf 'NVIDIA_API_KEY=%q\n' "${NVIDIA_API_KEY:-}"
|
printf 'NVIDIA_API_KEY=%q\n' "${NVIDIA_API_KEY:-}"
|
||||||
printf 'OLLAMA_API_KEY=%q\n' "${OLLAMA_API_KEY:-}"
|
printf 'OLLAMA_API_KEY=%q\n' "${OLLAMA_API_KEY:-}"
|
||||||
@ -67,7 +69,7 @@ fi
|
|||||||
(
|
(
|
||||||
set +e
|
set +e
|
||||||
source "$remote_env"
|
source "$remote_env"
|
||||||
export AI_WORKSPACE_OFFLINE_MODE XWORKMATE_BRIDGE_DOMAIN DEEPSEEK_API_KEY NVIDIA_API_KEY OLLAMA_API_KEY
|
export AI_WORKSPACE_OFFLINE_MODE XWORKMATE_BRIDGE_DOMAIN AI_WORKSPACE_AUTH_TOKEN DEEPSEEK_API_KEY NVIDIA_API_KEY OLLAMA_API_KEY
|
||||||
bash -lc 'curl -sfL https://install.svc.plus/ai-workspace | bash -'
|
bash -lc 'curl -sfL https://install.svc.plus/ai-workspace | bash -'
|
||||||
rc=$?
|
rc=$?
|
||||||
printf '%s\n' "$rc" > "$remote_rc"
|
printf '%s\n' "$rc" > "$remote_rc"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user