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

能否仅调用一次actions/checkout@v3为两个GitHub Jobs共享代码?

问题解答

不能只调用一次actions/checkout@v3给两个Job共用代码,原因很明确:GitHub Actions的每个Job都运行在独立的runner环境(虚拟机/容器)中,彼此的文件系统完全隔离。prepare Job里检出的代码只会存在于它自己的runner环境里,build Job启动时是全新的环境,没有任何之前Job的文件,自然找不到项目。

解决办法有两种:


方法一:用工件传递代码

在prepare Job里检出代码后,把整个代码目录上传为GitHub工件,然后在build Job里下载这个工件,就能拿到代码。

修改后的完整配置示例:

name: publish-nuget
on:
  push:
    branches:
      - main

jobs:
  prepare:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Get package version
      id: get_package_version
      uses: kzrnm/get-net-sdk-project-versions-action@v1.3.0
      with:
        proj-path: ProjectOne.csproj
    
    - name: Upload code artifact
      uses: actions/upload-artifact@v4
      with:
        name: source-code
        path: .  # 上传当前目录所有文件(即检出的代码)

  build:
    needs: prepare
    runs-on: ubuntu-latest
    strategy:
      matrix:
        projects: [
        'ProjectOne.csproj',
        'ProjectTwo.csproj',
        ]
    steps:
    - name: Download code artifact
      uses: actions/download-artifact@v4
      with:
        name: source-code
        path: .  # 下载到当前目录,恢复代码结构

    - name: Pack NuGet
      run: dotnet pack ${{ matrix.projects }} -p:PackageVersion=${{ steps.get_package_version.outputs.version }} --configuration Release

额外修正你配置里的两个问题:

  1. build Job里重复写了steps节点,这是语法错误,会导致后续步骤不执行,需合并为一个steps
  2. 版本变量要从prepare Job的输出中获取,即${{ steps.get_package_version.outputs.version }},原配置里的env.PACKAGE_VERSION未定义

方法二:每个需要代码的Job都执行checkout

就是你最初能正常运行的方式,在prepare和build Job里都添加actions/checkout@v3。虽然看起来重复,但GitHub Actions会自动缓存检出的代码,第二次checkout速度极快,而且配置简单,不容易出错。

修正语法后的配置示例:

name: publish-nuget
on:
  push:
    branches:
      - main

jobs:
  prepare:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Get package version
      id: get_package_version
      uses: kzrnm/get-net-sdk-project-versions-action@v1.3.0
      with:
        proj-path: ProjectOne.csproj
    
  build:
    needs: prepare
    runs-on: ubuntu-latest
    strategy:
      matrix:
        projects: [
        'ProjectOne.csproj',
        'ProjectTwo.csproj',
        ]
    steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Pack NuGet
      run: dotnet pack ${{ matrix.projects }} -p:PackageVersion=${{ steps.get_package_version.outputs.version }} --configuration Release

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:40:56