如何在Github Actions工作流中从Github Packages访问Maven依赖?

10
我的构建正在本地工作,通过在pom.xml<repository>元素中直接使用用户+PAT(个人访问令牌)。
<repository>
    <id>github</id>
    <name>GitHub Packages</name>
    <url>https://[USER]:[PAT]@maven.pkg.github.com/myaccount/myrepo</url>
</repository>

从Github下载: https://[USER]:[PAT]@maven.pkg.github.com/myaccount/myrepo/org/springframework/flex/spring-flex-core/1.6.1.BUILD-SNAPSHOT/maven-metadata.xml (以592 B / s的速度下载,大小为796 B)
我没有配置settings.xml
但是,在Github Actions工作流程中出现了问题:
警告:无法传输元数据 org.springframework.flex:spring-flex-core:1.6.1.BUILD-SNAPSHOT/maven-metadata.xml 从/github (***maven.pkg.github.com/myaccount/myrepo) 收集依赖失败:身份验证失败 https://maven.pkg.github.com/myaccount/myrepo/org/springframework/flex/spring-flex-core/1.6.1.BUILD-SNAPSHOT/maven-metadata.xml 401 Unauthorized
收集依赖项失败,依赖于org.springframework.flex:spring-flex-core:jar:1.6.1.BUILD-SNAPSHOT: 无法读取org.springframework.flex:spring-flex-core:jar:1.6.1.BUILD-SNAPSHOT的工件描述符。
我的工作流是这样的:
steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8
      - name: Cache Maven packages
        uses: actions/cache@v2
        with:
          path: ~/.m2
          key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
          restore-keys: ${{ runner.os }}-m2
      - name: Build with Maven
        run: mvn -B package --file dev/server/pom.xml

为什么它在Github工作流上会出现故障?

2个回答

16

根据您的问题,我猜测:

  • 您在GitHub Package中部署了一个maven项目,我们称之为library
  • 您有另一个maven项目,它在其pom.xml文件中使用library包作为依赖项,我们称这个项目为您的app
  • 您想要在app仓库中使用GitHub Actions添加自动化构建工作流程

即使您的library是公共包,目前不幸的是GitHub不支持从maven进行未授权访问。因此,您应该按照以下步骤操作:

  1. 首先,您需要在配置文件中生成一个具有包读取权限的PAT访问令牌,在开发者设置子部分中进行设置: enter image description here

  2. 进入您的app仓库的设置部分,在Secrets子部分中创建两个环境变量,分别称为USER_NAMEACCESS_TOKEN。其中USER_NAME变量的值包含您的GitHub用户名(或者library包的所有者的用户名),ACCESS_TOKEN指向在上一步中创建的PAT令牌的值。

  3. 现在,在app仓库中创建一个maven-settings.xml文件,例如可以与您的workflow.yml文件并列创建。该文件包含:

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <activeProfiles>
        <activeProfile>github</activeProfile>
    </activeProfiles>
    <profiles>
        <profile>
            <id>github</id>
            <repositories>
                <repository>
                    <id>central</id>
                    <url>https://repo1.maven.org/maven2</url>
                </repository>
                <repository>
                    <id>github</id>
                    <url>https://maven.pkg.github.com/owner_username/package_name</url>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                    <releases>
                        <enabled>true</enabled>
                  </releases>
                </repository>
            </repositories>
        </profile>
    </profiles>

    <servers>
        <server>
            <id>github</id>
            <username>${env.USER_NAME}</username>
           <password>${env.ACCESS_TOKEN}</password>
        </server>
    </servers>

</settings>
  1. 最后,在工作流中运行Maven命令时使用这些设置文件。例如,workflow.yaml文件可以包含:
  1. 最后,在工作流程中运行Maven命令时,请使用这些配置文件。例如,workflow.yaml文件可能包含以下内容:
name: Java CI with Maven

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 8
      uses: actions/setup-java@v2
      with:
        java-version: '8'
        distribution: 'adopt'
        
    - name: Build with Maven
      run: mvn -s $GITHUB_WORKSPACE/.github/workflows/maven-settings.xml -B package --file pom.xml 
      env:
        USER_NAME: ${{ secrets.USER_NAME }}
        ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }}

1
即使我给令牌所有可能的访问权限,传输元数据仍然会出现401错误。 - djg
有没有办法更新库包版本并在workflow.yml文件中使用它们? - I.vignesh David

-1

您需要在操作中使用GITHUB_TOKEN。 请参见此处:https://docs.github.com/en/packages/guides/configuring-apache-maven-for-use-with-github-packages#authenticating-to-github-packages

要使用GitHub Actions工作流进行身份验证:对于软件包注册表(PACKAGE-REGISTRY.pkg.github.com),您可以使用GITHUB_TOKEN。

name: Java CI with Maven

on:
  push:
    branches: [ maven ]

jobs:
  build:

runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
  uses: actions/setup-java@v1
  with:
    java-version: 1.8
- name: Build core with Maven

...

- name: Publish package core
  run: mvn --batch-mode deploy --file myproject.core/pom.xml
  env:
       GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

我遇到了同样的问题,但我没有部署任何东西,只是尝试使用Maven访问另一个用户的(公共)软件包仓库。据我所知,这并不需要任何令牌。我错了吗? - kriegaex
3
是的,我错了。当前的GitHub不允许未经身份验证的读取包,无论是开放源代码还是其他类型。他们在想什么?无论如何,请查看此处。这里有一个示例。您可能还需要此XML编码器。 - kriegaex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接