能否仅调用一次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
额外修正你配置里的两个问题:
- build Job里重复写了
steps节点,这是语法错误,会导致后续步骤不执行,需合并为一个steps- 版本变量要从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
相关产品推荐
相关产品推荐

