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

GitHub Actions:多作业间如何持久化仓库工作区?

问题:自托管GitHub Actions Runner跨作业持久化工作区?

问题背景

我正在使用自托管GitHub Actions Runner配置工作流。该Runner已安装Node可完成checkout任务,但未安装Python,因此我尝试在指定容器中执行仓库内的main.py脚本。然而第二个作业在容器中运行时,无法找到main.py文件。

当前工作流配置:

name: GitHub Actions Test
on:
   workflow_dispatch:
     inputs:
       job:
         description: 'checkout and run'
         required: true
         default: 'checkout-repo' 
jobs:
  checkout-repo:
      runs-on: self-hosted
      steps:
        - name: Checkout
          uses: actions/checkout@v3
          
  run-python:
    runs-on: self-hosted
    container: 
      image: <some_python3_docker_image>
      credentials:
        username: ${{ github.actor }}
        password: ${{ secrets.github_token }}
    steps:
      - run: python3 main.py

请问有没有办法让仓库工作区在两个作业之间持久化?


解决方案

GitHub Actions中不同作业默认相互独立,工作区不会自动共享,针对你的场景,有几种可行方案:

方案1:合并作业,在容器内完成所有操作

不需要拆分两个作业,直接在容器环境里执行代码拉取和脚本运行,工作区自然在容器内:

name: GitHub Actions Test
on:
   workflow_dispatch:
     inputs:
       job:
         description: 'checkout and run'
         required: true
         default: 'checkout-repo' 
jobs:
  run-python:
    runs-on: self-hosted
    container: 
      image: <some_python3_docker_image>
      credentials:
        username: ${{ github.actor }}
        password: ${{ secrets.github_token }}
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - run: python3 main.py

容器启动后会先拉取代码,再执行脚本,不会出现文件找不到的问题。

方案2:用制品上传/下载共享文件

如果必须拆分作业,可以把第一个作业拉取的代码上传为制品,第二个作业下载后使用:

第一个作业添加上传步骤:

checkout-repo:
  runs-on: self-hosted
  steps:
    - name: Checkout
      uses: actions/checkout@v3
    - name: Upload code artifact
      uses: actions/upload-artifact@v3
      with:
        name: repo-code
        path: .

第二个作业添加下载步骤:

run-python:
  runs-on: self-hosted
  container: 
    image: <some_python3_docker_image>
    credentials:
      username: ${{ github.actor }}
      password: ${{ secrets.github_token }}
  steps:
    - name: Download code artifact
      uses: actions/download-artifact@v3
      with:
        name: repo-code
        path: .
    - run: python3 main.py

方案3:利用自托管Runner的本地目录持久化

如果你的自托管Runner是固定机器,可以指定拉取代码到Runner的某个本地目录,第二个作业挂载该目录到容器中使用(注意:仅适合单Runner场景,需确保目录权限正确):

第一个作业指定拉取路径:

checkout-repo:
  runs-on: self-hosted
  steps:
    - name: Checkout to persistent dir
      uses: actions/checkout@v3
      with:
        path: /path/to/persistent/dir/on/runner

第二个作业挂载目录并执行:

run-python:
  runs-on: self-hosted
  container: 
    image: <some_python3_docker_image>
    credentials:
      username: ${{ github.actor }}
      password: ${{ secrets.github_token }}
    volumes:
      - /path/to/persistent/dir/on/runner:/workspace
  steps:
    - run: cd /workspace && python3 main.py

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 11:06:24