Saya ingin menerbitkan paket .whl bawaan ke PyPi.org dari saluran rilis Azure Devops kami, tetapi skrip twine upload terus menggantung tanpa kesalahan, penyelesaian, atau waktu habis. Jadi unggahan sebenarnya dari paket kami (yang sangat kecil) tidak berfungsi.

Begini cara pengaturannya:

Membangun yaml:

trigger:
- master
pr: none
pool:
  vmImage: 'ubuntu-latest'

steps:
- task: UsePythonVersion@0
  inputs:
    versionSpec: '3.7'
    addToPath: true
    architecture: 'x64'

- script: python -m pip install --upgrade pip setuptools wheel
  displayName: 'Install tools'

- script: pip install -r src/requirements.txt
  displayName: 'Install requirements'

- script: |    
    python src/setup.py bdist_wheel 
  displayName: 'Artifact creation'

- script: python -m pip install --upgrade twine
  displayName: 'Install Twine'

- task: TwineAuthenticate@1
  inputs:
    pythonUploadServiceConnection: 'AzureML PyPi feed'

- script: |
   python -m twine upload --config-file $(PYPIRC_PATH) dist/*.whl
  displayName: 'Publish to PyPi through Twine'

Koneksi layanan:

  • Metode otentikasi ditentukan oleh Authentication Token.
  • Url repositori Python untuk diunggah: https://upload.pypi.org/legacy
  • Nama Titik Akhir: azure-pypi
  • Nama Koneksi Layanan: AzureML PyPi feed
  • [X] Berikan izin akses ke semua saluran

Log rilis (bagian paling relevan):

Langkah TwineAuthenticate:

Starting: TwineAuthenticate
==============================================================================
Task         : Python twine upload authenticate
Description  : Authenticate for uploading Python distributions using twine. Add '-r FeedName/EndpointName --config-file $(PYPIRC_PATH)' to your twine upload command. For feeds present in this organization, use the feed name as the repository (-r). Otherwise, use the endpoint name defined in the service connection.
Version      : 1.165.0
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/package/twine-authenticate
==============================================================================
75c64e89-xxxxxredactedxxxxx exists true
Adding authentication to configuration for registry azure-pypi
Successfully added auth for 0 internal feed and 1 external endpoint.
Finishing: TwineAuthenticate

Langkah penerbitan:

Starting: Publish to PyPi through Twine
==============================================================================
Task         : Command line
Description  : Run a command line script using Bash on Linux and macOS and cmd.exe on Windows
Version      : 2.164.0
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/command-line
==============================================================================
Generating script.
Script contents:
python -m twine upload --config-file /home/vsts/work/_temp/twineAuthenticate/Wv8nMR/.pypirc dist/*.whl
========================== Starting Command Output ===========================
/bin/bash --noprofile --norc /home/vsts/work/_temp/0d772e31-148f-4e3c-999b-b2a43a02b287.sh
Uploading distributions to https://upload.pypi.org/legacy/

Ini tetap tidak berubah selama lebih dari 30 menit, jadi saya hanya membatalkan rilis saya tanpa paket dikerahkan. Ada ide tentang ini?

3
Sam Vanhoutte 17 April 2020, 16:57

1 menjawab

Jawaban Terbaik

Saya memiliki solusi sementara untuk saat ini:

Saya melewatkan penggunaan file konfigurasi dan menjalankan kode berikut sebagai gantinya:

- script: |
   python -m twine upload --skip-existing --verbose -p $(pypi-api-token) -u __token__ --repository $(pypi-project-name) --repository-url https://upload.pypi.org/legacy/ dist/*.whl
  displayName: 'Publish to PyPi through Twine'

Dan di sana, saya melihat sedikit lebih banyak (dan lebih baik) pengecualian logging, yang menunjukkan dua hal:

  1. Token yang saya gunakan untuk file konfigurasi saya disetel ke lingkup proyek dengan nama yang berbeda dari proyek yang saya tentukan di Koneksi Layanan saya
  2. Url repositori benar-benar harus diakhiri dengan garis miring, karena jika tidak, Anda mendapatkan pengecualian RedirectDetected.

Berdasarkan temuan di atas, saya memperbarui cuplikan yaml saya sebagai berikut:

- script: |
   python -m twine upload --skip-existing --verbose --repository $(pypi-project-name) --config-file $(PYPIRC_PATH) dist/*.whl
  displayName: 'Publish to PyPi through Twine'

Tetapi ketika menjalankan ini, saya sekarang mendapatkan pesan pengecualian berikut di build:

Generating script.
Script contents:
python -m twine upload --skip-existing --verbose --repository arcus-azureml --config-file /home/vsts/work/_temp/twineAuthenticate/2QGKVH/.pypirc dist/*.whl
========================== Starting Command Output ===========================
/bin/bash --noprofile --norc /home/vsts/work/_temp/7605dac9-5fa9-4856-94af-e938018278a5.sh
Uploading distributions to https://upload.pypi.org/legacy/
Uploading arcus_azureml-0.0.2-py3-none-any.whl

  0%|          | 0.00/5.80k [00:00<?, ?B/s]
100%|██████████| 5.80k/5.80k [00:00<00:00, 52.4kB/s]HTTPError: 403 Client Error: Invalid or non-existent authentication information. See https://pypi.org/help/#invalid-auth for details for url: https://upload.pypi.org/legacy/

Content received from server:
<html>
 <head>
  <title>403 Invalid or non-existent authentication information. See https://pypi.org/help/#invalid-auth for details</title>
 </head>
 <body>
  <h1>403 Invalid or non-existent authentication information. See https://pypi.org/help/#invalid-auth for details</h1>
  Access was denied to this resource.<br/><br/>
Invalid or non-existent authentication information. See https://pypi.org/help/#invalid-auth for details

Saya juga mengeluarkan konten file pypirc, menggunakan perintah CAT dan konten file seperti ini:

[distutils]
index-servers=arcus-azureml 
[arcus-azureml]
repository=https://upload.pypi.org/legacy/
username=build
password=***

Solusi yang diperbarui

Jadi, perbaikan untuk mengatur 403 adalah mengubah Koneksi Layanan saya untuk menggunakan 'Nama Pengguna dan Kata Sandi' sebagai metode otentikasi, alih-alih Token Otentikasi, dengan pengaturan berikut:

  • Nama pengguna: __token__
  • Kata sandi: Token api sebenarnya sebagai kata sandi

Setelah melakukan ini, semuanya bekerja seperti yang saya inginkan.

2
Sam Vanhoutte 18 April 2020, 12:13