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

如何在Github Actions中让.NET Core发布步骤获取NPM构建文件

解决Github Actions中.NET发布无法访问NPM构建文件的问题

问题核心

你当前的工作流拆分了两个独立Job,但存在步骤顺序错误、产物移动逻辑偏差的问题,导致NPM构建生成的文件无法被.NET发布步骤正确读取。同时双Job设计增加了不必要的复杂度,可优化为单Job简化流程。


方案一:修复现有双Job配置

1. 修正Job1的步骤顺序

actions/checkout必须放在Node环境配置之前,确保先拉取项目代码再执行NPM命令:

job1:
  runs-on: ubuntu-latest    
  strategy:
    matrix:
      node-version: [15.x]
  steps:
  - name: 拉取项目代码
    uses: actions/checkout@v3
  - name: 配置Node.js环境
    uses: actions/setup-node@v3
    with:
        node-version: ${{ matrix.node-version }}
  - run: npm i
    working-directory: ./ClientApp    
  - run: npm run build    
    working-directory: ./ClientApp        
  - name: 上传NPM构建产物
    uses: actions/upload-artifact@v3
    with:
      name: npm-post-build
      path: ./wwwroot/dist/**

2. 修正Job2的产物下载逻辑

将Artifact直接下载到.NET发布所需的目标目录,无需额外移动操作:

job2:
  needs: job1
  runs-on: ubuntu-latest    
  steps:    
  - name: 安装Octopus Deploy CLI
    uses: OctopusDeploy/install-octopus-cli-action@v1
    with:
      version: '*'
  - uses: actions/checkout@v3
  - name: 配置.NET环境
    uses: actions/setup-dotnet@v3
    with:
      dotnet-version: 7.0.x
  - name: 还原依赖
    run: dotnet restore
  - name: 下载NPM构建产物到指定目录
    uses: actions/download-artifact@v3
    with: 
      name: npm-post-build
      path: wwwroot/dist  # 直接将产物放到wwwroot/dist,覆盖原有内容
  - name: 构建项目
    run: dotnet build --no-restore   
  - name: 发布项目
    run: dotnet publish -p:PublishProfile=FolderProfile -o website    
  # 后续Octopus打包、推送步骤保持不变

方案二:合并为单Job(推荐)

双Job设计完全没必要,将NPM构建与.NET发布放在同一个Job中,文件直接在同一环境共享,无需上传下载Artifact,流程更高效简洁:

name: .net Publish

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

jobs:      
  build-and-publish:
    runs-on: ubuntu-latest    
    steps:
    # 1. 拉取项目代码
    - name: 拉取项目代码
      uses: actions/checkout@v3
    # 2. 执行NPM构建
    - name: 配置Node.js环境
      uses: actions/setup-node@v3
      with:
          node-version: 15.x
    - run: npm i
      working-directory: ./ClientApp    
    - run: npm run build    
      working-directory: ./ClientApp        
    # 3. 执行.NET构建与发布
    - name: 配置.NET环境
      uses: actions/setup-dotnet@v3
      with:
        dotnet-version: 7.0.x
    - name: 还原依赖
      run: dotnet restore
    - name: 构建项目
      run: dotnet build --no-restore   
    - name: 发布项目
      run: dotnet publish -p:PublishProfile=FolderProfile -o website    
    # 4. Octopus打包与推送
    - name: 安装Octopus Deploy CLI
      uses: OctopusDeploy/install-octopus-cli-action@v1
      with:
        version: '*'
    - name: 打包项目
      run: |
          shopt -s globstar
            paths=()
            for i in website/**; do
              dir=${i%/*}
              echo ${dir}
              paths=(${paths[@]} ${dir})
            done
            eval uniquepaths=($(printf "%s\n" "${paths[@]}" | sort -u))
            for i in "${uniquepaths[@]}"; do
              echo $i
            done        
            packages=()
            versions=()            
            for path in "${uniquepaths[@]}"; do
              dir=${path}/../../../..
              parentdir=$(builtin cd $dir; pwd)
              projectname=${parentdir##*/}          
              octo pack \
              --basePath ${path} \
              --id ${projectname} \
              --version 1.0.0 \
              --format zip \
              --overwrite
              packages=(${packages[@]} "${projectname}.1.0.0.zip")
              versions=(${versions[@]} "${projectname}:1.0.0")
            done
        
            printf -v joined "%s," "${packages[@]}"
            echo "::set-output name=artifacts::${joined%,}"
            printf -v versionsjoinednewline "%s\n" "${versions[@]}"
            versionsjoinednewline="${versionsjoinednewline//'%'/'%25'}"
            versionsjoinednewline="${versionsjoinednewline//$'\n'/'%0A'}"
            versionsjoinednewline="${versionsjoinednewline//$'\r'/'%0D'}"
            echo "::set-output name=versions_new_line::${versionsjoinednewline%\n}"
            echo "prepackage complete ${packages}"            
    - name: 推送包到Octopus Deploy
      uses: OctopusDeploy/push-package-action@v3
      env:
            OCTOPUS_URL: https://****.octopus.app/
            OCTOPUS_API_KEY: *****
            OCTOPUS_SPACE: 'Default'
      with:
            overwrite_mode: OverwriteExisting
            packages:  runner.1.0.0.zip

额外验证点

  1. 确认webpack配置输出路径正确:当前你的webpack配置将产物输出到../wwwroot/dist(相对于ClientApp目录),与ASP.NET Core静态文件目录一致,无需修改。
  2. 可在npm run build后添加ls wwwroot/dist命令,验证产物是否生成。
  3. 默认情况下ASP.NET Core发布会包含wwwroot下所有文件,无需额外配置发布规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:05:55