Iriri CICD Alagbeka: boṣewa fastlane kan fun ọpọlọpọ awọn ohun elo alagbeka

Iriri CICD Alagbeka: boṣewa fastlane kan fun ọpọlọpọ awọn ohun elo alagbeka
Emi yoo fẹ lati sọrọ nipa iṣọpọ lemọlemọfún ati ifijiṣẹ fun awọn ohun elo alagbeka nipa lilo fastlane. Bii a ṣe n ṣe CI / CD lori gbogbo awọn ohun elo alagbeka, bawo ni a ṣe de ibẹ ati ohun ti o ṣẹlẹ ni ipari.

Ohun elo ti wa tẹlẹ lori nẹtiwọọki lori ọpa, eyiti a ko ni ni ibẹrẹ, nitorinaa Emi kii yoo mọọmọ ṣapejuwe ọpa ni awọn alaye, ṣugbọn yoo tọka si ohun ti a ni lẹhinna:

Nkan naa ni awọn ẹya meji:

  • Isalẹ si ifarahan ti CI / CD alagbeka ni ile-iṣẹ naa
  • Ojutu imọ-ẹrọ fun yiyi CI / CD fun awọn ohun elo N

Apa akọkọ jẹ diẹ nostalgia fun awọn ọjọ atijọ, ati keji jẹ iriri ti o le lo si ara rẹ.

Eyi ni bi o ṣe ṣẹlẹ ni itan

Ọdun 2015

A ṣẹṣẹ bẹrẹ idagbasoke awọn ohun elo alagbeka, lẹhinna a ko mọ ohunkohun nipa iṣọpọ igbagbogbo, nipa DevOps ati awọn nkan asiko miiran. Imudojuiwọn ohun elo kọọkan ti yiyi nipasẹ olupilẹṣẹ funrararẹ lati ẹrọ rẹ. Ati pe ti o ba jẹ fun Android o rọrun pupọ - pejọ, fowo si .apk o si gbe e si Google Developer Console, lẹhinna fun iOS ohun elo pinpin lẹhinna nipasẹ Xcode fi wa silẹ pẹlu awọn irọlẹ nla - awọn igbiyanju lati ṣe igbasilẹ igbasilẹ nigbagbogbo ni awọn aṣiṣe ati pe a ni lati gbiyanju lẹẹkansi. O wa ni jade wipe awọn julọ to ti ni ilọsiwaju Olùgbéejáde ko ni kọ koodu ni igba pupọ osu kan, sugbon dipo tu awọn ohun elo.

Ọdun 2016

A dagba, a ti ni awọn ero tẹlẹ nipa bi o ṣe le gba awọn olupilẹṣẹ laaye lati gbogbo ọjọ kan fun itusilẹ, ati pe ohun elo keji tun han, eyiti o fa wa siwaju sii si adaṣe. Ni ọdun kanna, a fi Jenkins sori ẹrọ fun igba akọkọ ati kọ ọpọlọpọ awọn iwe afọwọkọ idẹruba, ti o jọra si awọn ti fastlane fihan ninu iwe rẹ.

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

Laanu, titi di bayi awọn olupilẹṣẹ wa nikan ni o mọ bii awọn iwe afọwọkọ wọnyi ṣe n ṣiṣẹ ati idi ti a nilo akopọ ailopin ti awọn bọtini, ati nigbati ohunkan tun bajẹ, wọn ni “awọn irọlẹ lẹwa” fun itupalẹ awọn akọọlẹ.

Ọdun 2017

Ni ọdun yii a kẹkọọ pe iru nkan kan wa bi fastlane. Ko si alaye pupọ bi o ti wa ni bayi - bii o ṣe le bẹrẹ ọkan, bii o ṣe le lo. Ati pe ọpa funrararẹ tun jẹ robi ni akoko yẹn: awọn aṣiṣe igbagbogbo jẹ ibanujẹ wa nikan ati pe o nira lati gbagbọ ninu adaṣe idan ti wọn ṣe ileri.

Sibẹsibẹ, awọn ohun elo akọkọ ti o wa ninu mojuto fastlane jẹ gym и pilot, a ṣakoso lati bẹrẹ.

Awọn iwe afọwọkọ wa ti ni ilọsiwaju diẹ.

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

Wọn ti ni ilọsiwaju, ti o ba jẹ pe nitori kii ṣe gbogbo awọn paramita pataki fun xcodebuild, o nilo lati tọka - gym yoo ominira ye ibi ti ati ohun ti o wa da. Ati fun atunṣe itanran diẹ sii, o le pato awọn bọtini kanna bi ninu xcodebuild, nikan ni loruko ti awọn bọtini ni clearer.

Ni akoko yii, o ṣeun si ile-idaraya ati ọna kika xcpretty ti a ṣe sinu, awọn akọọlẹ kikọ ti di pupọ diẹ sii legible. Eyi bẹrẹ lati fi akoko pamọ lori titunṣe awọn apejọ ti o fọ, ati nigba miiran ẹgbẹ idasilẹ le ṣe ero rẹ funrararẹ.

Laanu, awọn wiwọn iyara apejọ xcodebuild и gym A ko ṣe, ṣugbọn a yoo gbẹkẹle iwe naa - to 30% iyara.

Nikan ilana fun gbogbo awọn ohun elo

Odun 2018 ati bayi

Ni ọdun 2018, ilana ti kikọ ati yiyi awọn ohun elo ti o ti gbe patapata si Jenkins, awọn olupilẹṣẹ dẹkun idasilẹ lati awọn ẹrọ wọn, ati pe ẹgbẹ idasilẹ nikan ni ẹtọ lati tu silẹ.

A ti fẹ lati ni ilọsiwaju ifilọlẹ awọn idanwo ati itupalẹ aimi, ati pe awọn iwe afọwọkọ wa dagba ati dagba. Grew ati yipada pẹlu awọn ohun elo wa. Ni akoko yẹn o wa nipa awọn ohun elo 10. Ti o ba ṣe akiyesi pe a ni awọn iru ẹrọ meji, ti o jẹ nipa awọn iwe afọwọkọ 20 "alãye".

Ni gbogbo igba ti a fẹ lati ṣafikun igbesẹ tuntun si iwe afọwọkọ, a ni lati daakọ-lẹẹmọ awọn ege sinu gbogbo awọn iwe afọwọkọ ikarahun naa. Boya a le ti ṣiṣẹ diẹ sii ni iṣọra, ṣugbọn nigbagbogbo iru awọn iyipada ti pari ni typos, eyiti o yipada si awọn irọlẹ fun ẹgbẹ itusilẹ lati ṣatunṣe awọn iwe afọwọkọ ati rii iru eniyan ọlọgbọn ti ṣafikun aṣẹ yii ati kini o ṣe. Ni gbogbogbo, a ko le sọ pe awọn iwe afọwọkọ fun apejọ fun pẹpẹ kan ni o kere ju bii. Biotilejepe wọn esan ṣe ohun kanna.

Lati le bẹrẹ ilana kan fun ohun elo tuntun, o jẹ dandan lati lo ọjọ kan lati yan ẹya “tuntun” ti awọn iwe afọwọkọ wọnyi, ṣatunṣe rẹ ki o sọ pe “bẹẹni, o ṣiṣẹ.”

Ni akoko ooru ti ọdun 2018, a tun wo si ọna fastlane ti o tun dagbasoke.

Iṣẹ #1: ṣe akopọ gbogbo awọn igbesẹ iwe afọwọkọ ki o tun kọ wọn sinu Fastfile

Nigba ti a bẹrẹ, awọn iwe afọwọkọ wa dabi aṣọ-ẹsẹ ti o ni gbogbo awọn igbesẹ ati awọn crutches ninu iwe afọwọkọ ikarahun kan ni Jenkins. A ko tii yipada si opo gigun ti epo ati pipin nipasẹ ipele.

A wo ohun ti a ni ati ṣe idanimọ awọn igbesẹ mẹrin ti o baamu apejuwe ti CI/CD wa:

  • kọ - fifi sori ẹrọ awọn igbẹkẹle, apejọ ile-ipamọ,
  • idanwo - ṣiṣiṣẹ awọn idanwo ẹgbẹ olupilẹṣẹ, iṣiro agbegbe,
  • sonar - ṣe ifilọlẹ gbogbo awọn linters ati firanṣẹ awọn ijabọ si SonarQube,
  • deploy — fifiranṣẹ ohun artifact to alpha (TestFlight).

Ati pe ti o ko ba lọ sinu awọn alaye, yiyọ awọn bọtini ti a lo ninu awọn iṣe, iwọ yoo gba Fastfile yii:

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

Ni otitọ, Fastfile akọkọ wa ti jade lati jẹ ohun ibanilẹru, ni imọran diẹ ninu awọn crutches ti a tun nilo ati nọmba awọn aye ti a rọpo:

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

Ninu apẹẹrẹ ti o wa loke, apakan nikan ti awọn aye ti a nilo lati ṣalaye: iwọnyi ni awọn ipilẹ-itumọ - ero, iṣeto ni, awọn orukọ Profaili Ipese, ati awọn aye pinpin - ID Apple ti akọọlẹ idagbasoke, ọrọ igbaniwọle, ID ohun elo, ati bẹbẹ lọ lori. Gẹgẹbi isunmọ akọkọ, a fi gbogbo awọn bọtini wọnyi sinu awọn faili pataki - Gymfile, Matchfile и Appfile.

Ni bayi ni Jenkins o le pe awọn pipaṣẹ kukuru ti ko ṣe blur wiwo ati ni irọrun kika nipasẹ oju:

# fastlane ios <lane_name>

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

Hurray, a jẹ nla

Kini o gba? Ko awọn aṣẹ kuro fun gbogbo igbesẹ. Awọn iwe afọwọkọ ti a ti sọ di mimọ, ti ṣeto daradara ni awọn faili fastlane. Ni ayọ, a sare lọ si awọn olupilẹṣẹ n beere lọwọ wọn lati ṣafikun ohun gbogbo ti wọn nilo si awọn ibi ipamọ wọn.

Ṣugbọn a ṣe akiyesi ni akoko pe a yoo pade awọn iṣoro kanna - a yoo tun ni awọn iwe afọwọkọ apejọ 20 ti yoo jẹ ọna kan tabi omiran bẹrẹ lati gbe igbesi aye ti ara wọn, yoo nira sii lati ṣatunkọ wọn, nitori awọn iwe afọwọkọ yoo lọ si awọn ibi ipamọ, ati pe a ko ni iwọle si nibẹ. Ati, ni gbogbogbo, kii yoo ṣee ṣe lati yanju irora wa ni ọna yii.

Iriri CICD Alagbeka: boṣewa fastlane kan fun ọpọlọpọ awọn ohun elo alagbeka

Iṣẹ #2: gba Fastfile ẹyọkan fun awọn ohun elo N

Bayi o dabi pe ipinnu iṣoro naa ko nira - ṣeto awọn oniyipada, ki a lọ. Bẹẹni, ni otitọ, iyẹn ni bi a ti yanju iṣoro naa. Ṣugbọn ni akoko ti a ba gbe e soke, a ko ni oye ninu fastlane funrararẹ, tabi ni Ruby, ninu eyiti a ti kọ fastlane, tabi awọn apẹẹrẹ ti o wulo lori nẹtiwọọki - gbogbo eniyan ti o kọ nipa fastlane lẹhinna ni opin si apẹẹrẹ fun ohun elo kan fun ọkan Olùgbéejáde.

Fastlane le mu awọn oniyipada ayika ṣiṣẹ, ati pe a ti gbiyanju eyi tẹlẹ nipa tito ọrọ igbaniwọle Keychain:

ENV['KEYCHAIN_PASSWORD']

Lẹhin wiwo awọn iwe afọwọkọ wa, a ṣe idanimọ awọn apakan ti o wọpọ:

#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

Bayi, lati bẹrẹ lilo awọn bọtini wọnyi ni awọn faili fastlane, a ni lati ṣawari bi a ṣe le fi wọn ranṣẹ sibẹ. Fastlane ni ojutu kan fun eyi: ikojọpọ oniyipada nipasẹ dotenv. Iwe naa sọ pe ti o ba ṣe pataki fun ọ lati gbe awọn bọtini fun awọn idi oriṣiriṣi, ṣẹda awọn faili iṣeto ni ọpọlọpọ ninu itọsọna fastlane .env, .env.default, .env.development.

Ati lẹhinna a pinnu lati lo ile-ikawe yii ni iyatọ diẹ. Jẹ ki a gbe sinu ibi ipamọ awọn olupilẹṣẹ kii ṣe awọn iwe afọwọkọ fastlane ati alaye meta rẹ, ṣugbọn awọn bọtini alailẹgbẹ ti ohun elo yii ninu faili naa .env.appName.

Sami Fastfile, Appfile, Matchfile и Gymfile, a fi pamọ sinu ibi ipamọ ọtọtọ. Faili afikun pẹlu awọn bọtini igbaniwọle lati awọn iṣẹ miiran ti farapamọ nibẹ - .env.
O le wo apẹẹrẹ kan nibi.

Iriri CICD Alagbeka: boṣewa fastlane kan fun ọpọlọpọ awọn ohun elo alagbeka

Lori CI, ipe naa ko yipada pupọ; bọtini iṣeto kan fun ohun elo kan ti ṣafikun:

# 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

Ṣaaju ṣiṣe awọn aṣẹ, a gbe ibi ipamọ wa pẹlu awọn iwe afọwọkọ. Ko dara to bẹ:

git clone [email protected]/FastlaneCICD.git fastlane_temp

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

Fi ojutu yii silẹ fun bayi, botilẹjẹpe Fastlane ni ojutu kan fun igbasilẹ Fastfile nipasẹ igbese import_from_git, ṣugbọn o ṣiṣẹ fun Fastfile nikan, ṣugbọn kii ṣe fun awọn faili miiran. Ti o ba fẹ “lẹwa gaan”, o le kọ tirẹ action.

Eto ti o jọra ni a ṣe fun awọn ohun elo Android ati ReactNative, awọn faili wa ni ibi ipamọ kanna, ṣugbọn ni awọn ẹka oriṣiriṣi. iOS, android и react_native.

Nigbati ẹgbẹ idasilẹ ba fẹ lati ṣafikun diẹ ninu igbesẹ tuntun, awọn ayipada ninu iwe afọwọkọ ti wa ni igbasilẹ nipasẹ MR ni git, ko si iwulo kankan lati wa awọn ẹlẹṣẹ ti awọn iwe afọwọkọ ti o fọ, ati ni gbogbogbo, bayi o ni lati gbiyanju lati fọ.

Bayi iyẹn ni idaniloju

Ni iṣaaju, a lo akoko mimu gbogbo awọn iwe afọwọkọ, mimu wọn dojuiwọn ati ṣatunṣe gbogbo awọn abajade ti awọn imudojuiwọn. O jẹ itiniloju pupọ nigbati awọn idi fun awọn aṣiṣe ati akoko idaduro ni awọn idasilẹ jẹ awọn aṣiṣe ti o rọrun ti o nira pupọ lati tọju abala awọn iwe afọwọkọ ikarahun. Bayi iru awọn aṣiṣe ti dinku si o kere julọ. Awọn iyipada ti wa ni yiyi si gbogbo awọn ohun elo ni ẹẹkan. Ati pe o gba to iṣẹju 15 lati fi ohun elo tuntun sinu ilana naa - ṣeto opo gigun ti epo awoṣe kan lori CI ki o ṣafikun awọn bọtini si ibi ipamọ olupilẹṣẹ.

O dabi pe aaye pẹlu Fastfile fun Android ati ibuwọlu ohun elo ko wa laini alaye; ti nkan naa ba jẹ iyanilenu, Emi yoo kọ ilọsiwaju kan. Inu mi yoo dun lati rii awọn ibeere tabi awọn imọran “bawo ni iwọ yoo ṣe yanju iṣoro yii” ninu awọn asọye tabi lori Telegram bashkirova.

orisun: www.habr.com

Fi ọrọìwòye kun