我有一个GitHub组织,它推送了一些套餐.它们可以通过https://github.com/orgs/[REDACTED]/packages访问,因此它们不仅仅是存储库.在我的一个repos中,我try 使用其他repos(微服务)的合同来创建包,但这个repo使用了我前面提到的一个包.

以下是我目前用于构建此合同包的YAML:

name: Publish [REDACTED].Domain.Shared package
on:
  push:
    branches:
      - release/shared/*
    paths:
      - "src/[REDACTED]/[REDACTED].Domain.Shared/**"
jobs:
  Publish-Package:
    runs-on: ubuntu-latest
    permissions:
      packages: write
      contents: read
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-dotnet@v3
        with:
          dotnet-version: "8.x"
          source-url: https://nuget.pkg.github.com/[REDACTED]/index.json
        env:
          NUGET_AUTH_TOKEN: ${{secrets.ACTION_TOKEN}}
      - run: dotnet restore src/[REDACTED]/[REDACTED].Domain.Shared
      - run: dotnet build src/[REDACTED]/[REDACTED].Domain.Shared --no-restore
      - run: dotnet pack --configuration Release src/[REDACTED]/[REDACTED].Domain.Shared
      - run: dotnet nuget push src/[REDACTED]/[REDACTED].Domain.Shared/bin/Release/*.nupkg

到了dotnet restore岁时,我得到的是:

/usr/share/dotnet/sdk/8.0.100/NuGet.targets(156,5):warning:GitHub Packages service无法验证您的请求.请确保您的访问令牌有效并且配置了适当的作用域.[/home/runner/work/[REDACTED].Domain.Shared/[REDACTED].Domain.Shared.csproj] 正在try "FindPackagesByIdAsync",以获取源"https://nuget.pkg.github.com/[REDACTED]/download/[REDACTED]/index. json". 响应状态代码不表示成功:401(未授权).

我的GitHub令牌设置了repo:allread:packageswrite:packages权限.

我不知道这是否重要,但下面是我的NuGet.Configer,它来自包含此合同库的SLN:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <packageSources>
        <clear />
        <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
        <add key="[REDACTED]" value="https://nuget.pkg.github.com/[REDACTED]/index.json" />
    </packageSources>
    <packageSourceMapping>
        <packageSource key="nuget.org">
            <package pattern="*" />
        </packageSource>
        <packageSource key="[REDACTED]">
            <package pattern="[REDACTED].*" />
        </packageSource>
    </packageSourceMapping>
</configuration>

Token和NuGet.Config对于所有repos都是相同的,它们都可以生成包-直到需要从我的组织下载另一个包的依赖项.

我try 将令牌的权限更改为所有可能的权限,但不起作用.我还试图从工作流中的actions/setup-dotnet@v3中删除DotNet auth,但都返回了相同的错误.

推荐答案

判断您的工作流中使用的secrets.ACTION_TOKEN是否具有正确的权限并且有效.它至少应该有read:packages scope个.

修改您的工作流以正确使用GitHub包进行身份验证.这涉及到设置NuGet CLI以使用GitHub令牌进行身份验证.

actions/setup-dotnet@v3步骤中删除source-url参数.该步骤之前try 配置NuGet源,但可能未正确设置身份验证.

与其依赖actions/setup-dotnet操作来配置NuGet源代码,不如try 添加明确的步骤来设置NuGet凭据,以访问GitHub包注册表:

  • 初始化新的NuGet配置(dotnet new nugetconfig)的新步骤.这将确保重置任何可能与您的身份验证设置冲突的现有NuGet配置.
  • 另一个新步骤,将GitHub包注册表添加为具有必要身份验证细节的NuGet源.它使用dotnet nuget add source命令添加GitHub包注册URL,以及存储在secrets.ACTION_TOKEN中的GitHub用户名和个人访问令牌(PAT).该命令将NuGet配置为在从GitHub包注册表访问包时使用这些凭据.
name: Publish [REDACTED].Domain.Shared package
on:
  push:
    branches:
      - release/shared/*
    paths:
      - "src/[REDACTED]/[REDACTED].Domain.Shared/**"
jobs:
  Publish-Package:
    runs-on: ubuntu-latest
    permissions:
      packages: write
      contents: read
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-dotnet@v3
        with:
          dotnet-version: "8.x"
      - name: Set up NuGet Credential Provider
        run: dotnet new nugetconfig
      - name: Add GitHub Package Registry to NuGet
        run: dotnet nuget add source https://nuget.pkg.github.com/[REDACTED]/index.json --name GPR --username [REDACTED] --password ${{secrets.ACTION_TOKEN}} --store-password-in-clear-text
      - run: dotnet restore src/[REDACTED]/[REDACTED].Domain.Shared
      - run: dotnet build src/[REDACTED]/[REDACTED].Domain.Shared --no-restore
      - run: dotnet pack --configuration Release src/[REDACTED]/[REDACTED].Domain.Shared
      - run: dotnet nuget push src/[REDACTED]/[REDACTED].Domain.Shared/bin/Release/*.nupkg

我添加了你的建议.凭据提供程序和GPR的步骤成功通过,但我仍然得到相同的401错误.我的令牌有repo, write:packages个权限.我甚至用相同的参数生成了另一个测试令牌,但它也不起作用.

仅用于测试,除了repowrite:packages之外,还可以try 一个具有read:packages权限的令牌.read:packages范围对于下载包来说是必不可少的.确保令牌与有权访问组织和特定包的用户相关联.

在GitHub操作工作流中设置凭据后,添加一个步骤以打印最终的NuGet.Config文件,以确保其配置正确.同样,这是为了测试(确保不在工作流输出中公开您的令牌).

- name: Print NuGet Config for Debugging
    run: cat NuGet.Config

这可能是一个环境问题.try 在您的机器上使用相同的NuGet.Config本地运行相同的命令,看看您是否可以成功地验证和恢复软件包.

如果您的NuGet.Config中有多个信号源,则信号源的顺序有时会导致问题.确保正确列出了GitHub程序包注册表源.dotnet restore命令应该为您组织的包确定GitHub源代码的优先级.

修改dotnet restore命令以明确指定源.这将确保恢复操作正在try 使用GitHub程序包注册表.

- run: dotnet restore src/[REDACTED]/[REDACTED].Domain.Shared --source "https://nuget.pkg.github.com/[REDACTED]/index.json"

我确实可以看到,在工作流执行期间在GitHub服务器上创建的nuget.config不包含任何凭据

在GitHub Actions工作流期间创建的NuGet.Config文件不包含凭据这一事实解释了为什么您仍然遇到401未经授权的错误:GitHub Actions运行器试图在没有必要身份验证的情况下访问GitHub包注册表,从而导致此问题.

Double-check that the dotnet nuget add source command is executed correctly, with the correct syntax.
And check if the secrets.ACTION_TOKEN is correctly set in your repository's secrets, and that it is being passed correctly into the GitHub Actions environment. Sometimes, environment variables can be overlooked or misconfigured.

GitHub Actions环境可能有限制或设置,禁止在NuGet.Config文件中以纯文本形式存储凭据.但是,这对于CI/CD管道中的非交互身份验证是必需的.

重新验证使用的GitHub令牌是否具有正确的权限(read:packageswrite:packagesrepo).并且令牌仍然有效并且没有过期.

作为一种解决办法,您可以使用所需的源在存储库中手动配置NuGet.Config文件,然后使用安全方法加密凭据.然后,该文件可以被解密并在GitHub操作运行期间使用.

另一种方法是在dotnet restore命令中直接使用环境变量进行身份验证.这样,您就不需要将凭据存储在NuGet.Config文件中.您可以将凭据指定为恢复命令的一部分.

- run: dotnet restore src/[REDACTED]/[REDACTED].Domain.Shared --source "https://nuget.pkg.github.com/[organization]/index.json" --configfile NuGet.Config --interactive false
   env:
      NUGET_AUTH_TOKEN: ${{ secrets.ACTION_TOKEN }}

考虑在GitHub操作工作流中添加调试步骤,以打印(小心,以避免expose 令牌)每个步骤的结果.这有助于找出这一过程的失败之处.


Thre OP在 comments 中证实:

找到了.--configfile是线索.

我需要向bothdotnet nuget add sourcedotnet restore添加--configfile nuget.config个参数,然后,为了推送包,我必须添加--source [myPackageSource].

然而,我们仍然不知道为什么在这个特定的情况下,这些参数是必要的.

.net相关问答推荐

从Couchbase删除_txn文档的推荐方法?""

当数据大量分布在微服务中时,我应该如何设计后端?

在 C# 中,如何使用泛型的基类将泛型接口的所有实例注入到单个构造函数中?

如何在 Windows 窗体上显示 ClickOnce 版本号

查找所有源硬编码字符串

为什么 Any() 不适用于 c# null 对象

如何让 DateTimePicker 显示一个空字符串?

如何在 C# 中创建 Word 文档?

OpenCV的.Net(dotNet)包装器?

序列化私有成员数据

在 JavaScript 中使用 String.Format?

覆盖方法上的 C# 可选参数

Dapper 是否支持 SQL 2008 表值参数?

返回 IList 是否比返回 T[] 或 List 更糟糕?

是否有可用的 WPF 备忘单?

等待 Async Void 方法调用以进行单元测试

如何防止任务的同步延续?

Environment.GetFolderPath(...CommonApplicationData) 在 Vista 上仍然返回C:\Documents and Settings\

带有嵌套控件的设计模式

obj 文件夹是为了什么而生成的?