【问题标题】:How to access Maven dependency from Github Packages on a Github Actions workflow?如何在 Github Actions 工作流中从 Github 包访问 Maven 依赖项?
【发布时间】:2021-02-18 17:18:00
【问题描述】:

我的构建通过直接在 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 未授权

无法在 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 工作流中中断?

【问题讨论】:

    标签: maven github-actions github-package-registry


    【解决方案1】:

    根据你的问题,我想:

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

    如果你的library 是一个公共包,目前不幸的是,GitHub 不支持来自maven 对公共包的未经授权的访问。因此,您应该执行以下操作:

    1. 首先,您需要在您的配置文件设置中生成具有包读取访问权限的 PAT 访问令牌,在 developer setting 小节中:

    2. 转到app 存储库的设置部分,并在Secrets 的子部分中创建两个名为USER_NAME 的环境机密,其值包含您的GitHub 用户名(或library 包所有者的用户名);而ACCESS_TOKEN指向上一步创建的PAT token的值。

    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 文件可以包含:
    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 }}
    

    【讨论】:

      【解决方案2】:

      您需要使用 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 访问另一个用户的(公共)包存储库。 AFAIK,不需要任何令牌。我弄错了吗?
      • 是的,我弄错了。天哪,目前 GitHub 确实不允许 允许对未经身份验证的包进行读取访问, 开源与否。他们在想什么?无论如何,请阅读here。一个例子是here。你可能还需要这个XML encoder
      猜你喜欢
      • 2020-02-14
      • 1970-01-01
      • 2021-10-24
      • 2020-04-03
      • 2021-11-18
      • 2022-11-02
      • 2013-12-08
      • 2022-01-10
      相关资源
      最近更新 更多