--- description: Create and start a Gitea Actions runner (default host mode) --- # gitea-create-runner 创建并启动 Gitea Actions Runner(默认 host 模式)。 ## 命令说明 此命令用于快速创建和启动一个 Gitea Actions Runner。默认使用 host 模式,自动检测系统环境并配置。 **重要**:这是一个可执行命令,AI 应该按照以下步骤执行操作。 ## Features - 自动检查并安装 act_runner(如果未安装) - 自动加载 Gitea 配置(如果不存在则提示初始化) - 默认使用 host 模式(支持 Android SDK、iOS 构建等原生工具) - 智能检测系统环境(OS、架构)并生成合适的 labels - 自动注册并后台启动 runner - 优先尝试创建全局 runner(需要管理员权限) - 权限不足时自动降级到组织 runner ## User Input Format 无需参数,运行后自动创建。可选提供 runner 名称。 ```bash /gitea-create-runner # 或 /gitea-create-runner my-runner-name ``` ## AI 执行指导 当用户调用此命令时,AI 应该: 1. **检查 act_runner 安装**:如果未安装,自动安装 2. **加载 Gitea 配置**:如果不存在,提示用户先初始化 3. **生成 runner 名称**:基于主机名或用户输入 4. **检测系统环境**:自动生成 labels 5. **创建 runner 目录**:在 `~/.config/gitea/runners/` 下创建 6. **生成配置文件**:默认 host 模式配置 7. **获取注册 token**:优先全局,失败则降级到组织 8. **注册 runner**:使用 act_runner register 9. **启动 runner**:后台启动并显示状态 ## Implementation Steps ### 1. Check act_runner Installation **AI 执行**:检查 act_runner 是否已安装,如果没有则自动安装。 ```bash echo "检查 act_runner 安装状态..." if command -v act_runner &> /dev/null; then version=$(act_runner --version 2>&1 | head -n1) echo "✓ act_runner 已安装: $version" else echo "⚠️ act_runner 未安装" echo "正在使用 Homebrew 安装..." if ! command -v brew &> /dev/null; then echo "❌ 需要先安装 Homebrew" echo " 安装命令: /bin/bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"" exit 1 fi brew install act_runner if [ $? -eq 0 ]; then version=$(act_runner --version 2>&1 | head -n1) echo "✓ act_runner 安装成功: $version" else echo "❌ act_runner 安装失败" exit 1 fi fi echo "" ``` ### 2. Load Gitea Configuration **AI 执行**:加载 Gitea 配置,如果不存在则提示初始化。 ```bash config_file="$HOME/.config/gitea/config.env" if [ ! -f "$config_file" ]; then echo "❌ Gitea 配置不存在" echo "" echo "请先初始化 Gitea 配置:" echo " /gitea-reset" echo "" echo "或使用以下命令查看配置:" echo " /gitea-config" exit 1 fi source "$config_file" if [ -z "$GITEA_URL" ] || [ -z "$GITEA_TOKEN" ]; then echo "❌ Gitea 配置不完整" echo " 需要 GITEA_URL 和 GITEA_TOKEN" echo "" echo "请重新初始化配置:" echo " /gitea-reset" exit 1 fi echo "✓ 已加载 Gitea 配置" echo " URL: $GITEA_URL" echo "" ``` ### 3. Generate Runner Name **AI 执行**:生成 runner 名称(基于主机名或用户输入)。 ```bash # Check if runner name provided as argument # 如果用户提供了名称参数,使用该参数;否则基于主机名生成 if [ -n "$1" ]; then runner_name="$1" echo "使用指定的 Runner 名称: $runner_name" else hostname=$(hostname -s 2>/dev/null || echo "unknown") runner_name="runner-$hostname" echo "生成 Runner 名称: $runner_name" echo " (基于主机名: $hostname)" fi echo "" # Validate runner name if [[ ! "$runner_name" =~ ^[a-zA-Z0-9_-]+$ ]]; then echo "❌ Runner 名称只能包含字母、数字、下划线和连字符" exit 1 fi ``` ### 4. Check Runner Existence **AI 执行**:检查 runner 是否已存在。 ```bash runners_dir="$HOME/.config/gitea/runners" runner_dir="$runners_dir/$runner_name" if [ -d "$runner_dir" ]; then echo "❌ Runner '$runner_name' 已存在" echo " 路径: $runner_dir" echo "" echo "选项:" echo " 1. 使用其他名称: /gitea-create-runner <新名称>" echo " 2. 删除现有 runner: /gitea-delete-runner" echo " 3. 查看所有 runners: /gitea-list-runners" exit 1 fi ``` ### 5. Detect System Environment **AI 执行**:智能检测系统环境并生成 labels。 ```bash echo "检测系统环境..." # Detect OS OS=$(uname -s) case "$OS" in Darwin) os_label="macOS" ;; Linux) os_label="ubuntu" ;; *) os_label="unknown" ;; esac # Detect architecture ARCH=$(uname -m) case "$ARCH" in arm64|aarch64) arch_label="ARM64" ;; x86_64) arch_label="x64" ;; *) arch_label="unknown" ;; esac # Generate combined label combined=$(echo "${OS}-${ARCH}" | tr '[:upper:]' '[:lower:]') # Generate labels for host mode labels="self-hosted:host,${os_label}:host,${arch_label}:host,${combined}:host" echo "✓ 系统信息" echo " 操作系统: $OS ($os_label)" echo " 架构: $ARCH ($arch_label)" echo " 组合标签: $combined" echo "" echo "✓ Runner Labels (Host Mode)" echo " $labels" echo "" ``` ### 6. Create Runner Directory **AI 执行**:创建 runner 目录结构。 ```bash echo "创建 Runner 目录..." mkdir -p "$runner_dir"/{cache,workspace} if [ ! -d "$runner_dir" ]; then echo "❌ 创建目录失败" exit 1 fi echo "✓ 目录创建成功" echo " 路径: $runner_dir" echo " - cache/" echo " - workspace/" echo "" ``` ### 7. Generate Configuration File **AI 执行**:生成 host 模式配置文件。 ```bash echo "生成配置文件..." # Get environment-specific settings (with defaults) runner_capacity="${GITEA_RUNNER_CAPACITY:-2}" runner_timeout="${GITEA_RUNNER_TIMEOUT:-3h}" # Generate config.yaml for host mode cat > "$runner_dir/config.yaml" << EOF log: level: info runner: file: $runner_dir/.runner capacity: $runner_capacity timeout: $runner_timeout shutdown_timeout: 30s insecure: false fetch_timeout: 5s fetch_interval: 2s labels: - "self-hosted:host" - "${os_label}:host" - "${arch_label}:host" - "${combined}:host" cache: enabled: true dir: "$runner_dir/cache" host: "127.0.0.1" port: 9000 host: workdir_parent: "$runner_dir/workspace" EOF if [ ! -f "$runner_dir/config.yaml" ]; then echo "❌ 配置文件生成失败" exit 1 fi echo "✓ 配置文件已生成" echo " 文件: $runner_dir/config.yaml" echo " 模式: Host Mode (原生执行)" echo " 容量: $runner_capacity 并发任务" echo " 超时: $runner_timeout" echo "" ``` ### 8. Get Registration Token **AI 执行**:获取注册 token(优先全局,失败则降级到组织)。 ```bash echo "获取 Runner 注册 Token..." echo "" # Try global runner first (requires admin token) echo "尝试创建全局 Runner(可用于所有组织和仓库)..." response=$(curl -s -w "\n%{http_code}" \ -H "Authorization: token $GITEA_TOKEN" \ "${GITEA_URL}/api/v1/admin/runners/registration-token") http_code=$(echo "$response" | tail -n1) body=$(echo "$response" | sed '$d') # Check for admin permission if [ "$http_code" = "200" ]; then echo "✓ 使用全局 Runner" runner_level="global" registration_token=$(echo "$body" | jq -r '.token') else echo "⚠️ 全局 Runner 权限不足 (HTTP $http_code)" echo " 全局 Runner 需要管理员 Token" echo "" echo "降级到组织 Runner..." runner_level="organization" if [ -n "$GITEA_DEFAULT_ORG" ]; then org_name="$GITEA_DEFAULT_ORG" echo "使用默认组织: $org_name" else echo "❌ 未配置默认组织" echo " 请在配置文件中设置 GITEA_DEFAULT_ORG" echo " 或重新初始化配置: /gitea-reset" exit 1 fi response=$(curl -s -w "\n%{http_code}" -X POST \ -H "Authorization: token $GITEA_TOKEN" \ "${GITEA_URL}/api/v1/orgs/$org_name/actions/runners/registration-token") http_code=$(echo "$response" | tail -n1) body=$(echo "$response" | sed '$d') if [ "$http_code" != "200" ]; then echo "❌ 获取注册 Token 失败 (HTTP $http_code)" echo " 响应: $body" echo "" echo "可能的原因:" echo " 1. 组织不存在" echo " 2. Token 没有组织管理权限" echo " 3. 网络连接问题" exit 1 fi registration_token=$(echo "$body" | jq -r '.token') echo "✓ 组织 Runner Token 已获取" fi if [ -z "$registration_token" ] || [ "$registration_token" = "null" ]; then echo "❌ 无法解析注册 Token" exit 1 fi echo "✓ 注册 Token 已准备" echo "" ``` ### 9. Register Runner **AI 执行**:注册 runner 到 Gitea 服务器。 ```bash echo "注册 Runner 到 Gitea 服务器..." act_runner register \ --config "$runner_dir/config.yaml" \ --instance "$GITEA_URL" \ --token "$registration_token" \ --name "$runner_name" \ --labels "$labels" \ --no-interactive if [ $? -eq 0 ]; then echo "✓ Runner 注册成功" else echo "❌ Runner 注册失败" echo "" echo "请检查:" echo " 1. Token 是否有效" echo " 2. Gitea 服务器是否可访问" echo " 3. 配置文件是否正确" echo "" echo "查看详细错误,可以手动运行:" echo " act_runner register --config $runner_dir/config.yaml --instance $GITEA_URL --token --name $runner_name --labels \"$labels\"" exit 1 fi # Verify .runner file was created if [ ! -f "$runner_dir/.runner" ]; then echo "⚠️ 注册文件未创建,但注册可能成功" echo " 请检查: $runner_dir/.runner" fi echo "" ``` ### 10. Start Runner **AI 执行**:后台启动 runner 并验证状态。 ```bash echo "启动 Runner..." # Start runner in background nohup act_runner daemon --config "$runner_dir/config.yaml" \ > "$runner_dir/runner.log" 2>&1 & runner_pid=$! echo " 进程已启动 (PID: $runner_pid)" # Wait for runner to initialize echo " 等待初始化..." sleep 3 # Check if process is still running if ps -p $runner_pid > /dev/null 2>&1; then echo "✓ Runner 运行中" else echo "❌ Runner 启动失败" echo "" echo "查看日志以诊断问题:" echo " tail -n 50 $runner_dir/runner.log" echo "" tail -n 20 "$runner_dir/runner.log" exit 1 fi echo "" ``` ### 11. Display Summary **AI 执行**:显示创建结果和管理命令。 ```bash echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "✅ Runner 创建完成!" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "" echo "Runner 信息:" echo " 名称: $runner_name" echo " 级别: $runner_level" if [ "$runner_level" = "organization" ]; then echo " 组织: $org_name" fi echo " 模式: Host Mode (原生执行)" echo " 状态: 🟢 运行中" echo " PID: $runner_pid" echo "" echo "配置:" echo " 容量: $runner_capacity 并发任务" echo " 超时: $runner_timeout" echo " Labels: $labels" echo "" echo "目录:" echo " 配置文件: $runner_dir/config.yaml" echo " 注册信息: $runner_dir/.runner" echo " 工作目录: $runner_dir/workspace" echo " 缓存目录: $runner_dir/cache" echo " 日志文件: $runner_dir/runner.log" echo "" echo "管理命令:" echo " 查看日志: tail -f $runner_dir/runner.log" echo " 停止 Runner: pkill -f 'act_runner daemon --config.*$runner_name'" echo " 查看所有: /gitea-list-runners" echo " 删除 Runner: /gitea-delete-runner" echo "" echo "使用 Runner:" echo " 在 workflow 中使用以下任一 runs-on 值:" echo " - runs-on: $combined" echo " - runs-on: $os_label" echo " - runs-on: [self-hosted, $os_label, $arch_label]" echo "" ``` ## Output Example ### Example 1: Successful Creation (Global Runner) ``` 检查 act_runner 安装状态... ✓ act_runner 已安装: act_runner version 0.2.13 ✓ 已加载 Gitea 配置 URL: https://git.digitevents.com 生成 Runner 名称: runner-macbook-pro (基于主机名: macbook-pro) 检测系统环境... ✓ 系统信息 操作系统: Darwin (macOS) 架构: arm64 (ARM64) 组合标签: darwin-arm64 ✓ Runner Labels (Host Mode) self-hosted:host,macOS:host,ARM64:host,darwin-arm64:host 创建 Runner 目录... ✓ 目录创建成功 路径: /Users/voson/.config/gitea/runners/runner-macbook-pro - cache/ - workspace/ 生成配置文件... ✓ 配置文件已生成 文件: /Users/voson/.config/gitea/runners/runner-macbook-pro/config.yaml 模式: Host Mode (原生执行) 容量: 2 并发任务 超时: 3h 获取 Runner 注册 Token... 尝试创建全局 Runner(可用于所有组织和仓库)... ✓ 使用全局 Runner ✓ 注册 Token 已准备 注册 Runner 到 Gitea 服务器... ✓ Runner 注册成功 启动 Runner... 进程已启动 (PID: 12345) 等待初始化... ✓ Runner 运行中 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ✅ Runner 创建完成! ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Runner 信息: 名称: runner-macbook-pro 级别: global 模式: Host Mode (原生执行) 状态: 🟢 运行中 PID: 12345 配置: 容量: 2 并发任务 超时: 3h Labels: self-hosted:host,macOS:host,ARM64:host,darwin-arm64:host 目录: 配置文件: /Users/voson/.config/gitea/runners/runner-macbook-pro/config.yaml 注册信息: /Users/voson/.config/gitea/runners/runner-macbook-pro/.runner 工作目录: /Users/voson/.config/gitea/runners/runner-macbook-pro/workspace 缓存目录: /Users/voson/.config/gitea/runners/runner-macbook-pro/cache 日志文件: /Users/voson/.config/gitea/runners/runner-macbook-pro/runner.log 管理命令: 查看日志: tail -f /Users/voson/.config/gitea/runners/runner-macbook-pro/runner.log 停止 Runner: pkill -f 'act_runner daemon --config.*runner-macbook-pro' 查看所有: /gitea-list-runners 删除 Runner: /gitea-delete-runner 使用 Runner: 在 workflow 中使用以下任一 runs-on 值: - runs-on: darwin-arm64 - runs-on: macOS - runs-on: [self-hosted, macOS, ARM64] ``` ### Example 2: Auto-install act_runner ``` 检查 act_runner 安装状态... ⚠️ act_runner 未安装 正在使用 Homebrew 安装... ==> Downloading act_runner... ==> Installing act_runner... ✓ act_runner 安装成功: act_runner version 0.2.13 [继续后续步骤...] ``` ### Example 3: Downgrade to Organization Runner ``` 获取 Runner 注册 Token... 尝试创建全局 Runner(可用于所有组织和仓库)... ⚠️ 全局 Runner 权限不足 (HTTP 403) 全局 Runner 需要管理员 Token 降级到组织 Runner... 使用默认组织: ai ✓ 组织 Runner Token 已获取 ✓ 注册 Token 已准备 [继续后续步骤...] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ✅ Runner 创建完成! ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Runner 信息: 名称: runner-macbook-pro 级别: organization 组织: ai 模式: Host Mode (原生执行) [...] ``` ### Example 4: Configuration Not Found ``` 检查 act_runner 安装状态... ✓ act_runner 已安装: act_runner version 0.2.13 ❌ Gitea 配置不存在 请先初始化 Gitea 配置: /gitea-reset 或使用以下命令查看配置: /gitea-config ``` ### Example 5: Runner Already Exists ``` [前置检查...] 生成 Runner 名称: runner-macbook-pro (基于主机名: macbook-pro) ❌ Runner 'runner-macbook-pro' 已存在 路径: /Users/voson/.config/gitea/runners/runner-macbook-pro 选项: 1. 使用其他名称: /gitea-create-runner <新名称> 2. 删除现有 runner: /gitea-delete-runner 3. 查看所有 runners: /gitea-list-runners ``` ## Technical Notes - **默认模式**:Host Mode(支持 Android SDK、iOS 等原生工具) - **自动安装**:使用 Homebrew 安装 act_runner - **智能检测**:自动检测 OS 和架构,生成合适的 labels - **优雅降级**:全局 runner 权限不足时自动降级到组织 runner - **后台运行**:自动后台启动,日志记录到文件 - **配置环境变量**: - `GITEA_RUNNER_CAPACITY`: 并发任务数(默认 2) - `GITEA_RUNNER_TIMEOUT`: 任务超时时间(默认 3h) - **目录权限**:自动创建,权限继承用户默认权限 - **进程管理**:使用 nohup 后台运行,支持系统重启后手动重启 ## Related Commands - `/gitea-config`: 查看 Gitea 配置 - `/gitea-reset`: 重置/初始化 Gitea 配置 - `/gitea-list-runners`: 列出所有 runners - `/gitea-delete-runner`: 删除指定 runner - `/create-gitea-repo`: 创建 Gitea 仓库 ## Safety Features - **配置验证**:检查必需的配置项 - **目录冲突检测**:避免覆盖现有 runner - **启动验证**:等待并验证进程启动成功 - **错误提示**:清晰的错误信息和解决方案 - **日志记录**:所有输出记录到日志文件 ## Version - **Command Version**: 1.0 - **Last Updated**: 2026-01-12 - **Compatible with**: act_runner 0.2.13+, macOS/Linux