Не альбертанский трубопровод, а трубопровод CI/CD.
На этой неделе лаборатория для моего класса разработки открытого исходного кода у нас работают на CD-трубопроводе ( в отличие от на прошлой неделе , который был аспектом CI) для нашего когда-либо меняющихся, семестр длиной, Проверка ссылок программа .
Для непосвященных: непрерывной доставкой (CD) трубопровод развертывает новую версию программного обеспечения для общественности для использования (когда доступна новая версия.) Выпуская новая версия может быть сделана вручную, но имея CD-трубопровод обеспечивает автоматический процесс, поэтому разработчики не должны выпускать новую версию вручную и могут вместо этого сосредоточиться на разработке.
Моя программа написана на Python, и в качестве такого процесса создания моего CD-трубопровода для него будет описано ниже с точки зрения экосистемы Python.
Давайте погрузимся в!
Для доставки новых версий моей программы, естественно, первый шаг должен был расследовать и оценить потенциальные сайты для проведения моих результатов. С Pypi Стандарт Goto для пакетов Python я решил использовать это. Следующий шаг, очевидно, к RTFM Отказ
Поскольку мы автоматизируем наш пакет Python, мы должны убедиться, что пакет имеет правильную структуру. К счастью, мой проект знает свое место и уже уже структурировал. Вот пример структуры из вышеуказанной ссылки, а структура моего проекта под ним:
packaging_tutorial ├── LICENSE ├── README.md ├── example_pkg │ └── __init__.py ├── tests │ └── __init__.py └── setup.py
He-s-Dead-Jim ├── LICENSE ├── README.md ├── src │ └── __init__.py │ └── hdj.py │ └── hdj_fileio.py │ └── hdj_linkchecker.py │ └── hdj_util.py ├── tests │ └── __init__.py │ └── test_hdj_fileio.py │ └── test_hdj_linkchecker.py └── setup.py
Чем более острые читатели (все 2 из вас) заметили бы setup.py
файл. setup.py
очень важно для многих причин:
- Он отслеживает зависимости вашего проекта, и без этих ваших проектов никогда не будет работать.
- Он также используется в процессе упаковки (см. Ниже), чтобы определить, какие зависимости и файлы для отслеживания.
Опять же, у меня уже было setup.py
файл, но только недавно удалил его использовать (много) проще требования .txt
Отказ Поэтому я сделал это снова (и на самом деле узнал, как использовать его на этот раз):
import setuptools with open("docs/README.md", "r") as fh: long_description = fh.read() setuptools.setup( name="He's Dead, Jim", version="1.0.4", author="Chris Pinkney", author_email="hey@chrispinkney.com", description="A command-line tool for finding and reporting dead/broken links in a file or webpage.", long_description=long_description, long_description_content_type="text/markdown", url="https://github.com/chrispinkney/He-s-Dead-Jim", install_requires=[ "argparse == 1.4.0", "requests == 2.24.0", "beautifulsoup4 == 4.9.1", "datetime == 4.3", "colorama == 0.4.4", "black == 20.8b1", "flake8 == 3.8.4", "pre-commit == 2.7.1", "pytest == 6.1.2", "pytest-cov == 2.10.1", ], packages=setuptools.find_packages(), classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ], entry_points={ "console_scripts": [ "hdj = src.hdj:main_wrapper", ] }, python_requires=">=3.6", )
Важный шаг – получить intry_points.
Обниматься только правильно. Я должен был реструктуризация Много моего проекта для размещения для setup.py
А именно главный файл, это должно было произойти, потому что проект нужен правильная точка входа для использования с setup.py
И основная функция уже на месте получала аргументы командной строки, что делает его не запускаемым при отсутствии аргументов. Я уверен, что есть лучший способ сделать это, но сейчас это работает. Мне также пришлось суффикс мою инвестицию в области импорта, поскольку встроенная версия моего проекта оказала проблемы с поиском правильных файлов. Не уверен, почему Но мой взлом исправил это Отказ
Для того, чтобы проверить, что мой setup.py
Файл работает, я создал виртуальные среды, чтобы увидеть, были ли все мои зависимости устанавливаются правильно:
Python -M VINV HDJ_ENV
. \ HDJ_ENV \ Scripts \ Activate.bat
Установка PIP.
списка пиб
Поскольку ваша новая блестящая виртуальная среда не поставляется с какими-либо предустановленными зависимостями, если зависимости вашего проекта появляются после запуска шага 4, вы знаете, что вы делали, сделал это все хорошо. С моим setup.py
Файл создан и функционирующий правильно, давайте посмотрим, сможем ли мы на самом деле упаковать наш проект.
Для того, чтобы упаковать мой проект, Я побежал python setup.py sdist bdist_wheel
генерировать Источник Архив ( .tar.gz ) Файл и Распределение сборки ( .WHL ) файл. Мы создаем эти файлы в частности, потому что это то, что Pypi принимает для загрузки. Если наш проект может генерировать эти файлы, мы знаем, что наш автоматический CD-трубопровод может тоже.
Давайте тестируем вручную загрузку этих файлов в Pypi, чтобы увидеть, даже будут приниматься.
PYPI использует кусок программного обеспечения под названием Шпагат
Чтобы загрузить вещи на свои серверы, естественно, давайте начнем там: Python -M PIP Установка --User --upgrade Twine
Отказ С Шпагат
Установлен, нам сейчас надо Создать учетную запись и API токен на пипи. Но теперь каждый раз вы загружаете, вам будет предложено для этого токена API. Это раздражает, поэтому давайте зарегистрируем наш токен на месте на вашем компьютере. Просто создайте файл под названием .pypirc.
в C: \ Пользователи \ chris
(aka ~/
) и поместите следующее содержимое в него, поэтому шпагат не подскажет имя пользователя и пароль:
[distutils] index-servers = pypi [pypi] username = __token__ password =
Обратите внимание, что pypi разрешил только одну версию вашего программного обеспечения на своих серверах навсегда. Даже если вы удалите эту версию из них, вы должны увеличить вашу версию, чтобы нажать новый исходный код на свои серверы, поэтому, если ваши толкающие или CD-трубопровод не удаются, это может быть почему.
И теперь момент истины, толкая наш исходный код в Pypi. Помните, что архив и файл .WL, который мы сгенерировали ранее, находится в /dist
Справочник, так что давайте укажите нашу команду там: Python -m шпагат загрузка dist/*
Огромный успех! Поскольку мой проект сейчас загружен, я могу (вроде) быть моим собственным тестером, используя виртуальную среду! Давайте создадим виртуальную среду, активируйте ее и посмотрим, устанавливается ли наш проект непосредственно из pypi: Python -M PIP Установка He-S-S-Make-Jim
Woohoo! Теперь мы живем здесь Отказ
Хорошо, так что? Мы можем загружать файлы вручную. Это все хорошо и денди, давайте сделаем этот шаг вперед и добавьте CD-трубопровод на наш REPO GitHUB, чтобы автоматизировать этот процесс для нас. Процесс удивительно прост и аналогичен процессу создания трубопровода CI: генерируйте секрет, создайте еще один файл YML (HEH) для регистрации наших действий GitHub, и нажмите. Давайте начнем ( RTFM здесь. )
Помните, что токен API, который я создал раньше? Ну, нам нужен еще один. Этот для GitHub (который является еще одним пользователем, который будет отправлять наш проект от имени нас, поэтому, естественно, нам нужен знак API для них.) Я сгенерировал новый и добавил его в секреты моего репо (на GitHub: Ваше репо> Настройки> Секреты), и назвал его Pypi_password
(Секретное имя будет ссыловаться позже). Затем я создал следующий рабочий процесс .yml.yml.
Файл в моем .Гитеб/рабочие процессы/
папка:
name: CD Pipeline - Publish to PyPI and TestPyPI on: push: # Pattern matched against refs/tags tags: - '*' # Push events to every tag jobs: build-n-publish: name: Publish Python distributions to PyPI and TestPyPI runs-on: ubuntu-latest steps: - uses: actions/checkout@master - name: Set up Python 3.9 uses: actions/setup-python@v1 with: python-version: 3.9 - name: Install pypa/build run: >- python -m pip install build --user - name: Build a binary wheel and a source tarball run: >- python -m build --sdist --wheel --outdir dist/ . - name: Publish distribution to PyPI if: startsWith(github.ref, 'refs/tags') uses: pypa/gh-action-pypi-publish@master with: password: ${{ secrets.pypi_password }}
Теперь, когда мой проект имеет правильный setup.py
Файл сконфигурирован и может правильно генерировать архивы исходного кода для автоматической загрузки CD, давайте попробуем добавить тег на наш проект и посмотреть, автоматически его загружено. ( Напоминание: нам нужен тег, потому что наш CD-трубопровод будет делать этот процесс каждый, каждый раз, когда новый тег нажата ):
Git Tag-A 1.0.4 -M “Big Release!”
Git push –follow-tags
Удивительный. Я не могу поверить, что все это бесплатно. Нереально.
И что, мои друзья, как я потратил на 9 часов, избегая учебы для моих финалов, которые проходят через 9 дней.
С моим проектом сейчас живу, я попросил своего друга Нилан, чтобы проверить свой проект и посмотреть, установит ли он, работает и работает для него из коробки. Процесс пошел что-то подобное:
Я: Эй, я обновил свой проект Readme, вы можете проверить это для меня? Я: Просто следуйте за шагами, перечисленными здесь Отказ Нилан: WTF, я должен установить Python?
<15 минут спустя>
Нилан: Вау, я не могу поверить, что только что сработал из коробки. Мне: Круто эх? Нилан: Это заняло вам четыре месяца, чтобы построить? Мне: … Nilan: также исправить ваш README, это рода запутанное. Добавьте еще несколько, что/где/почему/как детали, но в противном случае ваша программа загружается и бежала идеально. Я: … хорошо.
Было приятно видеть, что программа только что сработала из летучей мыши от установки, и его обратная связь относительно формулировки было действительно полезным, я думаю, что документ действительно хорошо читает.
В течение очень короткого момента вовремя я был номер один в чем-то:
Кроме того, добавление Emojis на действия GitHub делает вещи действительно неприятными, ха-ха.
Все, что я хочу на Рождество, это пройти свои данные структуры и класса алгоритмов.
Оригинал: “https://dev.to/chrispinkney/help-there-s-a-snake-in-my-pipeline-2mp4”