Mobile CICD-ийн туршлага: олон гар утасны програмуудад зориулсан нэг хурдан стандарт

Mobile CICD-ийн туршлага: олон гар утасны програмуудад зориулсан нэг хурдан стандарт
Би fastlane ашиглан гар утасны програмуудыг тасралтгүй нэгтгэх, хүргэх талаар ярихыг хүсч байна. Бид бүх гар утасны програмууд дээр CI/CD-г хэрхэн хэрэгжүүлж, тэнд хэрхэн хүрсэн, эцэст нь юу болсон.

Сүлжээнд хэрэглүүр дээр хангалттай материал байгаа бөгөөд бид эхэндээ дутмаг байсан тул би уг хэрэгслийг нарийвчлан тайлбарлахгүй, зөвхөн тэр үед байсан зүйлийг л дурдах болно.

Нийтлэл нь хоёр хэсгээс бүрдэнэ.

  • Компанид гар утасны 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 ассемблей скрипттэй хэвээр байх болно, скриптүүд хадгалах газар руу шилжих тул тэдгээрийг засварлахад илүү хэцүү байх болно. мөн бид тэнд нэвтрэх эрхгүй байсан. Тэгээд ер нь бидний зовлонг ингэж шийдэх боломжгүй.

Mobile CICD-ийн туршлага: олон гар утасны програмуудад зориулсан нэг хурдан стандарт

Даалгавар №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 үүнд зориулсан шийдэлтэй: dotenv-ээр дамжуулан хувьсагчдыг ачаалах. Баримт бичигт хэрэв танд өөр өөр зорилгоор түлхүүр ачаалах нь чухал бол fastlane директорт хэд хэдэн тохиргооны файл үүсгэнэ үү. .env, .env.default, .env.development.

Тэгээд бид энэ номын санг арай өөрөөр ашиглахаар шийдсэн. Хөгжүүлэгчийн санд fastlane скриптүүд болон түүний мета мэдээллийг биш, харин энэ програмын өвөрмөц түлхүүрүүдийг файлд байрлуулцгаая. .env.appName.

Өөрсдийгөө Fastfile, Appfile, Matchfile и Gymfile, бид үүнийг тусдаа хадгалах газарт нуусан. Бусад үйлчилгээний нууц үг бүхий нэмэлт файлыг тэнд нуусан - .env.
Та жишээг харж болно энд.

Mobile CICD-ийн туршлага: олон гар утасны програмуудад зориулсан нэг хурдан стандарт

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

сэтгэгдэл нэмэх