Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to deploy Python packages to Gitlab Package Registry with Poetry?

I'm trying to set up Poetry to deploy packages to our internal Gitlab Package Registry. According to other sources online the repository ID should be https://gitlab.com/api/v4/projects/<project id>/packages/pypi, but no matter what I try, Poetry returns

[UploadError]
HTTP Error 404: Not Found

Anyone got this working ?

like image 556
Jakob Vad Nielsen Avatar asked Sep 28 '20 08:09

Jakob Vad Nielsen


People also ask

Does poetry use PyPI?

By default, Poetry is configured to use the PyPI repository, for package installation and publishing. So, when you add dependencies to your project, Poetry will assume they are available on PyPI. This represents most cases and will likely be enough for most users.

What is Python GitLab?

python-gitlab is a Python package providing access to the GitLab server API. It supports the v4 API of GitLab, and provides a CLI tool ( gitlab ).


2 Answers

I actually got this working myself, and the above url is correct. My problem was that I tried to publish to a group (with the group id) and not to an actual project (aka repository).

So here is how to do it:

  1. Add the repository to you poetry.toml

    [virtualenvs]
    in-project = true
    [repositories]
    [repositories.my-gitlab]
    url = "https://gitlab.com/api/v4/projects/<your project id>/packages/pypi"
    
  2. Generate a token in gitlab that can read and write to package repository.

  3. Publish the package

    poetry publish --repository my-gitlab -u <token-username> -p <token-password>
    
    
like image 137
Jakob Vad Nielsen Avatar answered Oct 09 '22 10:10

Jakob Vad Nielsen


If you are attempting to deploy from GitLab CI, GitLab automatically creates a user and token combination that can be used to authenticate in the CI context under the user gitlab-ci-token and the password in the $CI_JOB_TOKEN variable.

All you need to do that is poetry specific is set the config values for poetry to know the package registry exists, then pass this for authentication. All of which can be done just in the CI config/script.

  script:
    - poetry build
    - poetry config repositories.gitlab "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/packages/pypi"
    - poetry config http-basic.gitlab gitlab-ci-token "$CI_JOB_TOKEN"
    - poetry publish --repository gitlab

If you are deploying from outside of GitLab CI, then you would need that access token and to provide values as used in the script above.

like image 36
tplusk Avatar answered Oct 09 '22 09:10

tplusk