尝试使用 github 操作(maven)部署到 github 包时出现错误代码 400

Error Code 400 when trying to (maven) deploy to github packages using github actions

我正在努力完成使用 github 操作工作流将 Maven 项目部署到 github 包的(看似)简单的任务。首先,这是我在 maven deploy 阶段遇到的错误:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project [project name]: Failed to retrieve remote metadata [groupId]:[artifactId]:1.0-SNAPSHOT/maven-metadata.xml: Could not transfer metadata [groupId]:[artifactId]:1.0-SNAPSHOT/maven-metadata.xml from/to github (https://maven.pkg.github.com/[username]/[repository]): Failed to transfer file https://maven.pkg.github.com/[username]/[repository]/[groupId as path]/[artifactId]/1.0-SNAPSHOT/maven-metadata.xml with status code 400 -> [Help 1]

(信息:我用 [括号] 中的通用术语替换了不必要的 and/or 私人具体信息)

最有可能的是,实际的 maven-metadata.xml 文件不是问题,因为我之前已经看到状态为 400 的 "could not upload checksum" 之类的警告。我猜 maven-metadata.xml 只是它失败的第一个文件,但可能我对这个假设完全错误,如果是这样请告诉我。

可能最重要的文件是工作流 yaml 文件:

name: Deploy SNAPSHOT (develop)

on:
  push:
    branches:
      - develop

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v1
      - name: Set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 11
      - name: Maven Deploy
        env:
          GITHUB_USERNAME: x-access-token
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: mvn --settings settings.xml -B -e -Dmaven.wagon.http.pool=false clean deploy

也很重要:maven settings.xml 文件:

<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-packages</activeProfile>
    </activeProfiles>

    <profiles>
        <profile>
            <id>github-packages</id>
            <repositories>
                <repository>
                    <id>central</id>
                    <url>https://repo1.maven.org/maven2/</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
                <repository>
                    <id>github</id>
                    <name>GitHub [username] Apache Maven Packages</name>
                    <url>https://maven.pkg.github.com/[username]</url>
                </repository>
            </repositories>
        </profile>
    </profiles>

    <servers>
        <server>
            <id>github</id>
            <username>${env.GITHUB_USERNAME}</username>
            <password>${env.GITHUB_TOKEN}</password>
        </server>
    </servers>
</settings>

(信息:括号中的值与之前相同)

最后,我的 Maven 项目的父 pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>[groupId]</groupId>
    <artifactId>[artifactId]</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        [child modules]
    </modules>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <maven.compiler.release>11</maven.compiler.release>
    </properties>

    <dependencies>
        [my dependencies]
    </dependencies>

    <distributionManagement>
        <repository>
            <id>github</id>
            <name>GitHub [username] Apache Maven Packages</name>
            <url>https://maven.pkg.github.com/[username]/[repository]</url>
        </repository>
    </distributionManagement>


</project>

也许说 GitHub 存储库完全属于我,因此我应该拥有它的所有管理权限。

我尝试过的事情:

我现在做了一些研究,发现我的问题似乎并不少见。虽然,到目前为止,我发现的所有解决方案都没有奏效。

  1. Official GitHub documentation for setting up workflows

首先,我使用这个网站作为参考。

  1. This Whosebug Question

我基本上坚持我在这个问题及其答案中找到的所有建议。

  1. This other Whosebug Question about nexus deploys

这个问题的accepted answer提供了一个检查表。我试图检查所有要点是否适合我,尽管我无法验证所有内容。我没有发现基于此清单的任何问题。

  1. This question on the GitHub community forum

这个问题中显示的错误看起来非常像我遇到的错误,建议的解决方案仍然没有为我解决任何问题。

  1. This Answer on a similar GitHub community forum question

此答案建议使用个人访问令牌而不是 GITHUB_TOKEN。我试过了,但没有任何改变。

我需要什么

当然,如果有人能告诉我我的案例的确切问题是什么,我当然会很高兴,但它不需要那么具体。我正在尝试设置最基本的管道,目前我不想做的不仅仅是将 Maven 快照存储库部署到 github 包(使用 github 操作)。所以,如果有人能告诉我如何正确地一般来说,那也很好。谢谢!

我自己也算算出来了,但是结果很不满意。这里的主要问题是:

Note: GitHub Packages does not support SNAPSHOT versions of Apache Maven. Make sure you disable SNAPHOT in your ~/.m2/settings.xml file.

(Source)

所以,好像GitHubPackages不支持构建maven快照库,否则很实用。我的计划是建立一个工作流,在推送开发时在包注册表上部署一个新的 SNAPSHOT。 Maven 快照存储库不需要用于部署的唯一版本号,这意味着我可以为每次推送构建一个新版本,但实际的依赖版本保持不变。然后每个人都可以轻松地试用我的 develop 分支的最新状态,只需在他们的 pom 文件中包含固定的快照版本。

现在,如何解决我的问题:

因为 GitHub 包不支持快照存储库,您必须从 pom 文件的 project.version 标记的值中删除关键字“SNAPSHOT”。基本上你可以把所有其他版本的描述放在那里,但现在它是独一无二的。但是,如果您删除所有 SNAPSHOT 关键字,工作流应该正确地将包部署到 GitHub 包注册表,至少它对我有用。

如果有人知道 "hack" 解决这个 SNAPSHOT 问题的方法,请告诉我。否则这是我迄今为止找到的唯一可行的解​​决方案。