如何在 Github Actions 工作流中从 Github 包访问 Maven 依赖项?
Posted
技术标签:
【中文标题】如何在 Github Actions 工作流中从 Github 包访问 Maven 依赖项?【英文标题】:How to access Maven dependency from Github Packages on a Github Actions workflow? 【发布时间】: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 工作流中中断?
【问题讨论】:
【参考方案1】:根据你的问题,我想:
您在GitHub Package
中部署了maven 项目,我们称之为library
您有另一个 maven 项目,它使用 library
包作为其 pom.xml 中的依赖项,我们将此项目称为您的 app
您想使用GitHub Actions
存储库中的GitHub Actions
添加自动构建工作流
如果你的library
是一个公共包,目前不幸的是,GitHub 不支持来自maven
对公共包的未经授权的访问。因此,您应该执行以下操作:
首先,您需要在您的配置文件设置中生成具有包读取访问权限的 PAT 访问令牌,在 developer setting
小节中:
转到app
存储库的设置部分,并在Secrets
的子部分中创建两个名为USER_NAME
的环境机密,其值包含您的GitHub 用户名(或library
包所有者的用户名);而ACCESS_TOKEN
指向上一步创建的PAT token的值。
现在,在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>
-
并且,最后使用这些设置文件,在工作流中运行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。以上是关于如何在 Github Actions 工作流中从 Github 包访问 Maven 依赖项?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 GitHub Actions 克隆 BitBucket 项目?
如何在 GitHub Actions 工作流程中进行 apt-get install?
如何将 Docker 与 GitHub Actions 一起使用?
如何将降价页面附加到 GitHub Actions 工作流程运行摘要?