Рубрики
Без рубрики

Создайте Azure самостоятельного агента с Python, не сойдя с ума

Я регулярно использую Azure для своей работой или другой программной работы, и в зависимости от поставленной задачи, это … Tagged с Python, DevOps, Azure.

Я регулярно использую Azure для своей работой или другой программной работы, и в зависимости от поставленной задачи необходимо настроить самостоятельные агенты, чтобы выполнить вашу работу. Для тех из вас, непосвященными, конвейеры Azure – это способ автоматизации CI/CD, и, как только вы получите начальную кривую обучения, действительно велики. На момент написания этого программного обеспечения с открытым исходным кодом может иметь до 10 одновременных «агентов», размещенных бесплатно в облаке Azure. Однако для частных проектов вы немного более ограничены. Вы получаете одного агента в течение нескольких тысяч часов, и это, как правило, недостаточно для всех, кроме самых основных проектов. Здесь приходят самостоятельные агенты. Вы устанавливаете свою собственную среду и подключаете ее к планировщику работы Azure, чтобы получить лучшие из обоих миров.

Будучи в субботу и Covid, я решил поработать над тем, чтобы сделать частный трубопровод более эффективным, добавив самостоятельного агента в существующий трубопровод. Поскольку я дешев, я хочу только выбросить 60 долларов, которые требуются, чтобы иметь два одновременных, неограниченных агентов MS, и ожидание выполнения задач CI действительно действовало мне на нервы. Поскольку у меня есть домашний сервер/NAS, который в основном сидит там, я мог бы также использовать его процессор. Должно быть легко, верно?

Настройка агента

Позвольте мне предположить это, сначала сказав, что я не фанат Microsoft Windows. Совокупное время, разработчики, провели в последнее десятилетие, занимаясь иминкрарами ОС, неэффективностью и плохими деловыми практиками, обеспечиваемыми прошлой корпоративной культурой, является преступлением против человечества. При этом MS сегодняшнего дня искренне повернулась к облаку и с открытым исходным кодом, и вместо того, чтобы убить GitHub после его приобретения, я бы сказал, что это улучшено под их руководством. Не то, что я ожидал от Microsoft. Хотя я искренне думаю, что Windows или, по крайней мере, ядро, будут заменены Linux в один день, когда Windows скользит в устаревание, но считает, что Microsoft имеет светлое будущее в области разработки облака и программного обеспечения. И, честно говоря, там гораздо больше денег, чем просто в ОС.

У Windows отличная документация для настройки агента и установки его локально по адресу Самостоятельные агенты Linux И я очень мало могу добавить к процессу настройки. Обратите внимание, что для агента автоматически запустить, чтобы включить службу с ./svc.sh Установка Анкет

Конфигурация трубопровода

С установленным агентом следующим шагом является изменение вашего Azure-Pipelines.yml Анкет Например, я добавил своего агента, DS9 , в бассейн ds9_pool и добавил это в YML с:

- job: Linux
  pool: ds9_pool

Из старой конфигурации:

  pool:
    vmImage: 'ubuntu-latest'

Затем создайте ветвь с этими изменениями и отправьте его. У вас уже есть настройка конвейера, эта задача «Linux» автоматически работает на вашем новом агенте. Я говорю «запустить», но я действительно имею в виду, «провалится почти мгновенно», потому что, если вы мигрируете из агента с Microsoft, вам нужно будет выполнить дополнительную работу, получив ее совместимость.

Миграция трубопровода на самостоятельный агент

Во -первых, небольшой фон на моем трубопроводе. Мой трубопровод компилирует модуль Python, который имеет несколько расширений C/C ++, которые построены с использованием Цифон Анкет В целом, это отличная настройка, у меня есть выбор написать в Цифон или написать чистый C/C ++, а затем взаимодействовать с ним из цинтона. Для моего проекта это экономит много времени на написание кода интерфейса C Pure C, который часто хрупкий и трудно кодировать.

Тем не менее, использование расширений C означает, что я не могу просто собрать пакет в качестве чистопитона и отправить его. Я должен построить его в окружающей среде и сопоставлении платформы, где она будет развернута. В этом случае это Windows и Linux для Python 3.6 – Python 3.8. В прошлом мне приходилось вручную построить его для каждого выпуска, и все сценарии сборки и модульные тестирование займет минимум неделю за выпуск (независимо от патча или майора). Создание трубопровода Абсолютно важно выполнить реальную работу по созданию лучшего программного обеспечения.

Начало моей работы “Linux” выглядит как:

jobs:
- job: Linux
  strategy:
    matrix:
      Python36:
        python.version: '3.6'
        python.architecture: 'x64'
      Python37:
        python.version: '3.7'
        python.architecture: 'x64'
      Python38:
        python.version: '3.8'
        python.architecture: 'x64'
  pool: ds9_pool
  steps:
    - template: .ci/checkout.yml
    - task: UsePythonVersion@0
      inputs:
        versionSpec: $(python.version)
      displayName: 'Use Python $(python.version)'

Здесь появится первая проблема. Использование Pythonversion@0 Задача требует, чтобы Python был установлен на самостоятельной машине. Например, предполагая, что вы используете дефолт _work Справочник агента, ваша структура каталогов должна выглядеть как:

$AGENT_TOOLSDIRECTORY/
    Python/
        {version number}/
            {platform}/
                {tool files}
            {platform}.complete

Microsoft предоставляет документацию для настройки этого на Используйте версию Python Task , но это не завершено. Например, что в {Инструментальные файлы} ? Могу я использовать 3.8 вместо 3.8.5 в {номер версии} Анкет Есть ли автоматический способ установки Python?

Оказывается, для выяснения требуется немного работы, но на самом деле это довольно просто, когда вы знаете несколько трюков:

Установка и настройка Python

Структура каталога Python 3.8 должна выглядеть как:

$AGENT_TOOLSDIRECTORY/
    Python/
        3.8/
            x64/
                bin/
                include/
                lib/
                share/
            x64.complete

Вы можете вручную загрузить, установить и скопировать Python в этот каталог, но гораздо лучше просто использовать виртуальную среду Python, так как это повторяется и гораздо более надежна. Во -первых, убедитесь, что у вас есть Python3.8-VENV Установлено с:

sudo apt install python3.8-venv

Далее, CD в вашем _tool Справочник и создайте каталог Python с Mkdir Python Анкет Мне нужны три версии Python, 3,6, 3,7 и 3,8. Поскольку на машине уже установлено 3,8 в Ubuntu 20.04, легко создать виртуальную среду, так как базовая версия уже установлена. Однако сначала вам нужно будет создать 3.8 Справочник, так как именно так Azure ожидает настроить каталоги. Однако, поскольку вы, возможно, пожелаете ссылаться на точную версию Python, лучше всего создать каталог полной версии Python, а затем символизировать ее в каталог без версии Patch. Например, версия, установленная после запуска Python3 -V это Python 3.8.5 , так что вы создали бы символическую ссылку с ln -s 3.8,5 3.8 Анкет Ваша структура каталогов теперь должна выглядеть как:

$AGENT_TOOLSDIRECTORY/
    Python/
        3.8/ -> 3.8.5/
        3.8.5/

CD в 3.8.5 и создайте свою виртуальную среду с помощью:

python3.8 -m venv x64

Это x64 Потому что так Azure ожидает, что он будет настроен (т.е. {версия}/{архитектура} ). Наконец, Touch x64.complete Чтобы добавить x64.complete Файл в 3.8.5 каталог. Я не уверен, почему это необходимо, учитывая, что вся информация находится в структуре каталогов, но, увы, у некоторых бедных программистов, вероятно, была повод для этого.

Структура каталогов теперь должна выглядеть как:

$AGENT_TOOLSDIRECTORY/
    Python/
        3.8 --> 3.8.5
        3.8.5/
            x64/
                bin/
                include/
                lib/
                share/
            x64.complete

Это имеет преимущество в использовании System Python в качестве символического, а не в качестве копии, но сохраняя отдельные каталоги для всех установленных пакетов Azure. Для всех интенсивных целей это виртуальная среда, установленная только для агента Azure.

Другие версии Python

Ubuntu 20.04 поставляется с Python3.8, но для более старых версий Python вам нужно добавить репозиторий Deadsnakes и установить их оттуда. Сделайте это с:

sudo add-apt-repository ppa:deadsnakes/ppa

Поскольку мой трубопровод требует заголовков Python, мне нужно установить -dev версия, и для создания виртуальной среды вам нужно установить -venv , поэтому для двух других версий Python полная команда установки:

sudo apt install python3.7-dev python3.7-venv python3.6-dev python3.6-venv

Далее, начиная с Python каталог, создайте виртуальные среды для 3.6 и 3.7 с:

PY36_VER=$(python3.6 -c "import sys; print('.'.join([f'{val}' for val in sys.version_info[:3]]))")
mkdir $PY36_VER
ln -s $PY36_VER 3.6
cd $PY36_VER
python3.6 -m venv x64
touch x64.complete
cd ..

PY37_VER=$(python3.7 -c "import sys; print('.'.join([f'{val}' for val in sys.version_info[:3]]))")
mkdir $PY37_VER
ln -s $PY37_VER 3.7
cd $PY37_VER
python3.7 -m venv x64
touch x64.complete
cd ..

Структура каталога должна выглядеть как:

$AGENT_TOOLSDIRECTORY/
    Python/
        3.6 --> 3.6.13
        3.6.13/
            x64/
                bin/
                ...
            x64.complete
        3.7 --> 3.7.10
        3.7.10/
            x64/
                bin/
                ...
            x64.complete
        3.8 --> 3.8.5
        3.8.5/
            x64/
                bin/
                ...
            x64.complete

Обратите внимание, что если ваш трубопровод не включает шаг для обновления PIP, вам, возможно, придется добавить его. Версия, включенная в Python 3.6, была несовместимой с моим рабочим процессом и должна была быть обновлена вручную.

Установка других пакетов и требований

Изображения Azure содержат несколько популярных программных пакетов, и если вы мигрируете в свежую среду, необходимо установить немало из них вручную. В моем случае мне нужно было следующее:

sudo apt install docker zip libglu1-mesa
sudo snap install docker

Zip был для ArchiveFiles@2 шаг, libglu1-mesa был для VTK и Docker Был для строительства питоновские колеса на Quay.io/pypa/manylinux2010_x86_64 Анкет

Улучшения производительности и следующие шаги

Использование Microsoft Hosted Agents – отличный способ запустить CI/CD на облаке без владения оборудованием; Он хорошо масштабируется и хорошо подходит для создания программного обеспечения. Однако в моем случае у меня было дополнительное оборудование и свободное время, поэтому стоило времени добавить дополнительный агент в трубопровод. Мои сборки работают примерно в 3 раза быстрее, используя дополнительный агент, и я, вероятно, мог найти другой (возможно, Windows) компьютер для запуска сборки.

Тем не менее, я не просто стремился к улучшению производительности. Есть некоторые данные, которые я бы предпочел не быть в «облаке», и важно запустить эти функциональные тесты перед выпуском. Я пренебрегал ими, потому что они не автоматизированы, и, как правило, есть крайний случай, который вырос, потому что я не смог их запустить. Следующим шагом является добавление в этих функциональных тестах, сохранить тесты (используя pytest-benchmark ) и добавить их в качестве шага перед выпуском.

Оригинал: “https://dev.to/akaszynski/create-an-azure-self-hosted-agent-without-going-insane-173g”