Github Actions 使用 maven 对另一个存储库的私有包注册表进行身份验证

Posted

技术标签:

【中文标题】Github Actions 使用 maven 对另一个存储库的私有包注册表进行身份验证【英文标题】:Git Hub Actions Authentication with maven to private package registry of other repository 【发布时间】:2021-04-28 01:21:44 【问题描述】:

项目设置如下:

    项目 A(一些 Java 应用程序) 项目 B(一些 Java 库)

两者都是用 maven 构建的。项目 B 将其包发布到其自己存储库的 github 包注册表中。项目 A 依赖于 pom.xml 中项目 B 的工件,看起来有点像这样:

<dependency>
   <groupId>com.company</groupId>
   <artifactId>library-project-b</artifactId>
   <version>0.0.1-SNAPSHOT</version>
</dependency>

项目 A 还包括对项目 B 的包注册表的以下存储库引用:

<repository>
   <id>github-library-project-b</id>
   <name>Project B Github packages repositories</name>
   <url>https://maven.pkg.github.com/organization/library-project-b</url>
   <releases>
      <enabled>true</enabled>
   </releases>
   <snapshots>
      <enabled>true</enabled>
   </snapshots>
</repository>

为了对 Porject B 的包注册表进行身份验证,项目 A 还包含一个 settings.xml,它具有通过环境变量设置的凭据,这些凭据是通过 Github 操作的机密提供的:

<server>
   <id>github-library-project-b</id>
   <username>$env.USER_PACKAGE_READ</username>
   <password>$env.TOKEN_PACKAGE_READ</password>
</server>

在 github 操作中的持续集成工作流中,我有以下步骤,它将用于项目 B 的注册表访问的存储库中的机密映射到 settings.xml 中使用的环境变量,并通过 mvn 命令开始构建:

- name: Build Package
  env:
     USER_PACKAGE_READ: $ secrets.USER_PACKAGE_READ 
     TOKEN_PACKAGE_READ: $ secrets.TOKEN_PACKAGE_READ 
  run: mvn -B --settings settings.xml clean package --file pom.xml -DskipTests

正如我所读到的,我不能使用 GITHUB_TOKEN 访问另一个存储库的包注册表,因为 git hub 操作在其中运行,我在我的用户帐户上创建了一个个人访问令牌。 (有 package_read 权限)


但无论我尝试什么 - 在构建阶段,我总是会在尝试下载工件的 maven 构建命令错误中遇到以下 401 错误:

Error:  Failed to execute goal on project PROjECT-A: Could not resolve dependencies for project com.company:ms-gp-events:jar:0.0.1-SNAPSHOT: Failed to collect dependencies at com.company:library-project-b:0.0.1-SNAPSHOT: Failed to read artifact descriptor for com.company:library-project-b:0.0.1-SNAPSHOT: Could not transfer artifact com.company:library-project-b:0.0.1-SNAPSHOT from/to github-library-project-b (https://maven.pkg.github.com/organization/library-project-b): Authentication failed for https://maven.pkg.github.com/company/library-project-b/com/company/library-project-b/0.0.1-SNAPSHOT/library-project-b-0.0.1-SNAPSHOT.pom 401 Unauthorized -> [Help 1]

有没有人使用 maven 的 github 操作工作流的工作示例,它引用了存储在另一个私有存储库的 github 包注册表中的依赖项?这么简单的东西需要这么多时间来设置,我感到困惑和沮丧。

【问题讨论】:

【参考方案1】:

我仍然不确定,为什么我自己放置在项目 A 根目录中的 settings.xml 不起作用(可能在 setup java 步骤中缺少一些配置,但我不会做根本原因分析在那里,因为我没有无限的时间)。我通过在 github 操作中使用 maven-settings-action 作为“正常”步骤找到了解决方法:

 - uses: s4u/maven-settings-action@v2.3.0
        with:
          servers: |
            [
                "id": "github-library-project-b",
                "username": "$ secrets.USER_PACKAGE_READ ",
                "password": "$ secrets.TOKEN_PACKAGE_READ "
            ]

操作步骤将在用户主目录中创建 settings.xml:

Prepare maven settings: /home/runner/.m2/settings.xml

此 settings.xml 最终将生效并允许针对项目 B 的包注册表进行身份验证。

【讨论】:

以上是关于Github Actions 使用 maven 对另一个存储库的私有包注册表进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

通过 GitHub Actions 自动发布项目到 Maven 中央仓库

通过 GitHub Actions 自动发布项目到 Maven 中央仓库

Github Java Maven Actions 持续集成 POM 是在引用自己

在 Github Actions 中获取 Maven 项目版本

Maven 构建中的 -B 开关是啥?我在 GitHub Actions 中看到它,但在其他地方没有看到

GitHub Actions 工作流