10

我正在尝试使用 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环境变量。

...并且总是得到一个403 Client Error: Invalid or non-existent authentication information. 我的选择已经不多了...

4

7 回答 7

12

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

这是我的相关部分gitlab-ci.yml(将图像替换为您想要的图像,当然还可以根据需要更改所有其他内容stage,例如cache等):

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 变量

这是成功的管道:

PyPI 发布管道

于 2018-12-05T08:15:51.593 回答
3

我得到了这个工作,使用你的代码的修改版本:

pypi:
  stage: upload
  script:
  - pip install twine
  - rm -rf dist
  - echo "[distutils]" >> ~/.pypirc
  - echo "index-servers =" >> ~/.pypirc
  - echo "    nexus" >> ~/.pypirc
  - echo "" >> ~/.pypirc
  - echo "[nexus]" >> ~/.pypirc
  - echo "${PYPI_REPO}" >> ~/.pypirc
  - echo "${PYPI_USER}" >> ~/.pypirc
  - echo "${PYPI_PASSWORD}" >> ~/.pypirc
  - python3 setup.py check sdist bdist  # This will fail if your creds are bad.
  - python setup.py sdist bdist_wheel
  - twine upload -r nexus dist/*.tar.gz

不同之处在于我没有使用“'”,而是去掉了 yaml 中的冒号;相反,我将秘密的值设置为例如,username: myuser

于 2018-05-10T14:52:31.523 回答
2

如果出现 EOF 问题,请确保将设置/存储库/标签更改为受保护,以便它们再次工作。我在这里发布了更完整的描述。

于 2019-05-17T00:50:31.230 回答
2

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

构建、发布 Python 包并将其共享到 GitLab PyPI 存储库

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 存储库和对其他包管理器格式的支持将移至开源
您可以跟随我们努力使这些功能在史诗中更广泛地可用。

请参阅文档问题


以及GitLab 13.4(2020 年 9 月)

使用 CI_JOB_TOKEN 发布 PyPI 包

您可以使用 GitLab PyPI 存储库与源代码和 CI/CD 管道一起构建、发布和共享 python 包。

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

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

请参阅文档问题

于 2020-04-23T19:12:04.683 回答
1

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

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

  2. 称呼

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

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

于 2019-08-09T15:41:02.967 回答
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

于 2018-08-30T20:26:55.490 回答
0

我知道这是一个老问题,但是如果您正在使用poetry(我正在使用 version 进行测试1.1.11),您可以很容易地做到这一点,如下所示:

poetry config repositories.my_private_repo [URL_TO_YOUR_PYPI_REPO]
poetry config http-basic.my_private_repo [USERNAME] [PASSWORD]
poetry build
poetry publish --repository my_private_repo

在开发分支上,您可以将--dry-run参数添加到,poetry publish因此它实际上不会被上传

于 2021-10-12T11:08:43.677 回答