使用GitHub Actions双YAML文件CI/CD推送包至GitHub Packages遇阻
在CI流程(ci.yml)中完成NuGet包打包并上传工件后,尝试在CD流程(cd.yml)中下载工件并推送至GitHub Packages时,遇到认证错误:
warn : Your request could not be authenticated by the GitHub Packages service. Please ensure your access token is valid and has the appropriate scopes configured.
已尝试使用默认GITHUB_TOKEN及具备包读写删权限的PAT,均未解决。
CI配置(ci.yml)
- name: Create Client Package run: dotnet pack ${{ env.CLIENT_NAME }} --no-build --configuration ${{ env.BUILD_CONFIGURATION }} --output ${{ env.PUBLISH_PATH }} - name: Create Model Package run: dotnet pack ${{ env.MODEL_NAME }} --no-build --configuration ${{ env.BUILD_CONFIGURATION }} --output ${{ env.PUBLISH_PATH }} - name: Create NBS Package run: dotnet pack ${{ env.NBS_NAME }} --no-build --configuration ${{ env.BUILD_CONFIGURATION }} --output ${{ env.PUBLISH_PATH }} - name: Upload NuGet Packages uses: actions/upload-artifact@v3 if: ${{ matrix.language == 'csharp' && (github.event.pull_request.merged || github.event_name == 'workflow_dispatch') }} with: name: ${{ github.event.repository.name }}-nuget path: ${{ env.NUGET_PATH }}/*.nupkg
CD配置(cd.yml)
- name: Download NuGet Packages from GitHub uses: dawidd6/action-download-artifact@v2.13.0 with: workflow: ci.yml workflow_conclusion: success name: ${{ github.event.repository.name }}-nuget path: ${{ env.NUGET_PATH }}/output search_artifacts: true - name: Push NuGet Packages to GitHub Packages run: dotnet nuget push ${{ env.PUBLISH_PATH }}/*.nupkg --source github --skip-duplicate --api-key ${{ secrets.ACTIONS_PAT }}
修正路径匹配问题
CD流程中包被下载到${{ env.NUGET_PATH }}/output,但推送命令引用的是${{ env.PUBLISH_PATH }}/*.nupkg,路径不匹配会导致找不到包或推送无效文件。将推送命令的路径改为:dotnet nuget push ${{ env.NUGET_PATH }}/output/*.nupkg --source https://nuget.pkg.github.com/OWNER/index.json --skip-duplicate --api-key ${{ secrets.ACTIONS_PAT }}替换
OWNER为你的GitHub用户名或组织名。确认PAT的权限范围
确保创建PAT时勾选了以下权限:write:packages:允许推送包read:packages:允许拉取包delete:packages(可选):允许删除包
同时确认PAT未过期,且是针对当前仓库或所在组织创建的。
显式配置GITHUB_TOKEN权限
如果使用默认GITHUB_TOKEN,需在cd.yml开头添加权限声明,授予包写入权限:permissions: packages: write contents: read默认
GITHUB_TOKEN权限受限,必须显式声明才能操作GitHub Packages。检查NuGet包ID格式
GitHub Packages要求NuGet包ID必须以你的GitHub用户名或组织名为前缀(例如MyOrg.MyPackage),如果包ID不符合该格式,会导致推送失败。添加调试步骤验证环境
在推送步骤前添加调试命令,确认包存在且密钥有效:- name: Debug Environment run: | echo "Download path: ${{ env.NUGET_PATH }}/output" ls -la ${{ env.NUGET_PATH }}/output echo "API key is set: ${{ secrets.ACTIONS_PAT != '' }}"
内容的提问来源于stack exchange,提问作者Demet

