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

Помогите, в моем трубопроводе есть змея

Не альбертанский трубопровод, а трубопровод CI / CD. На этой неделе лаборатория для моего класса развития открытого исходного кода … Помечено с Opensource, Github, Git, Python.

Не альбертанский трубопровод, а трубопровод 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 очень важно для многих причин:

  1. Он отслеживает зависимости вашего проекта, и без этих ваших проектов никогда не будет работать.
  2. Он также используется в процессе упаковки (см. Ниже), чтобы определить, какие зависимости и файлы для отслеживания.

Опять же, у меня уже было 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 Файл работает, я создал виртуальные среды, чтобы увидеть, были ли все мои зависимости устанавливаются правильно:

  1. Python -M VINV HDJ_ENV
  2. . \ HDJ_ENV \ Scripts \ Activate.bat
  3. Установка PIP.
  4. списка пиб

Поскольку ваша новая блестящая виртуальная среда не поставляется с какими-либо предустановленными зависимостями, если зависимости вашего проекта появляются после запуска шага 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”