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

