You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GitHub Actions中设置输入选项的显示名与实际值为键值对?

问题解答

你当前写的语法是错误的,GitHub Actions 的 workflow_dispatch 中 choice 类型的 options 只能是纯字符串数组,不支持键值对格式,所以你写的 server_1: i-xxxxxxxxxxxxxxxxx 这种写法不会生效,用户选择时会直接显示整个键值对字符串,达不到预期效果。

要实现「显示名称和实际值分离」的需求,需要额外添加映射逻辑,下面是两种可行方案:

方案一:通过字符串提取实例ID

把显示名称和实例ID合并成一个选项字符串,后续在步骤中提取出实例ID:

name: test

on: 
  workflow_dispatch:
    inputs:
      server_name:
        description: The server where you wish to deploy & test your code.
        required: true
        type: choice
        options:
          - server_1 (i-xxxxxxxxxxxxxxxxx)
          - server_2 (i-xxxxxxxxxxxxxxxxx)
          - server_3 (i-xxxxxxxxxxxxxxxxx)

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: 提取实例ID
        id: extract_id
        run: |
          # 从选择的字符串中提取括号内的实例ID
          INSTANCE_ID=$(echo "${{ github.event.inputs.server_name }}" | grep -oP '\((.*?)\)' | tr -d '()')
          echo "instance_id=$INSTANCE_ID" >> "$GITHUB_OUTPUT"
      
      - name: 使用实例ID部署
        run: |
          echo "正在部署到实例:${{ steps.extract_id.outputs.instance_id }}"
          # 这里写你的部署命令,比如 ssh 到实例执行操作

方案二:使用映射表匹配实例ID

让用户选择纯显示名称,在 workflow 内部定义一个名称与实例ID的映射表,通过选择的名称匹配出对应ID:

name: test

on: 
  workflow_dispatch:
    inputs:
      server_name:
        description: The server where you wish to deploy & test your code.
        required: true
        type: choice
        options:
          - server_1
          - server_2
          - server_3

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: 使用实例ID部署
        run: |
          # 定义映射表
          declare -A server_map=(
            ["server_1"]="i-xxxxxxxxxxxxxxxxx"
            ["server_2"]="i-xxxxxxxxxxxxxxxxx"
            ["server_3"]="i-xxxxxxxxxxxxxxxxx"
          )
          # 获取对应实例ID
          INSTANCE_ID=${server_map[${{ github.event.inputs.server_name }}]}
          echo "正在部署到实例:$INSTANCE_ID"
          # 执行部署操作

或者用 GitHub Actions 的表达式语法更简洁地实现映射:

name: test

on: 
  workflow_dispatch:
    inputs:
      server_name:
        description: The server where you wish to deploy & test your code.
        required: true
        type: choice
        options:
          - server_1
          - server_2
          - server_3

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: 使用实例ID部署
        run: |
          echo "正在部署到实例:${{ fromJSON('{"server_1": "i-xxxxxxxxxxxxxxxxx", "server_2": "i-xxxxxxxxxxxxxxxxx", "server_3": "i-xxxxxxxxxxxxxxxxx"}')[github.event.inputs.server_name] }}"

两种方案对比:

  • 方案一的优点是用户在选择时能看到对应的实例ID,适合需要透明展示的场景;缺点是选项字符串较长。
  • 方案二的优点是界面更简洁,用户只看到友好的服务器名称,实例ID隐藏在 workflow 中;缺点是如果需要修改实例ID,要编辑 workflow 文件。

内容的提问来源于stack exchange,提问作者aphexlog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 21:50:30