የሞባይል CICD ልምድ፡ ለብዙ የሞባይል አፕሊኬሽኖች አንድ የፈጣን መስመር

የሞባይል CICD ልምድ፡ ለብዙ የሞባይል አፕሊኬሽኖች አንድ የፈጣን መስመር
ፈጣን ሌን በመጠቀም ስለሞባይል አፕሊኬሽኖች ስለ ቀጣይ ውህደት እና ማድረስ ማውራት እፈልጋለሁ። በሁሉም የሞባይል አፕሊኬሽኖች ላይ CI/CD እንዴት እንደምንተገብረው፣ እንዴት እንደደረስን እና በመጨረሻ ምን እንደተፈጠረ።

በመሳሪያው ላይ በአውታረ መረቡ ላይ ቀድሞውኑ በቂ ቁሳቁስ አለ ፣ እኛ መጀመሪያ ላይ የጎደለን ፣ ስለሆነም መሣሪያውን ሆን ብዬ በዝርዝር አልገልጽም ፣ ግን ያኔ ያለንን ብቻ እጠቅሳለሁ ።

ጽሑፉ ሁለት ክፍሎችን ያቀፈ ነው-

  • በኩባንያው ውስጥ የሞባይል CI / ሲዲ መከሰት ዳራ
  • ለኤን-መተግበሪያዎች CI/CD ን ለመልቀቅ ቴክኒካዊ መፍትሄ

የመጀመሪያው ክፍል ለአሮጌው ቀናት የበለጠ ናፍቆት ነው, ሁለተኛው ደግሞ ለራስዎ ማመልከት የሚችሉት ልምድ ነው.

በታሪክ እንዲህ ሆነ

2015 ዓ.ም

የሞባይል አፕሊኬሽኖችን ማዳበር ጀመርን ፣ ከዚያ ስለ ቀጣይነት ያለው ውህደት ፣ ስለ DevOps እና ሌሎች ፋሽን ነገሮች ምንም የምናውቀው ነገር አልነበረም። እያንዳንዱ የመተግበሪያ ማሻሻያ በገንቢው በራሱ ከማሽኑ ተለቅቋል። እና ለ Android ከሆነ በጣም ቀላል ነው - ተሰብስቦ ፣ ተፈርሟል .apk እና ወደ ጎግል ገንቢ ኮንሶል ሰቅለዉ ከዛ ለአይኦኤስ የዚያን ጊዜ በXcode ማከፋፈያ መሳሪያ ጥሩ ምሽቶችን ትቶልናል - ማህደሩን ለማውረድ የተደረገዉ ሙከራ ብዙ ጊዜ በስህተት ያበቃል እና እንደገና መሞከር ነበረብን። በጣም የላቁ ገንቢ በወር ውስጥ ብዙ ጊዜ ኮድ አይጽፍም ፣ ይልቁንም መተግበሪያውን ይለቀቃል።

2016 ዓ.ም

አደግን ፣ ገንቢዎችን ለቀናት ሙሉ ቀን እንዴት ነፃ ማድረግ እንደምንችል አስቀድመን አስበን ነበር ፣ እና ሁለተኛ መተግበሪያ እንዲሁ ታየ ፣ ይህም የበለጠ ወደ አውቶሜሽን ብቻ ገፋን። በዚያው ዓመት፣ ለመጀመሪያ ጊዜ ጄንኪንስን ጫንን እና ፌስትሌን በሰነዱ ውስጥ ከሚያሳየው ጋር ተመሳሳይ የሆኑ አስፈሪ ስክሪፕቶችን ጻፍን።

$ 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 ኮር ውስጥ የተካተቱት ዋና ዋና መገልገያዎች ናቸው gym и pilot, ለመጀመር ችለናል.

የእኛ ስክሪፕቶች ትንሽ ተሻሽለዋል።

$ fastlane gym  —-workspace "Example.xcworkspace" 
                --scheme "AppName" 
                —-buildlog_path "/tmp" 
                -—clean

ሁሉም አስፈላጊ መለኪያዎች ስላልሆኑ ብቻ ተሻሽለዋል xcodebuildማመልከት ያስፈልግዎታል - gym የት እና ምን እንዳለ በግል ይገነዘባል። እና ለበለጠ ማስተካከያ፣ ልክ እንደ ውስጥ ያሉ ተመሳሳይ ቁልፎችን መግለጽ ይችላሉ። xcodebuild፣ የቁልፎቹ ስያሜ ብቻ የበለጠ ግልፅ ነው።

በዚህ ጊዜ፣ ለጂም እና አብሮገነብ የ xcpretty formatter ምስጋና ይግባውና የግንባታ ምዝግብ ማስታወሻዎች የበለጠ ተነባቢ ሆነዋል። ይህ የተበላሹ ስብሰባዎችን ለማስተካከል ጊዜን መቆጠብ ጀመረ እና አንዳንድ ጊዜ የተለቀቀው ቡድን በራሱ ሊገነዘበው ይችላል።

እንደ አለመታደል ሆኖ የመሰብሰቢያ ፍጥነት መለኪያዎች xcodebuild и gym እኛ አላደረግነውም፣ ነገር ግን ሰነዶቹን እናምናለን - እስከ 30% ፍጥነት።

ነጠላ ሂደት ለሁሉም መተግበሪያዎች

2018 እና አሁን

እ.ኤ.አ. በ 2018 ፣ መተግበሪያዎችን የመገንባት እና የማሰራጨት ሂደት ሙሉ በሙሉ ወደ ጄንኪንስ ተዛውሯል ፣ ገንቢዎች ከማሽኖቻቸው መልቀቅ አቆሙ እና የመልቀቂያ ቡድኑ ብቻ የመለቀቅ መብት ነበረው።

አስቀድመን የፈተናዎችን መጀመር እና የማይንቀሳቀስ ትንታኔ ማሻሻል እንፈልጋለን፣ እና የእኛ ስክሪፕቶች አደጉ እና አደጉ። ከመተግበሪያዎቻችን ጋር አደገ እና ተለውጧል። በዚያን ጊዜ ወደ 10 የሚጠጉ መተግበሪያዎች ነበሩ. ሁለት መድረኮች እንዳሉን ግምት ውስጥ በማስገባት 20 ያህል "ሕያው" ስክሪፕቶች ናቸው.

ወደ ስክሪፕቱ አዲስ ደረጃ ለመጨመር በፈለግን ቁጥር ቁርጥራጮቹን ወደ ሁሉም የሼል ስክሪፕቶች መቅዳት ነበረብን። ምናልባት የበለጠ በጥንቃቄ ልንሰራ እንችል ነበር፣ ነገር ግን ብዙ ጊዜ እንደዚህ አይነት ለውጦች በአጻጻፍ ስልት አብቅተዋል፣ ይህም ለተለቀቀው ቡድን ስክሪፕቶችን ለማስተካከል እና የትኛው ብልህ ሰው ይህን ትእዛዝ እንደጨመረ እና ምን እንደሚሰራ ለማወቅ ወደ ምሽት ተለወጠ። በአጠቃላይ ለአንድ መድረክ የመሰብሰቢያ ስክሪፕቶች ቢያንስ በተወሰነ መልኩ ተመሳሳይ ነበሩ ማለት አይቻልም። ምንም እንኳን በእርግጠኝነት ተመሳሳይ ነገር ቢያደርጉም.

ለአዲስ አፕሊኬሽን ሂደት ለመጀመር የእነዚህን ስክሪፕቶች “ትኩስ” ስሪት ለመምረጥ አንድ ቀን ማሳለፍ፣ ማረም እና “አዎ ይሰራል” ማለት አስፈላጊ ነበር።

እ.ኤ.አ. በ2018 የበጋ ወቅት፣ አሁንም በማደግ ላይ ወዳለው የፋስትሌን አቅጣጫ እንደገና ተመለከትን።

ተግባር #1፡ ሁሉንም የስክሪፕት ደረጃዎች ጠቅለል አድርገህ በ Fastfile ውስጥ ፃፋቸው

ስንጀምር፣ የእኛ ስክሪፕቶች በጄንኪንስ ውስጥ በአንድ የሼል ስክሪፕት ውስጥ ያሉትን ሁሉንም ደረጃዎች እና ክራንች ያቀፈ የእግር ልብስ ይመስሉ ነበር። እስካሁን ወደ ቧንቧ መስመር እና በደረጃ ክፍፍል አልቀየርንም።

ያለንን ተመልክተናል እና ከሲአይኤ/ሲዲ መግለጫ ጋር የሚስማሙ 4 ደረጃዎችን ለይተናል።

  • መገንባት - ጥገኛዎችን መጫን, ማህደሩን መሰብሰብ,
  • ሙከራ - የገንቢ ክፍል ሙከራዎችን ማካሄድ ፣ ሽፋንን ማስላት ፣
  • sonar - ሁሉንም ሊንተሮችን ያስነሳ እና ሪፖርቶችን ወደ SonarQube ይልካል ፣
  • ማሰማራት - ቅርስ ወደ አልፋ (የሙከራ በረራ) መላክ።

እና በድርጊት ውስጥ ጥቅም ላይ የዋሉትን ቁልፎች በመተው ወደ ዝርዝሮች ካልገባህ ይህን ፈጣን ፋይል ታገኛለህ፡-

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

በእውነቱ፣ አሁንም የምንፈልጋቸውን አንዳንድ ክራንች እና የተካናቸው የመለኪያዎች ብዛት ግምት ውስጥ በማስገባት የመጀመሪያው ፋስትፋይላችን አስፈሪ ሆነ።

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

ከላይ ባለው ምሳሌ ውስጥ እኛ ልንገልጽላቸው የሚገቡን የመለኪያዎች ክፍል ብቻ እነዚህ የግንባታ መለኪያዎች ናቸው - ንድፍ ፣ ውቅር ፣ የአቅርቦት መገለጫ ስሞች ፣ እንዲሁም የስርጭት መለኪያዎች - የገንቢ መለያ አፕል መታወቂያ ፣ የይለፍ ቃል ፣ የመተግበሪያ መታወቂያ እና የመሳሰሉት። ላይ እንደ መጀመሪያው ግምት ፣ እነዚህን ሁሉ ቁልፎች በልዩ ፋይሎች ውስጥ እናስቀምጣቸዋለን - Gymfile, Matchfile и Appfile.

አሁን በጄንኪንስ እይታን የማያደበዝዙ እና በቀላሉ በአይን ሊነበቡ የሚችሉ አጫጭር ትዕዛዞችን መደወል ይችላሉ-

# fastlane ios <lane_name>

$ fastlane ios build
$ fastlane ios test
$ fastlane ios run_sonar
$ fastlane ios deploy

ሁሬ አሪፍ ነን

ምን አገኘህ? ለእያንዳንዱ እርምጃ ትዕዛዞችን ያጽዱ። የጸዱ ስክሪፕቶች፣ በፍስትላይን ፋይሎች ውስጥ በጥሩ ሁኔታ የተደረደሩ። በመደሰት፣ ወደ ገንቢዎቹ የሚያስፈልጋቸውን ሁሉ ወደ ማከማቻቸው እንዲጨምሩ ጠየቅናቸው።

ግን ተመሳሳይ ችግሮች እንደሚያጋጥሙን በጊዜ ተገነዘብን - አሁንም ቢሆን 20 የስብሰባ ስክሪፕቶች ይኖሩናል በአንድም ሆነ በሌላ መንገድ የራሳቸውን ሕይወት መምራት ይጀምራሉ ፣ ስክሪፕቶቹ ወደ ማጠራቀሚያዎች ስለሚዘዋወሩ እነሱን ለማረም የበለጠ ከባድ ይሆናል ። እና እዚያ መድረስ አልቻልንም። እና በአጠቃላይ ህመማችንን በዚህ መንገድ መፍታት አይቻልም።

የሞባይል CICD ልምድ፡ ለብዙ የሞባይል አፕሊኬሽኖች አንድ የፈጣን መስመር

ተግባር #2፡ ለኤን መተግበሪያዎች አንድ ነጠላ ፈጣን ፋይል ያግኙ

አሁን ችግሩን መፍታት በጣም ከባድ አይደለም - ተለዋዋጮችን ያዘጋጁ እና እንሂድ ። አዎ, በእውነቱ, ችግሩ የተፈታው በዚህ መንገድ ነው. ነገር ግን ባነሳንበት ሰአት በራሱ በፋስትላይን ወይም ፋስትላን በሚፃፍበት በሩቢ ውስጥም ሆነ በኔትወርኩ ላይ ጠቃሚ ምሳሌዎች የለንም። አንድ ገንቢ.

Fastlane የአካባቢ ተለዋዋጮችን ማስተናገድ ይችላል፣ እና ይህንን አስቀድመን የ Keychain ይለፍ ቃል በማዘጋጀት ሞክረነዋል፡-

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.

እና ከዚያ ይህን ቤተ-መጽሐፍት ትንሽ ለየት ባለ መልኩ ለመጠቀም ወሰንን. በገንቢዎች ማከማቻ ውስጥ የፈጣን ስክሪፕቶችን እና የሜታ መረጃውን ሳይሆን የዚህ መተግበሪያ ልዩ ቁልፎችን በፋይሉ ውስጥ እናስቀምጥ .env.appName.

እራሳቸውን Fastfile, Appfile, Matchfile и Gymfile, በተለየ ማከማቻ ውስጥ ደበቅነው. ከሌሎች አገልግሎቶች የይለፍ ቃል ቁልፎች ያለው ተጨማሪ ፋይል እዚያ ተደብቋል - .env.
አንድ ምሳሌ ማየት ይችላሉ እዚህ.

የሞባይል 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.

ተመሳሳይ ስብስብ ለአንድሮይድ አፕሊኬሽኖች እና ReactNative ተዘጋጅቷል፣ ፋይሎቹ በአንድ ማከማቻ ውስጥ ናቸው፣ ግን በተለያዩ ቅርንጫፎች ውስጥ ናቸው። iOS, android и react_native.

የተለቀቀው ቡድን አዲስ እርምጃ ለመጨመር ሲፈልግ በስክሪፕቱ ላይ የተደረጉ ለውጦች በ MR in git በኩል ይመዘገባሉ ፣የተበላሹ ስክሪፕቶችን ወንጀለኞች መፈለግ አያስፈልግም ፣ እና በአጠቃላይ ፣ አሁን እሱን ለመስበር መሞከር አለብዎት።

አሁን ያ እርግጠኛ ነው።

ከዚህ ቀደም ሁሉንም ስክሪፕቶች በመጠበቅ፣ በማዘመን እና ሁሉንም የዝማኔዎች መዘዝ ለማስተካከል ጊዜ አሳልፈናል። የስህተቶች እና የመልቀቂያ ጊዜዎች ምክንያቶች በሼል ስክሪፕቶች ውስጥ ለመከታተል በጣም አስቸጋሪ የሆኑ ቀላል የፊደል ስህተቶች ሲሆኑ በጣም ተስፋ አስቆራጭ ነበር። አሁን እንደዚህ ያሉ ስህተቶች በትንሹ ይቀንሳሉ. ለውጦች በአንድ ጊዜ ለሁሉም መተግበሪያዎች ይለቀቃሉ። እና በሂደቱ ውስጥ አዲስ መተግበሪያን ለማስገባት 15 ደቂቃዎችን ይወስዳል - የአብነት ቧንቧ መስመር በ CI ላይ ያዘጋጁ እና ቁልፎችን ወደ ገንቢው ማከማቻ ያክሉ።

ከ Fastfile ለ Android ጋር ያለው ነጥብ እና የመተግበሪያ ፊርማ ሳይገለጽ የቀረው ይመስላል ፣ ጽሑፉ አስደሳች ከሆነ ቀጣይ እጽፋለሁ። ጥያቄዎችዎን ወይም ጥቆማዎችዎን "ይህን ችግር እንዴት እንደሚፈቱት" በአስተያየቶች ውስጥ ወይም በቴሌግራም ላይ በማየቴ ደስተኛ ነኝ ባሽኪሮቫ.

ምንጭ: hab.com

አስተያየት ያክሉ