#gradle #gitlab #gitlab-ci #gradle-kotlin-dsl
#gradle #gitlab #gitlab-ci #gradle-kotlin-dsl
Вопрос:
Я пытаюсь опубликовать некоторые артефакты jar в реестре пакетов gitlab, но получаю эту ошибку с сервера :
Received status code 415 from server: Unsupported Media Type
Вот раздел публикации моего build.gradle.kts :
publishing {
publications {
create<MavenPublication>("maven"){
artifact(tasks["bootJar"])
}
}
repositories {
maven {
url = uri("https://gitlab.com/api/v4/groups/my-group/-/packages/maven")
name = "Gitlab"
credentials(HttpHeaderCredentials::class) {
name = "Token"
value = System.getenv("CI_JOB_TOKEN")
}
authentication {
create<HttpHeaderAuthentication>("header")
}
}
}
}
В моем gitlab-ci я добавил задачу для публикации артефактов :
deploy:
stage: deploy
script: gradle publish
only:
- master
Любая помощь будет оценена
Комментарии:
1. Привет, Дмитрий, я новичок в GitLab и Maven. Мне нужно опубликовать JAR в реестре пакетов GitLab с помощью Maven. Не могли бы вы помочь, как я могу добиться того же. Спасибо!
Ответ №1:
Быстрый ответ
Замените URL-адрес публикации, указывающий на область действия группы, на тот, который указывает на репозиторий конкретного пакета, например, на gitlab.com
:
https://gitlab.com/api/v4/projects/<your-project-id>/packages/maven
<your-project-id>
Конечно, вам нужно заменить свой конкретный идентификатор проекта.
В связи с этим цитата из docs.gitlab:
Примечание: во всех случаях вам нужен URL-адрес, специфичный для проекта, для загрузки пакета в разделе distributionManagement.
Или, другими словами: только раздел общих репозиториев может использовать ваш groups-url для поиска других уже опубликованных артефактов! (Я также должен был это понять). Итак:
- вы не можете опубликовать в group-package-store в gitlab, вы можете просто выполнить поиск там.
- Публикация всегда отправляется в хранилище пакетов, специфичное для проекта, которое затем также будет видно в групповой области.
Пример конфигурации gradle (kotlin-dsl)
repositories {
mavenCenter()
jcenter()
// Here you USE the group api/v4 url for SEARCHING packages
maven {
name = "GitLab"
url = uri("https://gitlab.com/api/v4/groups/my-group/-/packages/maven")
credentials(HttpHeaderCredentials::class) {
name = "Job-Token"
value = System.getenv("CI_JOB_TOKEN")
}
authentication {
create<HttpHeaderAuthentication>("header")
}
}
}
publishing {
publications {
create<MavenPublication>("maven"){
artifact(tasks["bootJar"])
}
}
repositories {
maven {
// here your PROVIDE the PROJECT-URI for publishing your package
// in the project-specific package-space which is also visible at
// the group scope above
url = uri("https://gitlab.com/api/v4/projects/<your-project-id>/packages/maven")
name = "Gitlab"
credentials(HttpHeaderCredentials::class) {
name = "Job-Token"
value = System.getenv("CI_JOB_TOKEN")
}
authentication {
create<HttpHeaderAuthentication>("header")
}
}
}
}
Подробная информация
Существует несколько сценариев взаимодействия с maven-repository-space в GitLab. Три переключателя:
- Место, где вы хотите искать существующие опубликованные пакеты
- project-scope (
https://.../api/v4/projects/<project-id>/packages/maven
) - group-scope (
https://.../api/v4/groups/<group-id>/-/packages/maven
) - instance-scope (
https://.../api/v4/packages/maven
)
- project-scope (
- Метод авторизации, который вы хотите использовать
- Место, где вы хотите опубликовать свой пакет
- это всегда должен быть конкретный проект-url (
https://.../api/v4/projects/<project-id>/packages/maven
)
- это всегда должен быть конкретный проект-url (
Комментарии:
1. Следуйте вашему ответу, и вместо этого я получил 403: запрещено. Перепробовал все 3 вида токенов (с их соответствующими заголовками, ofc). Интересно, в чем здесь проблема? Я использую gradle 6.5 и Gitlab 13.6.1
2. @ThanhNhan Мне удалось получить все виды ошибок, но не 403. Из моих ошибок я думаю, что если вы получаете 415, это означает, что вы не публикуете в допустимом репозитории пакетов, в то время как 401 означает, что вы используете правильный URL-адрес, но неправильно настроили авторизацию, что является основной проблемой, с которой я столкнулся: я работал с примерами из других репозиториев, где вынеобходимо использовать
<username>
, и<password>
это не относится к gitlab — пожалуйста, обратите пристальное внимание наsettings.xml
примеры в документации по авторизации.3. Спасибо за совет @Guss. На самом деле, я использовал неправильный URI. 403 был из другой службы, размещенной на том же сервере с другим портом.
Ответ №2:
Я думаю, что самое главное — убедиться, что вы включили архивы в своем проекте:
- Перейдите в настройки проекта
- Развернуть разрешения
- Включите «Пакеты»
Ответ №3:
По-видимому, есть и другие причины состояния ответа 415 Unsupported Media Type
:
Я столкнулся с тем же сообщением об ошибке при попытке опубликовать в репозитории проекта. Ошибка, которую я допустил, заключалась в использовании URL-кодированного пути проекта вместо идентификатора проекта в URL-адресе репозитория.
Из документации Gitlab (курсив добавлен):
Для извлечения артефактов используйте либо URL-кодированный путь проекта (like
group/project
), либо идентификатор проекта (like42
). Однако для публикации можно использовать только идентификатор проекта.
Это build.gradle.kts
конфигурация, которая работала для меня на моем собственном экземпляре Gitlab для публикации Spring Boot fat JAR:
plugins {
/* ... other stuff ... */
`java-library`
`maven-publish`
}
publishing {
publications {
create<MavenPublication>("bootJava") {
artifact(tasks.getByName("bootJar"))
}
}
repositories {
maven {
val projectId = System.getenv("CI_PROJECT_ID")
name = "Project Name"
url = uri("https://gitlab.example.com/api/v4/projects/${projectId}/packages/maven")
credentials(HttpHeaderCredentials::class) {
name = "Job-Token"
value = System.getenv("CI_JOB_TOKEN")
}
authentication {
create<HttpHeaderAuthentication>("header")
}
}
}
}