Github Actions CI для проектов Swift
Гитхаб представил CI и CD на основе действий. Он позволяет автоматизировать анализ, сборку, тестирование и развертывание ваших проектов на любой платформе, включая Linux, macOS и Windows.
Я был взволнован этой новостью и не могу дождаться, чтобы попробовать его. Моя идея заключалась в том, чтобы автоматизировать сборку и модульное тестирование проектов Swift.
Есть два типа действий, и мы должны знать разницу перед началом.
Контейнер Docker против JS
Изначально все действия были основаны на Docker и использовали синтаксис HCL для рабочих процессов. Действия на основе Docker выполняются только в виртуальной среде Linux. С анонсом CI/CD Github выпустил действия на основе JavaScript и новый синтаксис YAML для рабочих процессов.
Для проектов iOS вы можете использовать только действия JS, потому что они должны выполняться на macOS. Кроме того, использование действия JavaScript упрощает код действия и выполняется быстрее, чем действие контейнера Docker.
Огни! Камера! Гитхаб Акция!
В качестве примера я буду использовать Тексстайл. Это фреймворк для форматирования строк с атрибутами. Давайте начнем с полной конфигурации и рассмотрим ее шаг за шагом:
on: pull_request
name: Test
jobs:
test:
name: Test
runs-on: macOS-latest
strategy:
matrix:
destination: ['platform=iOS Simulator,OS=12.2,name=iPhone X', 'platform=tvOS Simulator,OS=12.2,name=Apple TV 4K']
steps:
- name: Checkout
uses: actions/checkout@master
- name: Build and test
run: |
cd Texstyle
xcodebuild clean test -project Texstyle.xcodeproj -scheme Texstyle -destination "${destination}" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO ONLY_ACTIVE_ARCH=NO
bash <(curl -s
env:
destination: ${{ matrix.destination }}
Сначала вы должны выбрать событие для запуска рабочего процесса. Мой рабочий процесс запускается при любом запросе на включение в репозиторий. При желании вы можете пометить рабочий процесс с помощью name
.
Рабочий процесс должен содержать хотя бы одно задание. Мой рабочий процесс содержит только одно задание для тестирования. Можно одновременно запускать до 20 заданий на репозиторий во всех рабочих процессах.
Задания выполняются на виртуальных хост-машинах, указанных с помощью runs-on
. В моем случае это macOS-latest
, потому что я хочу использовать xcodebuild. Это стандартный инструмент разработчика Apple, который работает только на macOS.
Texstyle поддерживает как iOS, так и tvOS, поэтому я хочу запустить xcodebuild с двумя пунктами назначения. Чтобы указать различные варианты, я использовал strategy.matrix
. Я добавил два симулятора с актуальными версиями ОС.
И последний шаг — добавление шагов 🙃. я использовал checkout
действие для доступа к содержимому репозитория. Вы можете указать версию действий после знака @ с версией релиза, веткой или конкретным коммитом.
Все готово к испытаниям. я добавил run
с помощью команд bash для изменения текущего каталога, запуска xcodebuild и отправки данных о покрытии кода на кодек. Чтобы использовать матричные переменные, я добавил env
с требуемым именем переменной.
Чтобы узнать больше о синтаксисе рабочего процесса, см. документация.
По сравнению с Travis CI моя конфигурация выглядела так:
language: swift
osx_image: xcode10.2
env:
matrix:
- DESTINATION="platform=iOS Simulator,OS=12.2,name=iPhone X"
- DESTINATION="platform=tvOS Simulator,OS=12.2,name=Apple TV 4K"
before_script: cd Texstyle
script:
- xcodebuild clean test -project Texstyle.xcodeproj -scheme Texstyle -destination "$DESTINATION" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO ONLY_ACTIVE_ARCH=NO
after_success:
- bash <(curl -s
Вот и все! Вот пример живых журналов:
Но это не конец, это только начало! Предположим, что мы хотим отклонить запросы на включение, если есть какие-либо предупреждения или ошибки линтинга. Самый популярный инструмент lint для Swift — это Свифтлинт. Пока можно запустить и посмотреть предупреждения в логах, что не хватает. Было бы здорово увидеть аннотации от SwiftLint Violations через GitHub проверяет API, или даже предложили изменения. А действия позволяют легко использовать этот API.
Вывод
Что касается меня, Github Actions CI меняет правила игры. Он глубоко интегрирован в сервис. А действия сообщества позволяют повторно использовать общие сценарии.
Подытожу свой опыт плюсами и минусами.
Плюсы:
- Различные триггеры для рабочих процессов. Запросы на вытягивание, открытые репозитории, статусы карточек проектов, запланированные события и т. д.
- Скорость. Согласно логам Texstyle, последние сборки длились 2 минуты 12 секунд на Travis CI и 1 минуту 8 секунд на Github CI.
- Предустановленное программное обеспечение. В образах macOS есть fastlane, swiftlint, Cocoapods, Carthage и т. д.
- Торговая площадка. Есть много действий, разработанных сообществом. Вы можете повторно использовать любой из них.
- Цены. Конечно, это бесплатно для открытого исходного кода. Ограничения по времени выглядят неплохо — 2000 минут на бесплатном тарифе и 3000 минут на тарифе Pro, включая приватные репозитории 😏.
Минусы:
- Все еще в бета-версии. Первые действия были написаны на синтаксисе HCL. Его поддержка будет прекращена 30 сентября. И, возможно, это еще не конец, синтаксис YAML также может быть обновлен. Так что будьте готовы перенести свои действия до публичного релиза.
- Отладка. Трудно отлаживать рабочие процессы, как любую службу CI. Вы должны инициировать связанное событие и дождаться выполнения всех шагов. Невозможно протестировать его локально, даже проверить синтаксис рабочего процесса.
- Документация. Одна из целей этой статьи — прояснить преимущества действий для себя и попробовать их в реальном проекте. У меня было много неочевидных ошибок, официальная документация и StackOverflow не помогут. Например, многострочная команда запуска не будет работать без
name
этикетка. Я считаю, что рабочие процессы с открытым исходным кодом помогут избежать ошибок дампа и справиться с крайними случаями в будущем.
Спасибо за чтение! Если у вас есть какие-либо вопросы или идеи о рабочих процессах, не стесняйтесь оставлять комментарии или пинговать меня в Твиттере. @иосартем.
использованная литература
Автоматизация рабочего процесса с помощью GitHub Actions
Действия на гитхабе
Потрясающие действия