Невозможно опубликовать jar в реестре пакетов Gitlab с помощью gradle

#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. Три переключателя:

  1. Место, где вы хотите искать существующие опубликованные пакеты
    • 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 )
  2. Метод авторизации, который вы хотите использовать
  3. Место, где вы хотите опубликовать свой пакет
    • это всегда должен быть конкретный проект-url ( https://.../api/v4/projects/<project-id>/packages/maven )

Комментарии:

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:

Я думаю, что самое главное — убедиться, что вы включили архивы в своем проекте:

  1. Перейдите в настройки проекта

Перейдите в настройки проекта

  1. Развернуть разрешения

Ищите разрешения

  1. Включите «Пакеты»

Включить пакеты

Ответ №3:

По-видимому, есть и другие причины состояния ответа 415 Unsupported Media Type :

Я столкнулся с тем же сообщением об ошибке при попытке опубликовать в репозитории проекта. Ошибка, которую я допустил, заключалась в использовании URL-кодированного пути проекта вместо идентификатора проекта в URL-адресе репозитория.

Из документации Gitlab (курсив добавлен):

Для извлечения артефактов используйте либо URL-кодированный путь проекта (like group/project ), либо идентификатор проекта (like 42 ). Однако для публикации можно использовать только идентификатор проекта.

Это 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")
            }
        }
    }
}