如何在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
额外验证点
- 确认webpack配置输出路径正确:当前你的webpack配置将产物输出到
../wwwroot/dist(相对于ClientApp目录),与ASP.NET Core静态文件目录一致,无需修改。 - 可在
npm run build后添加ls wwwroot/dist命令,验证产物是否生成。 - 默认情况下ASP.NET Core发布会包含wwwroot下所有文件,无需额外配置发布规则。
内容的提问来源于stack exchange,提问作者d0rf47
相关产品推荐
相关产品推荐

