ʻIke Mobile CICD: hoʻokahi maʻamau maʻamau no nā polokalamu kelepona he nui

ʻIke Mobile CICD: hoʻokahi maʻamau maʻamau no nā polokalamu kelepona he nui
Makemake au e kamaʻilio e pili ana i ka hoʻohui mau ʻana a me ka lawe ʻana i nā polokalamu kelepona me ka hoʻohana ʻana i ka fastlane. Pehea mākou e hoʻokō ai i ka CI/CD ma nā polokalamu kelepona āpau, pehea mākou i hiki ai i laila a me ka mea i hana i ka hopena.

Ua lawa nā mea ma ka pūnaewele ma ka mea hana, a mākou i nele i ka hoʻomaka ʻana, no laila ʻaʻole wau e wehewehe kikoʻī i ka hāmeʻa, akā e kuhikuhi wale i ka mea i loaʻa iā mākou i kēlā manawa:

Aia ka ʻatikala i ʻelua ʻāpana:

  • ʻO ke kumu i ka puka ʻana o ka mobile CI/CD i ka hui
  • Hoʻonā ʻenehana no ka ʻōwili ʻana i ka CI/CD no nā noi N

ʻO ka hapa mua ʻoi aku ka nostalgia no nā lā kahiko, a ʻo ka lua he ʻike hiki iā ʻoe ke hoʻopili iā ʻoe iho.

ʻO kēia ke ʻano o ka mōʻaukala

R “ѕѕѕґ 2015

Hoʻomaka wale mākou e hoʻomohala i nā noi kelepona, a laila ʻaʻole mākou i ʻike i kekahi mea e pili ana i ka hoʻohui mau ʻana, e pili ana i nā DevOps a me nā mea ʻē aʻe. Ua hoʻopuka ʻia kēlā me kēia noi noi e ka mea hoʻomohala iā ia iho mai kāna mīkini. A inā no ka Android he mea maʻalahi - hui ʻia, kau inoa ʻia .apk a hoʻouka iā ia i ka Google Developer Console, a laila no IOS ka mea hoʻolaha ma o Xcode i haʻalele iā mākou me nā ahiahi nui - hoʻāʻo e hoʻoiho i ka waihona i pau pinepine i nā hewa a pono mākou e hoʻāʻo hou. Ua ʻike ʻia ʻaʻole kākau ka mea hoʻomohala kiʻekiʻe i ka code i nā manawa he nui i ka mahina, akā hoʻokuʻu i ka noi.

R “ѕѕѕґ 2016

Ua ulu mākou, ua loaʻa iā mākou nā manaʻo e pili ana i ka hoʻokuʻu ʻana i nā mea hoʻomohala mai ka lā holoʻokoʻa no ka hoʻokuʻu ʻana, a ua ʻike pū ʻia kahi noi lua, ʻo ia wale nō ka mea i hoʻoikaika iā mākou i ka automation. I kēlā makahiki hoʻokahi, hoʻokomo mākou iā Jenkins no ka manawa mua a kākau i kahi pūʻulu o nā palapala weliweli, like loa me nā mea i hōʻike ʻia e fastlane i kāna palapala.

$ 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"

ʻO ka mea pōʻino, a hiki i kēia manawa ʻo kā mākou mea hoʻomohala wale nō i ʻike i ka hana ʻana o kēia mau palapala a me ke kumu e pono ai kēia pūʻulu kī pau ʻole, a i ka wā i haki hou ai kekahi mea, loaʻa iā lākou nā "pō nani" no ka nānā ʻana i nā lāʻau.

R “ѕѕѕґ 2017

I kēia makahiki ua aʻo mākou aia kekahi mea e like me ke ala wikiwiki. ʻAʻole nui ka ʻike e like me kēia manawa - pehea e hoʻomaka ai, pehea e hoʻohana ai. A ʻo ka hāmeʻa ponoʻī nō ka mea ʻino i kēlā manawa: ʻo nā hewa mau i hōʻino wale iā mākou a paʻakikī ke manaʻoʻiʻo i ka automation magic a lākou i hoʻohiki ai.

Eia nō naʻe, ʻo nā mea pono nui i hoʻokomo ʻia i ka core fastlane gym и pilot, ua hiki iā mākou ke hoʻomaka.

Ua hoʻomaikaʻi iki ʻia kā mākou palapala.

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

Ua hoʻomaikaʻi ʻia lākou, inā wale nō no ka mea ʻaʻole pono nā ʻāpana āpau xcodebuild, pono ʻoe e hōʻike - gym e hoʻomaopopo kūʻokoʻa i kahi a me ka mea e moe ai. A no ka hoʻoponopono maikaʻi ʻana, hiki iā ʻoe ke kuhikuhi i nā kī like e like me xcodebuild, ʻoi aku ka maopopo o ka inoa o nā kī.

I kēia manawa, mahalo i ka hale hauʻoli a me ka formatter xcpretty i kūkulu ʻia, ua ʻoi aku ka legible o nā papa hana. Ua hoʻomaka kēia e mālama i ka manawa ma ka hoʻoponopono ʻana i nā hui i haki, a i kekahi manawa hiki i ka hui hoʻokuʻu ke noʻonoʻo iā lākou iho.

ʻO ka pōʻino, nā ana wikiwiki o ka hui xcodebuild и gym ʻAʻole mākou i hana, akā e hilinaʻi mākou i ka palapala - a hiki i ka 30% wikiwiki.

Hoʻokahi kaʻina hana no nā noi āpau

ʻO ka makahiki 2018 a i kēia manawa

Ma ka 2018, ua neʻe loa ke kaʻina hana o ke kūkulu ʻana a me ka ʻōwili ʻana i nā noi iā Jenkins, ua kāpae nā mea hoʻomohala i ka hoʻokuʻu ʻana mai kā lākou mau mīkini, a ʻo ka hui hoʻokuʻu wale nō ke kuleana e hoʻokuʻu.

Ua makemake mua mākou e hoʻomaikaʻi i ka hoʻomaka ʻana o nā hoʻokolohua a me ka nānā ʻana, a ua ulu a ulu kā mākou mau palapala. Ua ulu a hoʻololi pū me kā mākou mau noi. I kēlā manawa, aia ma kahi o 10 mau noi. Ke noʻonoʻo nei he ʻelua mau kahua mākou, ʻo ia ka 20 mau palapala "ola".

I kēlā me kēia manawa a mākou e makemake ai e hoʻohui i kahi ʻanuʻu hou i ka palapala, pono mākou e kope-paʻi i nā ʻāpana i loko o nā ʻōkuhi shell āpau. Malia paha ua hiki iā mākou ke hana maʻalahi, akā ua pau nā hoʻololi i nā typos, i lilo i ahiahi no ka hui hoʻokuʻu e hoʻoponopono i nā palapala a ʻike i ke kanaka akamai i hoʻohui i kēia kauoha a me kāna hana maoli. Ma keʻano laulā, ʻaʻole hiki ke ʻōlelo ʻia he ʻano like nā palapala no ka hui ʻana no kahi kahua hoʻokahi. ʻOiai ua hana like lākou.

I mea e hoʻomaka ai i kahi kaʻina hana no kahi noi hou, pono e hoʻolilo i kahi lā e koho ai i kahi mana "hou" o kēia mau palapala, debug a ʻōlelo ʻia "ʻae, hana ia."

I ke kauwela o 2018, ua nānā hou mākou i ke ala wikiwiki e ulu nei.

Hana #1: hōʻuluʻulu i nā ʻanuʻu palapala āpau a kākau hou iā lākou ma Fastfile

I ko mākou hoʻomaka ʻana, ua like ko mākou mau palapala me he lole wāwae wāwae i loko o nā ʻanuʻu a me nā koʻokoʻo i loko o hoʻokahi palapala pūpū ma Jenkins. ʻAʻole mākou i hoʻololi i ka pipeline a me ka mahele ma ke kahua.

Ua nānā mākou i nā mea i loaʻa iā mākou a ʻike i nā ʻanuʻu 4 i kūpono i ka wehewehe ʻana o kā mākou CI / CD:

  • kūkulu - hoʻokomo i nā hilinaʻi, hoʻohui i ka waihona,
  • hoʻāʻo - e holo ana i nā hoʻāʻo ʻana o ka mea hoʻomohala, helu ʻana i ka uhi,
  • sonar - hoʻokuʻu i nā linter āpau a hoʻouna i nā hōʻike iā SonarQube,
  • deploy — hoʻouna i kahi mea kiʻi i ka alpha (TestFlight).

A inā ʻaʻole ʻoe e hele i nā kikoʻī, e haʻalele i nā kī i hoʻohana ʻia i nā hana, e loaʻa iā ʻoe kēia 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

ʻO kaʻoiaʻiʻo, ua lilo kā mākou Fastfile mua i mea weliweli, e noʻonoʻo ana i kekahi o nā koʻokoʻo e pono ai mākou a me ka helu o nā ʻāpana a mākou i hoʻololi ai:

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

Ma ka laʻana ma luna, he ʻāpana wale nō o nā ʻāpana e pono ai mākou e kuhikuhi: ʻo ia nā ʻāpana kūkulu - schema, hoʻonohonoho, Provision Profile inoa, a me nā ʻāpana hoʻoili - Apple ID o ka mea hoʻomohala, ʻōlelo huna, ID noi, a pēlā aku. ma. Ma ke ʻano he hoʻohālikelike mua, kau mākou i kēia mau kī āpau i nā faila kūikawā - Gymfile, Matchfile и Appfile.

I kēia manawa ma Jenkins hiki iā ʻoe ke kāhea i nā kauoha pōkole ʻaʻole e hoʻopuehu i ka ʻike a hiki ke heluhelu ʻia e ka maka:

# fastlane ios <lane_name>

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

Hurray, maikaʻi mākou

He aha kāu i loaʻa ai? Holoi i nā kauoha no kēlā me kēia ʻanuʻu. Hoʻomaʻemaʻe ʻia nā palapala, hoʻonohonoho maikaʻi ʻia i nā faila fastlane. Me ka hauʻoli, holo mākou i nā mea hoʻomohala e noi ana iā lākou e hoʻohui i nā mea āpau e pono ai i kā lākou waihona.

Akā, ua ʻike mākou i ka manawa e hālāwai ai mākou i nā pilikia like - e loaʻa iā mākou he 20 mau palapala hōʻuluʻulu e hoʻomaka ai e ola i ko lākou ola ponoʻī, ʻoi aku ka paʻakikī o ka hoʻoponopono ʻana iā lākou, no ka mea, e neʻe nā palapala i nā waihona. a ʻaʻole hiki iā mākou ke komo i laila. A, ma ka laulā, ʻaʻole hiki ke hoʻoponopono i ko mākou ʻeha i kēia ala.

ʻIke Mobile CICD: hoʻokahi maʻamau maʻamau no nā polokalamu kelepona he nui

Hana #2: e kiʻi i hoʻokahi Fastfile no nā noi N

I kēia manawa, ʻaʻole paʻakikī loa ka hoʻoponopono ʻana i ka pilikia - e hoʻonohonoho i nā mea hoʻololi, a e hele kāua. ʻAe, ʻoiaʻiʻo, ʻo ia ka mea i hoʻoponopono ʻia ai ka pilikia. Akā i kēia manawa a mākou e hoʻopaʻa nei, ʻaʻohe o mākou akamai i ka fastlane ponoʻī, ʻaʻole hoʻi ma Ruby, kahi i kākau ʻia ai ka fastlane, ʻaʻole hoʻi nā hiʻohiʻona pono ma ka pūnaewele - ʻo nā mea a pau i kākau e pili ana i ka fastlane a laila ua kaupalena ʻia i kahi hiʻohiʻona no hoʻokahi noi. no hoʻokahi mea hoʻomohala.

Hiki iā Fastlane ke mālama i nā ʻano like ʻole, a ua hoʻāʻo mākou i kēia ma ka hoʻonohonoho ʻana i ka ʻōlelo huna Keychain:

ENV['KEYCHAIN_PASSWORD']

Ma hope o ka nānā ʻana i kā mākou palapala, ʻike mākou i nā ʻāpana maʻamau:

#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

I kēia manawa, i mea e hoʻomaka ai e hoʻohana i kēia mau kī i nā faila fastlane, pono mākou e noʻonoʻo pehea e hāʻawi ai iā lākou ma laila. Loaʻa iā Fastlane kahi hopena no kēia: ka hoʻouka ʻana i nā mea hoʻololi ma o dotenv. Wahi a ka palapala, inā he mea nui iā ʻoe ke hoʻouka i nā kī no nā kumu like ʻole, e hana i kekahi mau faila hoʻonohonoho i ka papa kuhikuhi fastlane. .env, .env.default, .env.development.

A laila ua hoʻoholo mākou e hoʻohana ʻokoʻa i kēia waihona. E waiho i loko o ka waihona o nā mea hoʻomohala ʻaʻole nā ​​palapala wikiwiki a me kāna ʻike meta, akā nā kī kū hoʻokahi o kēia noi i ka faila. .env.appName.

Ōlelo Sami Fastfile, Appfile, Matchfile и Gymfile, ua hūnā mākou i loko o kahi waihona ʻokoʻa. Ua hūnā ʻia kahi faila hou me nā kī ʻōlelo huna mai nā lawelawe ʻē aʻe ma laila - .env.
Hiki iā ʻoe ke ʻike i kahi laʻana maanei.

ʻIke Mobile CICD: hoʻokahi maʻamau maʻamau no nā polokalamu kelepona he nui

Ma CI, ʻaʻole i loli nui ke kelepona; ua hoʻohui ʻia kahi kī hoʻonohonoho no kahi noi kikoʻī:

# 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

Ma mua o ka holo ʻana i nā kauoha, hoʻouka mākou i kā mākou waihona me nā palapala. ʻAʻole maikaʻi ke nānā aku:

git clone [email protected]/FastlaneCICD.git fastlane_temp

cp ./fastlane_temp/fastlane/* ./fastlane/
cp ./fastlane_temp/fastlane/.env fastlane/.env

Haʻalele i kēia hoʻonā no kēia manawa, ʻoiai he hopena ko Fastlane no ka hoʻoiho ʻana iā Fastfile ma o hana import_from_git, akā hana wale ia no Fastfile, akā ʻaʻole no nā faila ʻē aʻe. Inā makemake ʻoe i "nani maoli", hiki iā ʻoe ke kākau iā ʻoe iho action.

Ua hana ʻia kahi hoʻonohonoho like no nā noi Android a me ReactNative, aia nā faila i ka waihona like, akā ma nā lālā like ʻole. iOS, android и react_native.

Ke makemake ka hui hoʻokuʻu e hoʻohui i kahi hana hou, ua hoʻopaʻa ʻia nā hoʻololi i ka palapala ma o MR ma git, ʻaʻohe pono e ʻimi i nā mea hewa o nā palapala haʻihaʻi, a ma ka laulā, pono ʻoe e hoʻāʻo e wāwahi.

ʻĀnō ʻo ia ka maopopo

Ma mua, ua hoʻohana mākou i ka manawa e mālama ai i nā palapala āpau, e hoʻomaikaʻi ana iā lākou a hoʻoponopono i nā hopena āpau o nā mea hou. He mea hoʻohaʻahaʻa loa ke kumu o ka hewa a me ka manawa haʻahaʻa i ka hoʻokuʻu ʻana he typos maʻalahi i paʻakikī loa ka mālama ʻana i ka jumble o nā palapala shell. I kēia manawa ua hoʻemi ʻia kēlā mau hewa i ka liʻiliʻi. Hoʻololi ʻia nā hoʻololi i nā noi āpau i ka manawa hoʻokahi. A he 15 mau minuke e hoʻokomo i kahi noi hou i ke kaʻina hana - hoʻonohonoho i kahi pipeline template ma CI a hoʻohui i nā kī i ka waihona o ka mea hoʻomohala.

Me he mea lā ʻaʻole i wehewehe ʻia ka helu me Fastfile no ka Android a me ka palapala noi; inā hoihoi ka ʻatikala, e kākau wau i kahi hoʻomau. E hauʻoli wau e ʻike i kāu mau nīnau a manaʻo paha "pehea ʻoe e hoʻoponopono ai i kēia pilikia" ma nā ʻōlelo a i ʻole ma Telegram bashkirova.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka