如何在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
相关产品推荐
相关产品推荐

