うっかりgradlew publishでReceived status code 422 from server: Unprocessable Entityを喰らう

# はじめに

人生初のGithub Packagesへのデプロイに挑戦していた。

- [GitHub Packagesで利用するためにGradleを設定する - GitHub Docs](https://docs.github.com/ja/enterprise-server@2.22/packages/guides/configuring-gradle-for-use-with-github-packages)
- [[初心者向け] GitHub Packagesでパッケージを公開する | Developers.IO](https://dev.classmethod.jp/articles/introduction-to-github-packages/)

とかを読みながら

```gradle
apply plugin: 'maven-publish'

publishing {
    repositories {
        maven {
            name = "GitHubPackages"
            url = 'https://maven.pkg.github.com/yumetodo/LogisticsPipes'
            credentials {
                username = project.findProperty("gpr.user") ?: System.getenv("GITHUB_ACTOR")
                password = project.findProperty("gpr.key") ?: System.getenv("GITHUB_TOKEN")
            }
        }
    }

    publications {
        gpr(MavenPublication) {
            artifactId = archivesBaseName
            from(components.java)
        }
    }
}
```

を追記して`gradlew publish`すると


```
> Task :publishGprPublicationToGitHubPackagesRepository FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':publishGprPublicationToGitHubPackagesRepository'.
> Failed to publish publication 'gpr' to repository 'GitHubPackages'
   > Could not PUT 'https://maven.pkg.github.com/yumetodo/LogisticsPipes/rs485/logisticspipes/LogisticsPipes/0.9.4.local/LogisticsPipes-0.9.4.local.jar'. Received status code 422 from server: Unprocessable Entity
```

`Received status code 422 from server: Unprocessable Entity`を喰らってしまった。どうすればいいのさ？

# 解決策を探す

> [Gradle Maven deploy failing with 422 Unprocessable Entity - Code to Cloud / GitHub Packages - GitHub Support Community](https://github.community/t/gradle-maven-deploy-failing-with-422-unprocessable-entity/137299)
>
> artifacId should be lowercase to be able to push to github packages

`artifacId`ってなんですか・・・？

> [第53章 Mavenプラグイン#53.6.4. MavenのPOM生成 ](http://gradle.monochromeroad.com/docs/userguide/maven_plugin.html#sec:maven_pom_generation)
>
> archiveTask.baseNameをデフォルト以外の値に設定したときは、uploadTask.repositories.mavenDeployer.pom.artifactIdを同じ値に設定することを忘れないでください。 さもないと、近いうちに、同じビルド内の他プロジェクトで生成されたPOMから、プロジェクトが誤ったartifact IDで参照されてしまうかもしれません。 

`uploadTask`じゃないけど、そういえば`archivesBaseName`は変更している・・・

> [Maven Publish Plugin#Identity values in the generated POM](https://docs.gradle.org/current/userguide/publishing_maven.html#sec:identity_values_in_the_generated_pom)
>
>
```gradle
publishing {
    publications {
        maven(MavenPublication) {
            groupId = 'org.gradle.sample'
            artifactId = 'library'
            version = '1.1'
            from components.java
        }
    }
}
```

なるほど、そこに`artifactId`できるのか

# 結論

```diff_gradle
apply plugin: 'maven-publish'

publishing {
    repositories {
        maven {
            name = "GitHubPackages"
            url = 'https://maven.pkg.github.com/yumetodo/LogisticsPipes'
            credentials {
                username = project.findProperty("gpr.user") ?: System.getenv("GITHUB_ACTOR")
                password = project.findProperty("gpr.key") ?: System.getenv("GITHUB_TOKEN")
            }
        }
    }

    publications {
        gpr(MavenPublication) {
+           artifactId = archivesBaseName
            from(components.java)
        }
    }
}
```