GitHub Actions中如何访问其他工作流检出/生成的文件?
默认情况下,你不能直接跨作业访问被调用工作流中检出或生成的文件。GitHub Actions 里的每个作业(包括可复用工作流内定义的作业)都运行在独立的临时 runner 实例上,哪怕你用needs声明了作业依赖,作业运行结束后对应的文件系统、运行环境都会被直接回收,不会自动共享给其他作业。
要实现你想要的基础配置复用、跨作业访问文件的需求,有两种成熟的实现方式:
方式一:通过工件(Artifact)中转文件
这是官方原生支持的跨作业文件传递方案,你只需要在setup作业的最后把需要共享的文件上传为工件,后续依赖setup的作业在开头下载对应工件,就能拿到所有文件。
修改你的setup.yml,在原有步骤最后添加上传工件的逻辑:
name: Set the project up on: workflow_call jobs: setup: name: Set the project up runs-on: ubuntu-latest steps: - name: Checkout the code uses: actions/checkout@v3 - name: Set up Node uses: actions/setup-node@v3 with: node-version: '16' # 新增上传步骤 - name: Upload shared files uses: actions/upload-artifact@v4 with: name: project-source path: ./* retention-days: 1
在所有依赖setup的作业(比如你示例里的test作业)的步骤最开头,添加下载工件的步骤即可拿到所有文件:
- name: Download files from setup job uses: actions/download-artifact@v4 with: name: project-source path: ./
注意:Node运行环境、系统级依赖这类安装在runner系统层面的内容,无法通过工件传递。如果你需要复用环境初始化逻辑,更推荐用下面的方式。
方式二:将初始化逻辑封装为复合动作(Composite Action)
如果你的核心目的是避免重复编写代码检出、Node环境初始化这类通用步骤,不要用独立的可复用工作流承载setup逻辑,封装成复合动作是更高效的方案。复合动作的步骤会直接运行在调用方作业的同一个runner实例中,完全没有文件、环境隔离的问题,后续步骤可以直接访问检出的代码、使用初始化好的Node环境,也不需要额外花时间上传下载文件。
首先在仓库中创建.github/actions/setup/action.yml文件,写入初始化逻辑:
name: Project base setup description: Checkout repository code and initialize Node environment runs: using: composite steps: - name: Checkout the code uses: actions/checkout@v3 - name: Set up Node uses: actions/setup-node@v3 with: node-version: '16'
之后任意工作流的作业需要做基础初始化时,直接在steps中调用这个本地复合动作即可,不需要单独拆分setup作业:
# 以测试作业为例 jobs: test: runs-on: ubuntu-latest steps: - name: Run base setup uses: ./.github/actions/setup # 后续步骤可直接操作代码、执行node相关命令 - name: Install dependencies run: npm ci - name: Run unit tests run: npm run test
这种方案性能更高、维护成本更低,是这类通用前置配置复用的首选实现。
内容的提问来源于stack exchange,提问作者Mahozad

