从Gitlab Pipelines上传到pypi

时间:2018-02-08 09:22:22

标签: python gitlab-ci pypi twine

我正在尝试使用Gitlab CI作业将软件包上传到pypi,但我无法使其工作:/任何人都有一个有效的例子吗?

到目前为止,我在.gitlab-ci.yaml(从我当地的机器上所有人都在使用)中尝试过:

  1. 使用.pypirc文件

    进行缠绕
    - echo "[distutils]" >> ~/.pypirc
    - echo "index-servers =" >> ~/.pypirc
    - echo "    pypi" >> ~/.pypirc
    - echo "" >> ~/.pypirc
    - echo "[pypi]" >> ~/.pypirc
    - 'echo "repository: https://upload.pypi.org/legacy/" >> ~/.pypirc'
    - 'echo "username: ${PYPI_USER}" >> ~/.pypirc'
    - 'echo "password: ${PYPI_PASSWORD}" >> ~/.pypirc'
    - python3 setup.py check sdist bdist  # This will fail if your creds are bad.
    - cat ~/.pypirc
    - twine upload dist/* --config-file ~/.pypirc
    
  2. 与之前相同,但$VARIABLE

    [...]
    - 'echo "username: $PYPI_USER" >> ~/.pypirc'
    - 'echo "password: $PYPI_PASSWORD" >> ~/.pypirc'
    [...]
    
  3. 之前有两个选项,但使用python setup.py ... upload

  4. twine upload dist/* -u $PYPI_USER -p $PYPI_PASSWORD
  5. twine upload dist/*TWINE_USERNAMETWINE_PASSWORD个环境变量。
  6. ...并始终获得403 Client Error: Invalid or non-existent authentication information。我的选择已经用完了......

5 个答案:

答案 0 :(得分:2)

我只是使用TWINE_USERNAMETWINE_PASSWORD变量,它开箱即用。

这是gitlab-ci.yml中的一部分(将图像替换为所需的图像):

pypi:
    image: docker.km3net.de/base/python:3
    stage: release
    cache: {}
    script:
        - pip install -U twine
        - python setup.py sdist
        - twine upload dist/*
    only:
        - tags

并在GitLab中的Settings-> CI / CD-> Variables(https://your-gitlab-instance.oerg/GIT_NAMESPACE/GIT_PROJECT/settings/ci_cd)下添加环境变量:

GitLab CI/CD Variables

这是成功的管道:

PyPI Release Pipeline

答案 1 :(得分:1)

如果出现EOF问题,请确保更改要保护的“设置” /“存储库” /“标签”,以便它们可以再次使用。我已经发布了here的完整说明。

答案 2 :(得分:1)

请注意,GitLab 12.10(2020年4月)将使用CI_JOB_TOKEN以更简单的方式提供其高级版或更高版本(请参见答案的第二部分,与2020年9月的GitLab 13.4一样)

Build, publish, and share Python packages to the GitLab PyPI Repository

Python开发人员需要一种机制来创建,共享和使用包含使用这些软件包的项目中包含已编译代码和其他内容的软件包。 PyPI是一个由Python Packaging Authority维护的开源项目,是定义,创建,托管和使用Python软件包的标准。

在GitLab 12.10中,我们很自豪地提供直接内置在GitLab中的PyPI存储库!开发人员现在可以使用一种更轻松的方式来发布其项目的Python软件包。通过与PyPI集成,GitLab将提供一个集中的位置,以在与源代码和管道相同的位置存储和查看这些软件包。

https://about.gitlab.com/images/12_10/pypi_repository_mvc_13.png

3月,我们宣布了GitLab PyPI存储库,并支持其他软件包管理器格式will be moved to open source
在我们致力于使这些功能更广泛可用的情况下,您可以继续in the epic

请参见DocumentationIssue


还有GitLab 13.4(2020年9月)

使用CI_JOB_TOKEN发布PyPI软件包

您可以在源代码和CI / CD管道旁边使用GitLab PyPI存储库来构建,发布和共享python软件包。

但是,以前您无法通过使用预定义的环境变量CI_JOB_TOKEN对存储库进行身份验证。
结果,您被迫使用个人凭据来更新PyPI信息库,或者您可能决定完全不使用该信息库。

现在,通过使用预定义的CI_JOB_TOKEN环境变量,使用GitLab CI / CD来发布和安装PyPI软件包比以往任何时候都容易。

请参见DocumentationIssue

答案 3 :(得分:0)

您也可以考虑使用dpl:这是我的操作方式:

pip:
  stage: upload
  script:
    - apt-get update -qy
    - apt-get install -y ruby-dev
    - gem install dpl
    - python setup.py sdist
    - dpl --provider=pypi --user=$PIP_USERNAME --password=$PIP_PASSWORD --skip_existing=true
  only:
  - master

您可以在项目的变量部分中设置$PIP_USERNAME$PIP_PASSWORDsettings -> CI/CD -> Variables

答案 4 :(得分:0)

您还可以在一行中将python软件包上传到私有Pypi服务器(我在gilab-ci上使用它):

  1. 通过Gitlab CI设置设置环境变量PYPI_SERVERPYPI_USERPYPI_PASSWORD

  2. 致电

    twine upload --repository-url ${PYPI_SERVER} --username $PYPI_USER --password $PYPI_PASSWORDD $artifact
    

注意:我必须使用twinePIP)中的pip3 install twine,而不要使用我的Ubuntu软件包中的twine的版本10似乎有一个错误(zipfile.BadZipFile: File is not a zip file)。