能否在GitHub Actions工作流启动时动态获取输入选项值?
GitHub Actions 动态生成部署输入选项的解决办法
GitHub Actions 本身要求工作流的输入参数必须在 .github/workflows 下的配置文件里静态写死,没法直接在启动工作流的UI界面里动态加载ECR的镜像标签当选项。不过可以通过拆分两步工作流的方式实现你的需求:
具体实现步骤
1. 先跑前置工作流拉取ECR标签,触发部署事件
创建一个专门用来拉取标签的工作流,手动触发它后,会自动调用AWS CLI获取ECR里的镜像标签,再通过GitHub的仓库事件把标签列表传递给部署工作流。
示例代码:
name: 拉取ECR标签并触发部署 on: workflow_dispatch: # 手动触发这个前置流程 jobs: 获取标签: runs-on: ubuntu-latest steps: - name: 配置AWS凭证 uses: aws-actions/configure-aws-credentials@v4 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: us-east-1 # 替换成你的ECR区域 - name: 拉取ECR镜像标签 id: get-tags run: | # 过滤掉null标签,用逗号拼接成字符串 TAGS=$(aws ecr list-images --repository-name 你的镜像仓库名 --query 'imageIds[*].imageTag' --output json | jq -r '.[] | select(. != null)' | paste -sd "," -) echo "tags=$TAGS" >> $GITHUB_OUTPUT - name: 触发部署工作流 uses: peter-evans/repository-dispatch@v3 with: token: ${{ secrets.GITHUB_TOKEN }} event-type: deploy-with-tags client-payload: '{"tags": "${{ steps.get-tags.outputs.tags }}"}'
2. 部署工作流接收标签,提供选择(或自动处理)
部署工作流监听上面的deploy-with-tags事件,接收到标签列表后,可以做两种处理:
- 如果需要手动选择:把标签解析出来后,通过脚本生成一个交互式选择(仅限自托管运行器,GitHub托管的机器不支持交互);
- 如果是自动化场景:直接从标签列表中选取最新的或者指定规则的标签进行部署。
示例部署工作流片段:
name: 部署到ECS on: repository_dispatch: types: [deploy-with-tags] jobs: 部署: runs-on: ubuntu-latest steps: - name: 解析标签列表 id: parse-tags run: | TAGS=${{ github.event.client_payload.tags }} # 把逗号分隔的字符串转成数组 echo "tag_list=($TAGS)" >> $GITHUB_OUTPUT - name: 选择并部署最新标签 run: | # 取标签列表里的最后一个(假设是最新的) LATEST_TAG=${{ steps.parse-tags.outputs.tag_list[-1] }} echo "开始部署镜像标签: $LATEST_TAG" # 这里写部署到ECS的命令,比如aws ecs update-service等
核心限制要注意
GitHub官方的workflow_dispatch输入参数必须静态定义在工作流文件里,没法在启动工作流的UI界面直接展示动态生成的选项。所有动态获取的标签只能通过间接方式传递,要么靠前置工作流转递后自动选择,要么在自托管环境里做交互式选择。
内容的提问来源于stack exchange,提问作者Nir
相关产品推荐
相关产品推荐

