Различия между версиями 4 и 5
Версия 4 от 2021-05-17 18:34:03
Размер: 10275
Редактор: FrBrGeorge
Комментарий:
Версия 5 от 2021-05-17 18:35:05
Размер: 10256
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 9: Строка 9:
  * make/[[https://setuptools.readthedocs.io/en/latest/deprecated/distutils/apiref.html#distutils.core.Extension|setuptools]]    * make/[[https://setuptools.readthedocs.io/en/latest/deprecated/distutils/apiref.html#distutils.core.Extension|setuptools]]
Строка 61: Строка 61:
# UUID секретных ключей, который должны оказаться в сборочной среде     # UUID секретных ключей, который должны оказаться в сборочной среде
Строка 64: Строка 64:
# Откуда брать исходники     # Откуда брать исходники
Строка 72: Строка 72:
  # Сборка модуля           # Сборка модуля
Строка 91: Строка 91:
        set -x          set -x
Строка 97: Строка 97:
   * Более умный CI-системы умеют распознавать и замазывать секретные ключи прямо в журналах
 
   * Более умные CI-системы умеют распознавать и замазывать секретные ключи прямо в журналах

Публикация и CI

Немного про написание модулей с помощью Python API

Особенности:

  • Инструмент сборки проекта на Си?

    • make/setuptools

      • Пока не поддерживается pep-517, надо писать setup.py

    • autotools/?
    • cmake/scikit-build

    • meson/ninja
  • Соблюдение строгой дисциплины программирования
  • Зависимость от платформы
    • Wheel может включать в себя несколько платформо-зависимых бинарников
    • ⇒ адские инструменты кросс-сборки типа scikit-build

    • всевозможные приспособления на стороне CI типа cibuildwheel

  • Linux: pep-513

    • Необходимо модифицировать собранную библиотеку для соответствия требованиям

Совсем немного про CI

Непрерывная_интеграция:

  • получение исходного кода из репозитория;
  • сборка проекта;
  • выполнение тестов;
  • развёртывание готового проекта;
  • отправка отчетов.

Обратите внимание: сборка проекта. Как следствие, инструменты сборки утекли с локальной машины на CI-платформу:

  • Возможность собирать под любую платформу

  • Возможность проводить полноценный деплоймент

Как следствие, «умные» инструменты автоматизации сборки типа Make уступили место простым очередям заданий

Пример проекта

Обвязка для библиотеки libpasswdqc

  • Используется builds.sr.ht
  • Сценарий (т. н. manifest):
    # В какой ОС собирать
    image: debian/testing
    # какие пакеты устанавливать в сборочную среду
    packages:
      - python3-dev
      - python3-setuptools
      - gcc
      - python3-wheel
      - twine
      - python3-pip
      - unzip
      - patchelf
      - zsh
    # UUID секретных ключей, который должны оказаться в сборочной среде
    secrets:
      - 7838f337-2952-4fb1-a333-6a7f1af6c9f2
    # Откуда брать исходники
    sources:
      - https://git.sr.ht/~frbrgeorge/PasswdqcPython
    # Очередь заданий
    tasks:
      # Настройка окружения
      - setup: |
            pip install auditwheel
      # Сборка модуля
      - build: |
            cd PasswdqcPython
            python3 setup.py build
      # Сборка бинарного дистибутива
      - wheel: |
            cd PasswdqcPython
            python3 setup.py bdist_wheel
            python3 -m auditwheel repair -w dist --plat manylinux2014_x86_64 dist/*linux_x86_64*.whl
            rm dist/*linux_x86_64*.whl
      # Сборка исходного дистрибутива
      - sdist: |
            cd PasswdqcPython
            python3 setup.py sdist
      # Автоматическая публикация (правда, не тестовом Pypi :)
      - publish: |
            cd PasswdqcPython
            set +x
            twine upload -u __token__ -p "`cat ~/.test-pypi`" --repository testpypi dist/*
            set -x
    • Действия — это просто примитивные shell-сценарии
    • audtwheel не входит в пакетную базу Debian, поэтому доставлять его пришлось pip-ом

    • audtwheel нужен для модификации собранной библиотеки в соответствии с требованиями pep-513 (исходный wheel удаляется)

    • В файле ~/.test-pypi лежит секретный ключ для публикации (а как ещё?), set +x выключает протоколирование выполнения shell-сценария, чтобы не засветить ключ в журнале, set -x включает его обратно

      • Более умные CI-системы умеют распознавать и замазывать секретные ключи прямо в журналах

Конкретно в данном проекте учтено, что в системе может не быть библиотеки libpasswdqc:

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

Публикация на PyPi

В действительности ничего свыше методички на PyPA не требуется:

  • Необходимо создать исходный и бинарный дистрибутивы со всеми нужными полями в заголовке, лицензией и т. п.
    • /!\ на сегодня (2021-05-17) в методичке описан файл README.md, в то время как формат по умолчанию для PyPI — не markdown, а ReST, это управляется параметром long_description_content_type setup.cfg

  • Публикация происходит с помощью специального инструмента — twine

    • Вместо логина надо указывать слово __tiken__, вместо пароля — выданный вам ключ. Этот же ключ могут использовать и роботы CI

  • Немедленно после успешной публикации модуль можно устанавливать!
  • <!> на PyPI нельзя выкладывать файл с одним и тем же именем повторно, даже если вы вообще удалили и завели заново соответствующий проект. Если хоть что-то поменяли — поднимайте номер версии.

  • README.rst из дистрибутива можно использовать в качестве описания проекта, а вот другие файлы (например, картинки) — нет. Однако можно сослаться на картинки в репозитории, если хостинг поддерживает их показ.

Публикация на readthedocs.org

Тут всё ещё проще! Достаточно, чтобы в вашем проекте выгонялась документация с помощью sphinx.

  • Залогиниться и указать репозиторий, из которого будет произведён экспорт
  • Документация будет пересоздана создана автоматически на база исходного репозитория (самому генерировать её не надо)
  • Если код написан так, что при выгонке документации требуется импортировать внешние модули, возможны ошибки (это вам не CI, никто не будет ставить, допустим, matplotlib).
    • Пример того, как в проекте Pymunk на скорую руку понаделали мокеров вместо соответствующих модулей прямо в конфигурационном файле sphinx

  • Такую публикацию можно тоже подключить в CI
  • Пример для эталонного пректа

LecturesCMC/PythonDevelopment2021/12_PublicationAndCi (последним исправлял пользователь FrBrGeorge 2021-05-17 18:35:05)