如何在可调用GitHub Actions工作流中跨作业复用步骤与默认值
解决可调用工作流的代码复用问题
错误原因分析
- 全局
defaults无法访问inputs:inputs属于工作流调用的上下文,仅能在**作业(job)或步骤(step)**层级的表达式中使用,全局层级不支持直接引用inputs,这是你遇到Unrecognized named-value: 'inputs'错误的核心原因。 needs: setup无法共享环境:GitHub Actions的每个作业运行在独立的Runner实例上,needs仅控制作业执行顺序,不会将setup作业的环境、已安装依赖或文件系统传递给后续作业,后续作业仍需重新完成初始化步骤。
方案一:YAML锚点复用作业模板(推荐,适用于单工作流内复用)
利用YAML的锚点(Anchor)和引用(Alias)特性,定义通用作业模板,复用所有重复的配置:
on: workflow_call: inputs: working-directory: required: true type: string jobs: # 定义通用作业锚点,包含所有重复的配置 _base_job: &base_job defaults: run: working-directory: ${{ inputs.working-directory }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Use Node.js uses: actions/setup-node@v3 with: node-version: 18.x cache: "npm" cache-dependency-path: "${{ inputs.working-directory }}/package-lock.json" - run: npm ci # 复用通用模板,仅添加专属步骤 lint: <<: *base_job steps: <<: *base_job.steps - run: npm run lint typecheck: <<: *base_job steps: <<: *base_job.steps - run: npm run typecheck test: <<: *base_job steps: <<: *base_job.steps - run: npm run test --if-present
说明
&base_job:定义通用作业的锚点,包含重复的运行环境、默认工作目录和初始化步骤。<<: *base_job:引用锚点的所有配置,快速生成作业基础结构。<<: *base_job.steps:引用锚点中的步骤列表,再追加当前作业的专属步骤,避免重复编写初始化代码。
方案二:复合Action(适用于跨工作流复用)
如果需要在多个工作流中复用这些初始化步骤,可以封装成复合Action:
- 在仓库中创建复合Action文件:
.github/actions/setup-node-env/action.yml
name: 'Setup Node.js Environment' inputs: working-directory: required: true type: string runs: using: "composite" steps: - uses: actions/checkout@v3 shell: bash - name: Use Node.js uses: actions/setup-node@v3 with: node-version: 18.x cache: "npm" cache-dependency-path: "${{ inputs.working-directory }}/package-lock.json" shell: bash - run: npm ci working-directory: ${{ inputs.working-directory }} shell: bash
- 在可调用工作流中使用该复合Action:
on: workflow_call: inputs: working-directory: required: true type: string jobs: lint: runs-on: ubuntu-latest steps: - uses: ./.github/actions/setup-node-env with: working-directory: ${{ inputs.working-directory }} - run: npm run lint working-directory: ${{ inputs.working-directory }} typecheck: runs-on: ubuntu-latest steps: - uses: ./.github/actions/setup-node-env with: working-directory: ${{ inputs.working-directory }} - run: npm run typecheck working-directory: ${{ inputs.working-directory }} test: runs-on: ubuntu-latest steps: - uses: ./.github/actions/setup-node-env with: working-directory: ${{ inputs.working-directory }} - run: npm run test --if-present working-directory: ${{ inputs.working-directory }}
说明
- 复合Action将初始化步骤封装成独立模块,可在当前仓库的任意工作流中调用,甚至通过GitHub仓库引用在其他仓库使用。
- 每个作业只需调用该Action,再执行专属命令即可,代码结构更简洁模块化。
内容的提问来源于stack exchange,提问作者Kazuto_Ute
相关产品推荐
相关产品推荐

