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

Семантический релиз с Python, Poetry & Github Действия 🚀

Я планирую добавить несколько функций доктора Свена благодаря некотому интересу от моих коллег. До доу … Помечено Python, DevOps, Github.

Я планирую добавить несколько функций в Доктор Свен Благодаря некоторому интересу от моих коллег. Перед тем, как это сделать, мне нужно было создать некоторое подходящее управление релизами, поскольку я буду введен некоторые изменения, а также автоматическое развертывание.

Для управления этой автоматической версией очевидного выбора является семантическая версификация/семантический выпуск, который автоматически увеличивает номер версии на основе конвенций Comments.

Вот как …

  • Автоматическая версия номер увеличивает выпуск релизов.
  • Номера версий на основе обычного формата фиксации (семантическая версия).
  • Автоматически создавать объект выпуска на GitHub.
  • Разрешить только слияние на основные, когда проходят тесты и львая.
  • Выполните релиз после объединения в главную ветку.

Если вы не хотите читать детали, вы должны быть в состоянии реализовать это менее чем за 10 минут.

  1. Установите этот Github Bot для обеспечения применения семантических PRS: https://github.com/apps/semantic-pull-Requests Отказ

  2. Установите ту же номер версии в pyproject.toml и __init__.py Отказ Например:

    ./pyproject.toml.

    src_folder/__ init__.py

  3. Добавить семантический раздел выпуска в pyproject.toml :

  4. Создайте файл .Github/Workflows/Ci.yml В вашем REPO и скопируйте содержимое этого файла в него, чтобы настроить действие CI: https://github.com/mestrak/dr-sven/blob/main/.github/workflows/ci.yml Отказ

Сделанный! Читайте дальше, если вы хотите немного больше объяснений.

Перед погружением в код давайте сделаем свет обзора принципов за семантической версией для понимания того, как генерируются номера версий.

Обычные коммиты

Это спецификация, предназначенная для обеспечения чтения сообщений Commit. Разработчики, использующие эту конвенцию, используют специфические префикс префикс Commuck, такие как Исправить: для коммитов, которые исправляют ошибку, а feat: для коммиентов, которые добавляют новую функцию. Наиболее распространенной конвенцией является Конвенция, разработанная угловой командой, которая включает в себя следующие ключевые слова:

построить: , Хоре: , CI: , Документы: , Стиль: , Refastor: , Perf: , Тест: Отказ

Примера также может быть добавлена в скобки. Например: feat (блог): добавить разбор кода Отказ

Нарушение изменений Также можно добавить в текст Commit, чтобы указать, что Commit не является обратной совместимым.

Эти конвенции по совершенствованию затем используются в спецификации семантической версии для расчета номера версии.

Посмотрите на полную спецификацию здесь Отказ

Кроме того, вот два инструмента, которые стоит расследовать, чтобы помочь обеспечить соблюдение этой конвенции во всех сообщениях Commit:

Семантическая версия

Семантическая версификация или Semver – это спецификация, определяющая четкую систему нумерации логического версии для API. В этом случае на самом деле я на самом деле использую его для версии приложения без внешнего API, но спецификация все еще очень хорошо удерживает, потому что у меня есть требование, чтобы указать, является ли новая релиз обратно совместимым с файлами конфигурации.

Я бы порекомендовал прочитать полную спецификацию, но вот отличное резюме, взятое непосредственно из спецификации:

Учитывая номер версии Major.minor.patch, увеличивать:

  • Основная версия, когда вы делаете несовместимые изменения API,
  • Незначительная версия, когда вы добавляете функциональность в обратной совместимости, и
  • Патч-версия, когда вы делаете обратно совместимые исправления ошибок.

Дополнительные метки для метаданных предварительного выпуска и сборки доступны в качестве расширений до формата Major.minor.patch.

Посмотрите на полную спецификацию здесь Отказ

Различные пакеты, существующие для расчета номера версии Semver на основе обычных сообщений Commit. Мы будем использовать семантический релиз, чтобы сделать это и выполнить релиз одновременно.

Семантический релиз

Семантический выпуск – это инструмент, который автоматически устанавливает номер версии в вашем репо, тегирует код с номером версии и создает выпуск (например, публикацию его на NPM или PYPI).

Это делается с использованием содержимого общепринятых сообщений о стиле фиксации для генерации номера версии. Например, Исправить: Будет поднять версию патч, feat: будет поднять второстепенную версию и сообщение, содержащее Нарушение изменений Поднимите главную версию, чтобы указать, что выпуск не полностью совместим с предыдущей версией.

Оригинал (насколько я знаю) пакет семантик-релиз был создан для узловных проектов и можно найти здесь Отказ

Мы будем использовать реализацию этого проекта Python, Python Semantic Release Отказ

Теперь, когда мы охватывали основные концепции, давайте посмотрим, как их реализовать. Нам нужно сделать следующие вещи, как указано в TL; DR раздел, но на этот раз с немного больше объяснения:

  1. Убедитесь, что обычные коммиты используются.
  2. Настроить семантический релиз в Pyproject.TOML.
  3. Настройте стандарт базового качества CI с помощью действий GitHub.
  4. Добавьте шаг выпуска с помощью семантического выпуска Python.

Убедитесь, что обычные коммиты использовал

Использование обычных коммитов является центральным для всей всей стратегии версий. Если он не используется, то ничего не будет работать. Чтобы обеспечить использование этого типа фиксации на PRS, я буду использовать бот GitHub, который легко устанавливает: https://github.com/apps/semantic-pull-Requests Отказ

Просто установите этот бот для вашего проекта GitHub, и вы автоматически увидите новую проверку на любой новый PR, созданный на вашем проекте. Если PR не содержит коммуникаций, которые соответствуют обычным спецификациям фиксации, то чек не пройдет неудачу.

Как более позднее улучшение, я добавлю предварительный коммитский крючок для репо, чтобы проверить формат локальных сообщений Commit, потому что это может быть довольно раздражает для разработчиков, чтобы обнаружить такие проблемы, как это только тогда, когда пр поднимается.

Первый шаг сделан! Легко справа?

Настроить семантический релиз в PyProject.TOML

Семантический релиз можно настроить в pyproject.toml в соответствии с вашими требованиями. Главное, чтобы отметить здесь:

  • Как мы используем поэзию, вариабельная версия управляется как __init.py__ и pyproject.toml Отказ
  • Филиал установлен на главную, как мы используем стратегию разветвления потока GitHub. Мы хотим, чтобы наши релизы были выполнены с использованием кода на главной ветке, где все код сливается на развертывание производства. Если вы используете другую стратегию, просто измените имя.
  • upload_to_pypi был установлен на ложь, потому что доктор Свен не публикуется на Pypi, поэтому это не имеет значения для меня.
[tool.semantic_release]
version_variable = [
    "dr_sven/__init__.py:__version__",
    "pyproject.toml:version"
]
branch = "main"
upload_to_pypi = false
upload_to_release = true
build_command = "pip install poetry && poetry build"

Настройте базовое качество Step CI с помощью действий GitHub

Если вы читаете это, я предполагаю, что вы уже знаете, что действия GitHub – это решение для рабочего процесса CICD Github. Рабочие процессы настраиваются в файлах YAML, хранящихся в .Github/Workflows папка в вашем репо.

Я использую хороший и простой Github Flow Стратегия ветвления, где все ошибки и функции имеют собственную отдельную ветвь, а при полной работе каждая ветвь объединяется на главный и развернутый.

Трубопровод доктора Свен Чи будет состоять из 2 основных этапов, известных как вакансии:

  • Качество : Запускает линт и автоматизированные тесты в коде, предотвращение слияния, если какие-либо из этих шагов не удаются.
  • Выпуск : Запускается после успешной задачи качества, когда код был объединен в главную ветку.

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

Заголовок определяет, что рабочий процесс CI будет работать всякий раз, когда есть прямой нажим для главного, или привлечь запрос на то, чтобы объединить другую ветку в основной.

name: CI
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

Задание качества будет использовать экземпляр бегуна Ubuntu. Бегун – это имя приложения, которое запускает рабочие места GitHub, такие как тесты на единицу практически так же, как вы запускаете их на вашем компьютере для разработки.

  • Оформить заказ Действие проведет проверку кода, чтобы он был доступен для использования в исполнении Runner.
  • Setup-Python Установит Python на бегун.
jobs:
  Quality:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - uses: actions/setup-python@v2
      with:
        python-version: 3.8

Затем мы устанавливаем поэзию, проверьте версию (не требуется, но иногда полезно видеть в журналах), а затем установить зависимости с помощью поэзии.

    - name: Install Python Poetry
      uses: abatilo/actions-poetry@v2.1.0
      with:
        poetry-version: 1.1.2
    - name: Configure poetry
      shell: bash
      run: python -m poetry config virtualenvs.in-project true
    - name: View poetry version
      run: poetry --version
    - name: Install dependencies
      run: |
        python -m poetry install

Наконец, запустите Flake8 Linting и Pteest Unit Tests на поэзии Virtualenv. Также можно использовать другие тестовые центры или модули.

    - name: Lint with flake8
      run: |
        # stop the build if there are Python syntax errors or undefined names
        python -m poetry run flake8 . --exclude .venv --count --select=E9,F63,F7,F82 --show-source --statistics
        # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
        python -m poetry run flake8 . --exclude .venv --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
    - name: Test with pytest
      run: |
        python -m poetry run python -m pytest -v tests

Это шаг качества готов, простой 🤓.

Добавить шаг выпуска, используя семантический выпуск Python

Теперь, когда наши тесты запустили и пропустили сцену качества, пришло время отпустить нашу новую версию.

Работа выпуска будет работать только после успешного Качество сцена. Мы также проверяем следующее:

  • Это толкание к главному. Это предотвращает проведение выпуска на PRS, прежде чем они будут объединены.
  • Сообщение Commit не содержит Хорей (освобождение) , сообщение, используемое семантическим выбросом, когда выполняется выпуск. Без этого у нас будет бесконечная петля релизов, каждый выпуск вызвал предыдущий релиз.
  Release:
    needs: Quality
    # https://github.community/t/how-do-i-specify-job-dependency-running-in-another-workflow/16482
    if: github.event_name == 'push' && github.ref == 'refs/heads/main' && !contains(github.event.head_commit.message, 'chore(release):')

Теперь установите Python на бегун, оформить код, затем установите и запустите Python-Semantic-Release Опубликовать , который будет:

  1. Поднимите номер версии в обеих файлах версии.
  2. Тейте код с этой версией.
  3. Создайте объект выпуска GitHub.
  4. Совершить обновленные файлы в главную ветку.
    runs-on: ubuntu-latest
    steps:
      - uses: actions/setup-python@v2
        with:
          python-version: 3.8
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Semantic Release
        run: |
          pip install python-semantic-release
          git config user.name github-actions
          git config user.email github-actions@github.com
          semantic-release publish

После этого простого шага наши выпуски теперь создаются, и рабочий процесс завершен. Это может быть даже упрощено дальше, используя Python семантический релиз GitHub Action Отказ

Вот и все!

Теперь мы можем видеть все действия рабочего процесса от Github Действия Страница Отказ Глядя на определенный прогон, мы можем увидеть успешные этапы качества и выпуска:

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

Конечно, некоторые настройки всегда могут быть сделаны для улучшения рабочего процесса, но теперь у нас есть хороший легкий рабочий процесс CI, чтобы поддержать автоматическое тестирование и выпуск, когда я развиваю доктор Свен.

Как Гитлаб сказал: Все в проекте Отказ В соответствии с этим, конечно, есть вещи, которые я могу и улучшится в этом рабочем процессе CI. Вот некоторые из них:

  • Блокировка главной ветви В настоящее время я могу передать непосредственно к главной отрасли, которая является плохой практикой. Поскольку я в настоящее время единственный вкладчик проекта, на данный момент все в порядке, но мне нужно заблокировать ветку и настроить семантический релиз, чтобы использовать конкретный токен с разрешения на то, чтобы нажать на эту ветку при обновлении номеров версий.

  • Приятель в рамках CI В настоящее время я использовал Semantic Commit Bot, который может позволить вам видеть, что ваш PR содержит совместимые коммиты с PR-страницы. Однако технически я мог бы обходить это и совершать что-то без совместимых сообщений непосредственно к основным, пропущенным выпуском. Это может быть предотвращено, добавив шаг приятеля в трубопроводе (также блокировка главной ветви поможет).

  • Тестирование интеграции в CI : Выполнены только тесты единиц. С этой стратегией тестирования все тестирование интеграции должно выполняться вручную на моей машине Dev или в AWS. Не очень Преданный , только приемлемо только в моем простом, одиночной среде разработчика.

  • Предварительный коммит крюк для обеспечения использования обычных коммитов : Предотвратите производительность любых коммитов, если разработчик не использует указанный стиль фиксации. Это предотвращает расстройство разработчика, избегая раздражающего открытия в PR-раз, когда вы не следили за конвенциями проекта.

Спасибо за чтение! Пожалуйста, оставьте комментарий, я рад ответить на любые вопросы, которые вы можете иметь.

Плавник.

Оригинал: “https://dev.to/mestrak/semantic-release-with-python-poetry-github-actions-20nn”