Git Hub Actions 使用 maven 对其他存储库的私有包注册表进行身份验证

Luk*_*ker 2 java github maven github-actions

项目设置如下:

  1. 项目 A(一些 Java 应用程序)
  2. 项目 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>
Run Code Online (Sandbox Code Playgroud)

项目 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>
Run Code Online (Sandbox Code Playgroud)

为了对项目 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>
Run Code Online (Sandbox Code Playgroud)

在 github actions 中的持续集成工作流程中,我执行以下步骤,将项目 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
Run Code Online (Sandbox Code Playgroud)

正如我所读到的,我无法使用 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]
Run Code Online (Sandbox Code Playgroud)

有没有人有一个使用 Maven 的 github 操作工作流程的工作示例,该工作流程引用了来自另一个私有存储库的 github 包注册表中存储的依赖项?我感到困惑和沮丧,如此简单的事情却需要花费如此多的时间来设置。

Luk*_*ker 8

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

 - 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 }}"
            }]
Run Code Online (Sandbox Code Playgroud)

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

Prepare maven settings: /home/runner/.m2/settings.xml
Run Code Online (Sandbox Code Playgroud)

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