⇤ ← Версия 1 от 2021-05-13 10:30:42
44
Комментарий:
|
10190
|
Удаления помечены так. | Добавления помечены так. |
Строка 3: | Строка 3: |
''план'' == Немного про написание модулей с помощью Python API == * [[https://docs.python.org/3/extending/index.html|Учебник]] * [[https://docs.python.org/3/c-api/index.html|Докментация]] * [[https://git.sr.ht/~frbrgeorge/PasswdqcPython|Пример проекта]] Особенности: * Инструмент ''сборки'' проекта на Си? * make/[[https://setuptools.readthedocs.io/en/latest/deprecated/distutils/apiref.html#distutils.core.Extension|setuptools]] * Пока не поддерживается [[pep:pep-517]], надо писать `setup.py` * autotools/? * cmake/[[pypi:scikit-build]] * meson/ninja * … * Соблюдение строгой дисциплины программирования * Зависимость от платформы * Wheel может включать в себя несколько платформо-зависимых бинарников * ⇒ адские инструменты кросс-сборки типа [[pypi:scikit-build]] * всевозможные приспособления на стороне CI типа [[pypi:cibuildwheel]] * Linux: [[pep:pep-513]] * Необходимо ''модифицировать'' собранную библиотеку для соответствия требованиям == Совсем немного про CI == [[RW:Непрерывная_интеграция]]: * получение исходного кода из репозитория; * сборка проекта; * выполнение тестов; * развёртывание готового проекта; * отправка отчетов. Обратите внимание: ''сборка проекта''. Как следствие, инструменты сборки утекли с локальной машины на CI-платформу: * Возможность собирать под ''любую'' платформу * Возможность проводить полноценный деплоймент Как следствие, «умные» инструменты автоматизации сборки типа [[RW:Make]] уступили место простым очередям заданий * https://travis-ci.com * https://github.com/features/actions * https://docs.gitlab.com/ee/ci/ * В !GitLab [[https://docs.gitlab.com/ee/ci/directed_acyclic_graph/#needs-visualization|начали задумываться над графом зависимостей]], но как-то очень путано * https://man.sr.ht/builds.sr.ht/ * … (тысячи их) === Пример проекта === [[https://git.sr.ht/~frbrgeorge/PasswdqcPython|Обвязка для библиотеки 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:pep-513]] (исходный wheel удаляется) * В файле `~/.test-pypi` лежит ''секретный'' ключ для публикации (а как ещё?), `set +x` выключает протоколирование выполнения shell-сценария, чтобы не засветить ключ в журнале, `set -x` включает его обратно * Более умный CI-системы умеют распознавать и замазывать секретные ключи прямо в журналах Конкретно в данном проекте учтено, что в системе может не быть библиотеки `libpasswdqc`: * В [[https://git.sr.ht/~frbrgeorge/PasswdqcPython/tree/master/item/setup.py#L6|setup.py]] добавлена проверка, есть ли библиотека в системе * (в действительности ''не проверяется'', есть ли ''сборочная версия'' библиотеки, то, что называется `libpasswdqc-devel`, так что если библиотека есть, а -devel` нет, сборка упадёт) * Исходники самой библиотеки [[https://git.sr.ht/~frbrgeorge/PasswdqcPython/tree/master/item/.gitmodules|оформлены как подмодуль git]], и если её в системе нет, [[https://git.sr.ht/~frbrgeorge/PasswdqcPython/tree/master/item/setup.py#L21|необходимое подмножество берётся оттуда]] манифест может активизироваться вручную или по событию (например, просто ри каждом push, на каждый новый тег, только на подписанный тег и т. п.). == Публикация на PyPi == В действительности ничего свыше [[https://packaging.python.org/tutorials/packaging-projects/|методички на PyPA]] не требуется: * Необходимо создать исходный и бинарный дистрибутивы со всеми нужными полями в заголовке, лицензией и т. п. * /!\ на сегодня (<<Date(2021-05-17T18:28:32+0300)>>) в методичке описан файл `README.md`, в то время как формат по умолчанию для PyPI — не markdown, а ReST, это управляется параметром [[https://setuptools.readthedocs.io/en/latest/userguide/declarative_config.html?highlight=content_type#metadata|long_description_content_type]] `setup.cfg` * Публикация происходит с помощью специального инструмента — [[pypi:twine]] * Вместо логина надо указывать слово `__tiken__`, вместо пароля — выданный вам ключ. Этот же ключ могут использовать и роботы CI * Немедленно после успешной публикации модуль можно устанавливать! * <!> на PyPI [[https://pypi.org/help/#file-name-reuse|нельзя выкладывать файл с одним и тем же именем повторно]], даже если вы вообще удалили и завели заново соответствующий проект. Если хоть что-то поменяли — поднимайте номер версии. * README.rst из дистрибутива можно использовать в качестве описания проекта, а вот другие файлы (например, картинки) — нет. Однако можно сослаться на картинки в репозитории, если хостинг поддерживает их показ. == Публикация на readthedocs.org == [[https://docs.readthedocs.io/en/stable/intro/getting-started-with-sphinx.html|Тут всё ещё проще]]! Достаточно, чтобы в вашем проекте выгонялась документация с помощью sphinx. * Залогиниться и указать репозиторий, из которого будет произведён экспорт * Документация будет пересоздана создана автоматически на база исходного репозитория (самому генерировать её не надо) * Если код написан так, что при выгонке документации требуется импортировать внешние модули, возможны ошибки (это вам не CI, никто не будет ставить, допустим, matplotlib). * [[https://github.com/viblo/pymunk/blob/master/docs/src/conf.py|Пример]] того, как в проекте Pymunk на скорую руку понаделали мокеров вместо соответствующих модулей прямо в конфигурационном файле sphinx * Такую публикацию можно тоже подключить в CI |
Публикация и CI
TODO
план
Немного про написание модулей с помощью 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 уступили место простым очередям заданий
https://docs.gitlab.com/ee/ci/
В GitLab начали задумываться над графом зависимостей, но как-то очень путано
- … (тысячи их)
Пример проекта
Обвязка для библиотеки 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:
В setup.py добавлена проверка, есть ли библиотека в системе
(в действительности не проверяется, есть ли сборочная версия библиотеки, то, что называется libpasswdqc-devel, так что если библиотека есть, а -devel` нет, сборка упадёт)
Исходники самой библиотеки оформлены как подмодуль git, и если её в системе нет, необходимое подмножество берётся оттуда
манифест может активизироваться вручную или по событию (например, просто ри каждом 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