Би fastlane ашиглан гар утасны програмуудыг тасралтгүй нэгтгэх, хүргэх талаар ярихыг хүсч байна. Бид бүх гар утасны програмууд дээр CI/CD-г хэрхэн хэрэгжүүлж, тэнд хэрхэн хүрсэн, эцэст нь юу болсон.
Сүлжээнд хэрэглүүр дээр хангалттай материал байгаа бөгөөд бид эхэндээ дутмаг байсан тул би уг хэрэгслийг нарийвчлан тайлбарлахгүй, зөвхөн тэр үед байсан зүйлийг л дурдах болно.
Албан ёсны fastlane баримт бичиг Бусад компаниудын жишээ Бид Fastlane ашиглан iOS програмуудын угсралтыг автоматжуулдаг
Нийтлэл нь хоёр хэсгээс бүрдэнэ.
- Компанид гар утасны CI/CD бий болсон тухай мэдээлэл
- N-програмд зориулсан CI/CD-г гаргах техникийн шийдэл
Эхний хэсэг нь хуучин өдрүүдээ илүү дурсах, хоёрдугаарт та өөртөө хэрэглэж болох туршлага юм.
Түүхэнд ийм л болсон
2015 он
Бид дөнгөж сая гар утасны програмуудыг хөгжүүлж эхэлсэн бөгөөд дараа нь бид тасралтгүй интеграцчлал, DevOps болон бусад загварлаг зүйлсийн талаар юу ч мэдэхгүй байсан. Програмын шинэчлэл бүрийг хөгжүүлэгч өөрөө өөрийн машинаас гаргасан. Хэрэв Android-ийн хувьд энэ нь маш энгийн бол угсарч, гарын үсэг зурсан .apk
мөн үүнийг Google Developer Console-д байршуулсан бөгөөд дараа нь iOS-ийн хувьд Xcode-ээр дамжуулан түгээх хэрэгсэл бидэнд сайхан үдшийг үлдээсэн - архивыг татаж авах оролдлого нь ихэвчлэн алдаатай дуусч, дахин оролдох шаардлагатай болсон. Хамгийн дэвшилтэт хөгжүүлэгч сард хэд хэдэн удаа код бичдэггүй, харин програмаа гаргадаг болох нь тогтоогдсон.
2016 он
Бид өсч том болсон тул хөгжүүлэгчдийг бүтэн өдрийн турш хэрхэн чөлөөлөх талаар бодож байсан бөгөөд хоёр дахь програм гарч ирсэн нь биднийг автоматжуулалт руу түлхсэн юм. Тэр жил бид Женкинсийг анх суулгаж, fastlane-ийн баримт бичигт үзүүлсэнтэй маш төстэй аймшигт скриптүүдийг бичсэн.
$ xcodebuild clean archive -archivePath build/MyApp
-scheme MyApp
$ xcodebuild -exportArchive
-exportFormat ipa
-archivePath "build/MyApp.xcarchive"
-exportPath "build/MyApp.ipa"
-exportProvisioningProfile "ProvisioningProfileName"
$ cd /Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/
$ ./altool —upload-app
-f {abs path to your project}/build/{release scheme}.ipa
-u "[email protected]"
-p "PASS_APPLE_ID"
Харамсалтай нь өнөөг хүртэл эдгээр скриптүүд хэрхэн ажилладаг, яагаад энэ эцэс төгсгөлгүй товчлуурууд хэрэгтэй байгааг зөвхөн манай хөгжүүлэгчид л мэддэг байсан бөгөөд ямар нэг зүйл дахин эвдэрсэн үед тэд логийг шинжлэх "гоёмсог үдшүүд" авсан.
2017 он
Энэ жил бид fastlane гэж ийм зүйл байдгийг мэдсэн. Хэрхэн эхлүүлэх, хэрхэн ашиглах талаар одоогийнх шиг тийм их мэдээлэл байгаагүй. Тухайн үед энэ хэрэгсэл нь өөрөө бүдүүлэг хэвээр байсан: байнгын алдаанууд нь бидний урмыг хугалсан бөгөөд тэдний амласан ид шидийн автоматжуулалтад итгэхэд хэцүү байсан.
Гэсэн хэдий ч, fastlane цөмд багтсан гол хэрэгслүүд нь gym
и pilot
, бид үүнийг эхлүүлж чадсан.
Манай скриптүүд бага зэрэг сайжирсан.
$ fastlane gym —-workspace "Example.xcworkspace"
--scheme "AppName"
—-buildlog_path "/tmp"
-—clean
Шаардлагатай бүх параметрүүдийг хангаагүй тул тэдгээрийг сайжруулсан xcodebuild
, та зааж өгөх хэрэгтэй - gym
хаана, юу байгааг бие даан ойлгох болно. Илүү нарийн тохируулахын тулд та дээрхтэй ижил товчлууруудыг зааж өгч болно xcodebuild
, зөвхөн товчлууруудын нэрс илүү тодорхой байна.
Энэ удаад биеийн тамирын заал болон суурилуулсан xcpretty форматлагчийн ачаар угсралтын бүртгэлүүд илүү гаргацтай болсон. Энэ нь эвдэрсэн угсралтыг засахад цаг хугацаа хэмнэж эхэлсэн бөгөөд заримдаа суллах баг үүнийг өөрсдөө шийдэж чаддаг байв.
Харамсалтай нь угсралтын хурдыг хэмждэг xcodebuild
и gym
Бид үүнийг хийгээгүй, гэхдээ бид баримт бичигт итгэх болно - 30% хүртэл хурдасгах.
Бүх програмуудад зориулсан нэг процесс
2018 он ба одоо
2018 он гэхэд програмуудыг бүтээх, нэвтрүүлэх үйл явц Женкинс рүү бүрэн шилжиж, хөгжүүлэгчид машинаасаа гаргахаа больсон бөгөөд зөвхөн хувилбарын баг гаргах эрхтэй болсон.
Бид тест болон статик анализын эхлэлийг сайжруулахыг аль хэдийн хүсч байсан бөгөөд бидний скриптүүд өсч, өссөн. Манай аппликешнүүдийн хамт хөгжиж, өөрчлөгдсөн. Тухайн үед 10 орчим програм байсан.Бид хоёр платформтойг бодоход 20 орчим “амьд” скрипт гэсэн үг.
Бид скриптэд шинэ алхам нэмэхийг хүсэх болгондоо бүх бүрхүүлийн скриптүүдэд хэсгүүдийг хуулж буулгах шаардлагатай болдог. Магадгүй бид илүү анхааралтай ажиллаж болох байсан ч ийм өөрчлөлтүүд ихэвчлэн үсгийн алдаагаар дуусдаг байсан бөгөөд энэ нь хувилбарын багийнхан скриптийг засах, аль ухаалаг залуу энэ тушаалыг нэмсэн, энэ нь яг юу болохыг олж мэдэхийн тулд орой болж хувирдаг. Ерөнхийдөө нэг платформыг угсрах скриптүүд дор хаяж ижил төстэй байсан гэж хэлж болохгүй. Хэдийгээр тэд ижил зүйлийг хийсэн нь гарцаагүй.
Шинэ програмын процессыг эхлүүлэхийн тулд эдгээр скриптүүдийн "шинэ" хувилбарыг сонгоод дибаг хийж, "тиймээ, энэ ажиллаж байна" гэж хэлэхийн тулд нэг өдөр зарцуулах шаардлагатай болсон.
2018 оны зун бид дахин хөгжиж буй хурдны зам руу харлаа.
Даалгавар №1: скриптийн бүх алхмуудыг нэгтгэн Fastfile дээр дахин бичнэ үү
Биднийг эхлэхэд бидний скриптүүд Женкинс дэх нэг бүрхүүлийн скрипт дэх бүх шат, таягнаас бүрдсэн хөлийн даавуу шиг харагдаж байв. Дамжуулах хоолой, үе шаттайгаар хуваах горимд хараахан шилжээгүй байна.
Бид өөрт байгаа зүйлээ үзээд CI/CD-ийн тайлбарт тохирох 4 алхамыг тодорхойлсон:
- бүтээх - хамаарлыг суулгах, архивыг угсрах,
- тест - хөгжүүлэгчийн нэгжийн тестийг ажиллуулах, хамрах хүрээг тооцоолох,
- sonar - бүх линтерийг ажиллуулж, SonarQube руу тайлан илгээдэг,
- deploy — олдворыг альфа руу илгээх (TestFlight).
Хэрэв та үйлдлүүдэд ашигласан товчлууруудыг орхигдуулахгүйгээр дэлгэрэнгүй мэдээлэл өгөхгүй бол энэ Fastfile-г авах болно:
default_platform(:ios)
platform :ios do
before_all do
unlock
end
desc "Build stage"
lane :build do
match
prepare_build
gym
end
desc "Prepare build stage: carthage and cocoapods"
lane :prepare_build do
pathCartfile = ""
Dir.chdir("..") do
pathCartfile = File.join(Dir.pwd, "/Cartfile")
end
if File.exist?(pathCartfile)
carthage
end
pathPodfile = ""
Dir.chdir("..") do
pathPodfile = File.join(Dir.pwd, "/Podfile")
end
if File.exist?(pathPodfile)
cocoapods
end
end
desc "Test stage"
lane :test do
scan
xcov
end
desc "Sonar stage (after run test!)"
lane :run_sonar do
slather
lizard
swiftlint
sonar
end
desc "Deploy to testflight stage"
lane :deploy do
pilot
end
desc "Unlock keychain"
private_lane :unlock do
pass = ENV['KEYCHAIN_PASSWORD']
unlock_keychain(
password: pass
)
end
end
Үнэн хэрэгтээ бидний анхны Fastfile нь бидэнд хэрэгтэй хэвээр байгаа зарим таягнууд болон бидний орлуулсан параметрүүдийн тоог харгалзан үзэхэд аймшигтай болсон.
lane :build do
carthage(
command: "update",
use_binaries: false,
platform: "ios",
cache_builds: true)
cocoapods(
clean: true,
podfile: "./Podfile",
use_bundle_exec: false)
gym(
workspace: "MyApp.xcworkspace",
configuration: "Release",
scheme: "MyApp",
clean: true,
output_directory: "/build",
output_name: "my-app.ipa")
end
lane :deploy do
pilot(
username: "[email protected]",
app_identifier: "com.example.app",
dev_portal_team_id: "TEAM_ID_NUMBER_DEV",
team_id: "ITS_TEAM_ID")
end
Дээрх жишээнд бидний зааж өгөх шаардлагатай параметрүүдийн зөвхөн нэг хэсэг нь: эдгээр нь бүтээх параметрүүд - схем, тохиргоо, Профайлын нэр, түгээлтийн параметрүүд - хөгжүүлэгчийн дансны Apple ID, нууц үг, програмын ID гэх мэт. дээр. Эхний ойролцоо байдлаар бид эдгээр бүх түлхүүрүүдийг тусгай файлд оруулсан болно. Gymfile
, Matchfile
и Appfile
.
Одоо Женкинс дээр та харагдах байдлыг бүдгэрүүлдэггүй, нүдээр уншихад хялбар богино командуудыг дуудаж болно.
# fastlane ios <lane_name>
$ fastlane ios build
$ fastlane ios test
$ fastlane ios run_sonar
$ fastlane ios deploy
Уяа, бид мундаг байна
Та юу авсан бэ? Алхам бүрийн тушаалуудыг арилгах. Цэвэрлэсэн скриптүүд, fastlane файлуудад маш нарийн байрлуулсан. Баярласандаа бид хөгжүүлэгчид рүү гүйж, тэднээс шаардлагатай бүх зүйлийг хадгалах сандаа нэмэхийг хүссэн.
Гэхдээ бид ижил бэрхшээлтэй тулгарах болно гэдгийг бид цаг тухайд нь ойлгосон - бид ямар нэгэн байдлаар өөрсдийн амьдралаар амьдарч эхлэх 20 ассемблей скрипттэй хэвээр байх болно, скриптүүд хадгалах газар руу шилжих тул тэдгээрийг засварлахад илүү хэцүү байх болно. мөн бид тэнд нэвтрэх эрхгүй байсан. Тэгээд ер нь бидний зовлонг ингэж шийдэх боломжгүй.
Даалгавар №2: N програмд зориулсан ганц Fastfile авах
Одоо асуудлыг шийдэх нь тийм ч хэцүү биш юм шиг санагдаж байна - хувьсагчдыг тохируулаад явцгаая. Тийм ээ, үнэн хэрэгтээ асуудал ингэж шийдэгдсэн. Гэхдээ бид үүнийг эвдэж байх үед бид fastlane өөрөө ч, fastlane бичигдсэн Ruby-ийн талаар ч туршлагагүй, сүлжээнд хэрэгтэй жишээ ч байгаагүй - тэр үед fastlane-ийн тухай бичсэн хүн бүр нэг програмын жишээгээр хязгаарлагдаж байсан. нэг хөгжүүлэгчийн хувьд.
Fastlane нь орчны хувьсагчдыг зохицуулах боломжтой бөгөөд бид Түлхүүрийн оосорын нууц үгийг тохируулснаар үүнийг аль хэдийн туршиж үзсэн:
ENV['KEYCHAIN_PASSWORD']
Скриптүүдээ харсны дараа бид нийтлэг хэсгүүдийг тодорхойлсон:
#for build, test and deploy
APPLICATION_SCHEME_NAME=appScheme
APPLICATION_PROJECT_NAME=app.xcodeproj
APPLICATION_WORKSPACE_NAME=app.xcworkspace
APPLICATION_NAME=appName
OUTPUT_IPA_NAME=appName.ipa
#app info
APP_BUNDLE_IDENTIFIER=com.example.appName
[email protected]
TEAM_ID=ABCD1234
FASTLANE_ITC_TEAM_ID=123456789
Одоо эдгээр түлхүүрүүдийг fastlane файлд ашиглаж эхлэхийн тулд бид тэдгээрийг хэрхэн тэнд хүргэхийг олж мэдэх хэрэгтэй болсон. Fastlane үүнд зориулсан шийдэлтэй: .env
, .env.default
, .env.development
.
Тэгээд бид энэ номын санг арай өөрөөр ашиглахаар шийдсэн. Хөгжүүлэгчийн санд fastlane скриптүүд болон түүний мета мэдээллийг биш, харин энэ програмын өвөрмөц түлхүүрүүдийг файлд байрлуулцгаая. .env.appName
.
Өөрсдийгөө Fastfile
, Appfile
, Matchfile
и Gymfile
, бид үүнийг тусдаа хадгалах газарт нуусан. Бусад үйлчилгээний нууц үг бүхий нэмэлт файлыг тэнд нуусан - .env
.
Та жишээг харж болно
CI дээр дуудлага тийм ч их өөрчлөгдөөгүй; тодорхой програмын тохиргооны түлхүүр нэмэгдсэн:
# fastlane ios <lane_name> --env appName
$ fastlane ios build --env appName
$ fastlane ios test --env appName
$ fastlane ios run_sonar --env appName
$ fastlane ios deploy --env appName
Командуудыг ажиллуулахын өмнө бид репозиторыг скриптээр ачаалдаг. Тийм ч сайхан харагдахгүй байна:
git clone [email protected]/FastlaneCICD.git fastlane_temp
cp ./fastlane_temp/fastlane/* ./fastlane/
cp ./fastlane_temp/fastlane/.env fastlane/.env
Fastlane-д Fastfile-г татаж авах шийдэл байгаа хэдий ч одоохондоо энэ шийдлийг орхисон import_from_git
, гэхдээ энэ нь зөвхөн Fastfile-д ажилладаг боловч бусад файлуудад ажиллахгүй. Хэрэв та "үнэхээр үзэсгэлэнтэй" байхыг хүсч байвал өөрөө бичиж болно action
.
Үүнтэй төстэй багцыг Android програмууд болон ReactNative-д зориулж хийсэн бөгөөд файлууд нь нэг репозитор, гэхдээ өөр өөр салбаруудад байдаг. iOS
, android
и react_native
.
Хувилбарын баг шинэ алхам нэмэхийг хүсэх үед скриптийн өөрчлөлтийг git дээр MR-ээр тэмдэглэдэг, эвдэрсэн скриптүүдийн буруутныг хайх шаардлагагүй болсон бөгөөд ерөнхийдөө одоо та үүнийг эвдэхийг оролдох хэрэгтэй.
Одоо энэ бол гарцаагүй
Өмнө нь бид бүх скриптүүдийг хадгалах, шинэчлэх, шинэчлэлтийн бүх үр дагаврыг засахад цаг зарцуулдаг байсан. Хувилбарын алдаа болон сул зогсолтын шалтгаан нь бүрхүүлийн скриптүүдийн төөрөгдлөөс анзаарагдахад маш хэцүү энгийн үсгийн алдаа байсан нь маш их урам хугарсан. Одоо ийм алдаа хамгийн бага хэмжээнд хүртэл буурч байна. Өөрчлөлтүүд нь бүх програмд нэгэн зэрэг шилждэг. Процесс руу шинэ програм оруулахад 15 минут шаардагдана - CI дээр загвар дамжуулах шугамыг тохируулж, хөгжүүлэгчийн репозитор руу түлхүүрүүдийг нэмнэ үү.
Android-д зориулсан Fastfile болон програмын гарын үсэгтэй холбоотой асуудал тодорхойгүй хэвээр байх шиг байна; хэрэв нийтлэл сонирхолтой байвал би үргэлжлэл бичих болно. "Та энэ асуудлыг хэрхэн шийдэх вэ" гэсэн асуулт эсвэл саналыг коммент эсвэл Telegram дээр харахдаа баяртай байх болно.
Эх сурвалж: www.habr.com