GitHub packages:GitHub组织的单一Maven仓库

13

我希望使用GitHub Packages来存储GitHub组织中多个仓库的Maven构件。

目前,似乎对于每个项目,都需要单独配置(Maven)仓库以指向该(GitHub)仓库的Maven仓库:

<repository>
  <id>github</id>
  <name>GitHub OWNER Apache Maven Packages</name>
  <url>https://maven.pkg.github.com/OWNER/REPOSITORY</url>
</repository>

将要发布的Maven项目的相应配置为:

<distributionManagement>
   <repository>
     <id>github</id>
     <name>GitHub OWNER Apache Maven Packages</name>
     <url>https://maven.pkg.github.com/OWNER/REPOSITORY</url>
   </repository>
</distributionManagement>

有没有一种方法可以将所有软件包配置到一个单独的存储库中? 将存储库设置为组织中不同的现有或不存在的 (GitHub) 存储库会导致构建失败,删除 /REPOSITORY 也是如此。

有没有办法将所有软件包配置到一个单独的存储库中?将 REPOSITORY 设置为组织中已有的或不存在的 (GitHub) 存储库,都无法通过构建,即使完全删除 /REPOSITORY 也一样。


如果你真的想让它对公众可用,我建议去中央仓库而不是Github包https://central.sonatype.org/。 - khmarbaise
你的工作流程内容是什么?你是否已经创建了一个具有读写组织包访问权限的PAT,并在工作流程中使用它? - riQQ
@riQQ 目前,我们有 GitHub actions 可以将构件发布到 GitHub packages,并希望在本地开发和 GitHub packages 中使用它们。已生成用于本地读取访问的 PAT,并使用 Actions 中的内置令牌进行发布。 - Ivan G.
1
我一直在尝试通过从另一个Maven Java项目上传到另一个Github存储库来上传。无论我使用PAT还是Github令牌,都无法正常工作。 - Katlock
1
@IvanG,最终你搞定了吗? - Jakub Zalas
显示剩余3条评论
3个回答

6

对于只想避免多次指定<repository>标签的人们:

显然,GitHub并不关心从Registry拉取包时您设置的存储库是什么。在拉取时,软件包索引基于组织级别,而不是存储库级别

如果要从同一组织内的多个存储库中拉取包,可以直接这样做:

<repository>
  <id>github</id>
  <name>GitHub OWNER Apache Maven Packages</name>
  <url>https://maven.pkg.github.com/Your-Orgnazation/JUST-ENTER-ANYTHING-HERE</url>
</repository>

注意:您仍需要个人令牌来跨存储库拉取软件包,只是您不必多次指定<repository>标签。


确实,谢谢,只要确保您(或您用于构建的用户/机器人令牌)可以访问您尝试拉取的软件包。 - Serhii Povísenko

5

个人访问令牌

secrets.GITHUB_TOKEN是默认定义的,但只能足以部署到当前存储库。

要使其在多个存储库间工作,您需要在以下位置定义新的个人访问令牌:

选择范围为write:packages,所有repo范围应自动为您选择。

enter image description here

存储库/组织机密

接下来,在组织或需要发布软件包的每个存储库中定义一个机密。

给它起一个名字(即DEPLOY_GITHUB_TOKEN),并将其值设置为在前一步中创建的个人访问令牌。

enter image description here

存储库机密在存储库设置 > 秘密中定义。组织也有类似的区域。

GitHub操作

最后,确保将个人访问令牌作为名为GITHUB_TOKEN的环境变量传递给部署步骤。

在下面的示例中,它被设置为前一步中定义的DEPLOY_GITHUB_TOKEN机密的值。

name: Build

on:
  release:
    types: [created]
jobs:
  build:
    name: Build & Deploy
    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 with Maven
        run: mvn --batch-mode --update-snapshots install

      - name: Deploy to GitHub
        run: mvn --batch-mode -DskipTests -DuseGitHubPackages=true deploy
        env:
          GITHUB_TOKEN: ${{ secrets.DEPLOY_GITHUB_TOKEN }}

由于我在GitHub包存储库的分发管理中使用了专用的Maven配置文件,因此我还使用-DuseGitHubPackages=true激活了它。

Maven配置文件

在下面的配置文件示例中,我像@Danny Varod的回答中建议的那样,配置了分发管理以使用外部/共享库vlingo/vlingo-platform

<!-- pom.xml -->
<project>
  <!-- ... -->

  <profiles>
    <profile>
      <id>github</id>
      <activation>
        <property>
          <name>useGitHubPackages</name>
          <value>true</value>
        </property>
      </activation>
      <distributionManagement>
        <repository>
          <id>github</id>
          <name>GitHub Packages</name>
          <url>https://maven.pkg.github.com/vlingo/vlingo-platform</url>
        </repository>
      </distributionManagement>
    </profile>
  </profiles>
</project>

本文转载自:https://dev.to/jakub_zalas/how-to-publish-maven-packages-to-a-single-github-repository-3lkc

可以在vlingo仓库中找到一个可行的示例:https://github.com/vlingo/vlingo-platform/packages


注:该文介绍如何将Maven包发布到单个GitHub存储库,可以参考示例进行操作。

嗨@Jakub Zalas,我按照那篇文章中提到的方法进行了操作。但是我遇到了这个错误-> Error: Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy (default-deploy) on project demoproject: Failed to deploy artifacts: Could not find artifact com.example:demoproject:jar:3.0.1 in github (https://maven.pkg.github.com/******/test-platform) -> [Help 1]。你能帮忙解决一下吗?谢谢。 - Mani
我还将个人访问令牌添加到与您提到的相同范围的存储库机密中。 - Mani

1
我之前解决了这个问题,通过创建一个名为maven-packages的空仓库,将该组织所有存储库中的Maven包发布到该仓库中。

这使得可以在构建机器和部署环境上配置单个Maven存储库(除了Maven-central)以便拉取Maven库依赖项。

我没有这段代码(在之前的工作场所使用,现在我使用Python),不过我记得为此使用了mvn deploy命令行,如此处记录:

mvn deploy:deploy-file -DpomFile=<path-to-pom> \
  -Dfile=<path-to-file> \
  -DrepositoryId=<id-to-map-on-server-section-of-settings.xml> \
  -Durl=<url-of-the-repository-to-deploy>

我在构建过程中修改了pom.xml文件,插入了正确的部署库细节,因此发布只能通过构建完成(并将预发布细节添加到预发布版本号中)。这也使得可以添加一个外部稳定版本库(用于发布至Maven中央库)。
请参见此处的配置。

这似乎不起作用。在单个代码库中部署正常,但是一旦将URL更改为外部URL(而不是当前的代码库),我得到的只是“422无法处理实体”错误。即使个人访问令牌已设置了所有repo和package权限。 - Jakub Zalas
1
我上一次使用这个是大约一年前,现在无法访问工作流程。你尝试过我添加的配置答案链接吗?Github也有很好的支持。 - Danny Varod
最终,我删除了仓库,重新创建了它,一切都开始正常工作了...看起来我的最初尝试弄乱了一些东西,而且没有办法在不重新创建仓库的情况下解决。 - Jakub Zalas
1
@DannyVarod 默认令牌仅在您需要发布到当前存储库时起作用。如果您想要发布到另一个存储库,则需要定义一个新的用户访问令牌。我将其称为DEPLOY_GITHUB_TOKEN,定义为秘密,并传递给步骤:env: GITHUB_TOKEN: ${{ secrets.DEPLOY_GITHUB_TOKEN }} - Jakub Zalas
1
@JakubZalas 要么将此添加为答案,要么编辑我的答案。 - Danny Varod
显示剩余3条评论

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