Представьте: сейчас 16:00, уровень кофеина снижается, а App Store Connect только что отклонил вашу сборку, потому что Дэйв из отдела маркетинга снова забыл обновить номер сборки… Давайте создадим настолько устойчивый CI/CD-пайплайн, что даже «креативная» версия от Дэйва не сможет его сломать. ☕️
Почему Fastlane — ваш новый лучший друг (извините, Фидо)
Fastlane — это как швейцарский армейский нож, который ещё и готовит эспрессо. Он умеет:
- Синхронизацию номеров сборок (больше никаких «1.0.0.0.1-beta2-final_FINAL»)
- Управление подписью кода (седьмой круг ада для разработчиков iOS)
- Развёртывание в App Store (без необходимости проходить через 15 диалогов аутентификации Apple)
# Fastfile — дирижёр нашего оркестра хаоса
lane :release_android do
increment_version_code(
gradle_file_path: "app/build.gradle"
)
gradle(task: "clean assembleRelease")
upload_to_play_store(
track: 'production',
apk: 'app/build/outputs/apk/release/app-release.apk'
)
slack(message: "🚀 Новая сборка Android подана свежей!")
end
Танцующий CI/CD: от коммита кода до App Store
Pro Tip: Добавьте danger
в свой пайплайн — это как вышибала для плохих PR:
# Dangerfile
warn("Даже не думайте об этом") if !git.commits.any? { |c| c.message =~ /chore|feat|fix/ }
GitHub Actions: личный бариста вашего кода
Вот как сварить идеальный CI-пайплайн:
# .github/workflows/android-release.yml
name: Android Release Espresso Shot
on:
push:
tags:
- 'v*'
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v3
with:
distribution: 'zulu'
java-version: '17'
- name: Run Fastlane
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.2'
- run: bundle install
- run: bundle exec fastlane release_android
Проверенные на практике советы из окопов CI/CD
Управление секретами: используйте
fastlane match
— это как хранилище в Вегасе для ваших идентификаторов подписи кодаmatch( type: "appstore", storage_mode: "s3", s3_bucket: "our-awesome-secrets-bucket" )
Параллельное тестирование: разделяйте тесты на эмуляторах, как суши-повар:
fastlane scan --devices "iPhone 15,iPhone 14" --scheme "MyAppTests"
Удалённый кеш: для сборок Android используйте удалённый кеш Gradle, если вам не нравится смотреть загрузки зависимостей больше, чем видео с котиками
Когда всё идёт не по плану (спойлер: так и будет)
Ошибка «Я не могу в это поверить, но это не подписано кодом»:
# Иногда нужно всё снести орбитальным ударом
fastlane sigh repair --force
fastlane match nuke development
Спецвыпуск «Но у меня работало»:
# Добавьте в конфигурацию CI
- name: Record Build Environment
run: |
echo "Java version: $(java -version)"
echo "Ruby version: $(ruby -v)"
fastlane env
Ваши новые суперсилы CI/CD
Теперь в вашем арсенале:
- Автоматическое увеличение версии (больше никаких сборок «final_FINAL_3»)
- Самовосстанавливающаяся подпись кода (Match творит чудеса)
- Уведомления о развёртывании (Slack-бот исполняет победный танец) Вперёд и автоматизируйте! Ваше будущее «я» (и Дэйв из маркетинга) будут благодарить вас, когда вы будете выпускать обновления с пляжа, потягивая маргариту 🏖️
lane :celebrate do
slack(message: "🔥 Релиз прошёл успешно! Время для тако!")
sh("open https://www.youtube.com/watch?v=dQw4w9WgXcQ")
end