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 项目版本