Как настроить аутентификацию репозитория pypi для канала артефактов Azure DevOps в databricks.yml для пакетов активов Databricks?

У меня есть python_wheel_task в одном из моих заданий пакета ресурсов, который выполняет файл whl, который создается из моего локального репозитория, из которого я развертываю пакет. Этот процесс прекрасно работает сам по себе.

Однако мне нужно добавить собственный файл whl зависимостей (еще один репозиторий, упакованный и опубликованный в моем канале артефактов Azure) к задаче в качестве библиотеки, чтобы файл whl моего локального репозитория работал полностью.

Я попытался определить это следующим образом:

    - task_key: some_task
      job_cluster_key: job_cluster
      python_wheel_task:
        package_name: my_local_package_name
        entry_point: my_entrypoint
        named_parameters: { "env": "dev" }
      libraries:
        - pypi:
            package: custom_package==1.0.1
            repo: https://pkgs.dev.azure.com/<company>/<some-id>/_packaging/<feed-name>/pypi/simple/
        - whl: ../../dist/*.whl  # my local repo's whl: being built as part of the asset-bundle
           

Когда я развертываю и запускаю пакет, я получаю следующую ошибку в кластере заданий:

24/07/12 07:49:01 ERROR Utils: 
Process List(/bin/su, libraries, -c, bash /local_disk0/.ephemeral_nfs/cluster_libraries/python/python_start_clusterwide.sh
/local_disk0/.ephemeral_nfs/cluster_libraries/python/bin/pip install 'custom_package==3.0.1' 
--index-url https://pkgs.dev.azure.com/<company>/<some-id>/_packaging/<feed-name>/pypi/simple/ 
--disable-pip-version-check) exited with code 1, and Looking in indexes:
https://pkgs.dev.azure.com/<company>/<some-id>/_packaging/<feed-name>/pypi/simple/

24/07/12 07:49:01 INFO SharedDriverContext: Failed to attach library 
python-pypi;custom_package;;3.0.1;https://pkgs.dev.azure.com/<company>/<some-id>/_packaging/<feed-name>/pypi/simple/ 
to Spark

Полагаю, мне нужно где-то настроить личный токен доступа/аутентификацию для канала, но я не могу найти в документации Databricks ничего о зависимостях библиотеки . Есть только одно предложение о добавлении пользовательского индекса и ничего об аутентификации.

Как я могу заставить это работать?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
121
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Лучшее решение для существующих универсальных кластеров

Мне удалось использовать комбинацию существующего кластера, переменной среды кластера и сценария инициализации, чтобы настроить кластер для аутентификации по пользовательскому индексу PyPI:

  1. Я сохранил PAT Azure DevOps в своем KeyVault.

  2. Я создал секретную область в Databricks для этого KeyVault.

  3. Я загрузил/импортировал скрипт инициализации в Databricks в Workspace/Shared/init-scripts/set-private-artifact-feed.sh

  4. Я создал универсальный кластер и установил его в configuration -> Advanced options:

  5. Переменная среды: PYPI_TOKEN = {{secrets/<my-scope>/<secret-name-of-devops-pat>}}

  6. Сценарии инициализации: введите Workspace, путь к файлу /Shared/init-scripts/set-private-artifact-feed.sh.

Содержание set-private-artifact-feed.sh:

#!/bin/bash
if [[ $PYPI_TOKEN ]]; then
   use $PYPI_TOKEN
fi
echo $PYPI_TOKEN
printf "[global]\n" > /etc/pip.conf
printf "extra-index-url =\n" >> /etc/pip.conf
printf "\thttps://[email protected]/<company>/<some-id>/_packaging/<feed-name>/pypi/simple/\n" >> /etc/pip.conf

   

После перезапуска кластера я смог запустить свою задачу, как я определил изначально, теперь аутентификация по индексу работает. Подробнее в этой средней статье .

Обратите внимание, что это не работает с кластером заданий, если вы не передадите ссылку на сценарий инициализации и не установите переменную среды! Для меня более разумным является использование универсального кластера.

Хакерское решение для кластеров заданий

Мы можем добавить токен PYPI в URL-адрес репо. Мне не удалось правильно настроить сценарии инициализации/env-переменные для кластеров заданий, чтобы они работали в противном случае.

- pypi:
   package: pyspark-framework==4.0.0
   repo: https://<YOUR-TOKEN-HERE>@pkgs.dev.azure.com/<company>/<some-id>/_packaging/<feed-name>/pypi/simple/
- whl: ../dist/*.whl

Это хакерское решение представляет собой серьезную угрозу безопасности: токен будет отображаться в виде обычного текста в рабочей области блоков данных, чтобы все могли его увидеть!

Другие вопросы по теме