Mobile CICD usus: unum fastlane vexillum pro multis applicationibus mobilibus

Mobile CICD usus: unum fastlane vexillum pro multis applicationibus mobilibus
Libet loqui de continua integratione et traditione pro applis mobilibus utendo fastlane. Quomodo CI/CD in omnibus applicationibus mobilibus deducendi sumus, quomodo ibi venimus et quid in fine factum est.

Iam satis materiae est in retiaculis in instrumento, quod initio tam deerat, ut non singillatim instrumentum describam, sed solum ad id quod tunc habuimus referemus;

Articulus constat duabus partibus;

  • Background ad cessum mobilis CI/CD in comitatu
  • Technical solution for volubilem CI/CD pro N-applicationibus

Prima pars priscis magis peractorum est, secunda est experientia quam tibi adhibere potes.

Ita historice factum est

anno 2015

Modo nos applicationes mobiles evolvere coepimus, tum nihil de integra integratione continua, de DevOpis et aliis rebus modum novimus. Quisque eget ipsum elit, eget scelerisque ex. Et si Android satis simplex convenerunt, signatum est .apk et eam ad Google Developer Console imposuisti, tunc pro iOS instrumenti distributionis per Xcode cum magnis vesperis nobis reliquit - conatus ad archivum saepe in erroribus deponi et iterum tentare debebamus. Contigit elit antecedens non pluries in mense codicem scribere, sed applicationem emittere.

anno 2016

Creverant, iam cogitabamus quomodo tincidunt liberaret a toto die ad remissionem, et altera applicatio etiam apparuit, quae solum nos magis ad automationem impulit. Eodem anno Jenkins primum instituimus et fasciculum scriptorum FORMIDULOSUS scripsimus, simillimum illis quae fastlane in suis documentis ostendit.

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

Infeliciter, usque nunc tantum tincidunt nostri sciverunt quomodo haec scripta operantur et quare hic perennis clavium acervus necessarius est, et cum aliquid iterum rupit, "vesperes splendidis" pro analysione tigna tulerunt.

anno 2017

Hoc anno comperimus fastlane rem esse talem. Nulla erat tanta notitia quanta nunc est - quam ut unus ordiri possit, quomodo uti. Ipsum instrumentum tunc adhuc rudis erat: constantes errores tantum nos fefellerunt et difficile erat credere in magicis automationibus quam promiserunt.

Sed praecipuae utilitates in core fastlane comprehensae sunt gym ΠΈ pilotcuravimus proficisci.

Scripta nostra paulo emendatis sunt.

$ fastlane gym  β€”-workspace "Example.xcworkspace" 
                --scheme "AppName" 
                β€”-buildlog_path "/tmp" 
                -β€”clean

Emendatae sunt, si modo quia non omnes parametri sunt xcodebuild, Indicare debes - gym libere intelliget ubi et quid sit. Et ad subtiliorem indaginem, claves easdem specificare potes ac in xcodebuildsolum nomen clavium clarius est.

Hoc tempore, propter gym et formatorem constructum in xcpretty, ligna aedificanda multo magis legibilia facta sunt. Hoc tempus servare coepit in comitiis fractis figendi, et interdum emissio quadrigis suis propriis poterat videri.

Infeliciter, ecclesia celeritate mensuras xcodebuild ΠΈ gym Hoc non fecimus, sed documenta speramus - usque ad 30% velocitatem.

Unius processus pro omnibus applicationibus

Anno MMXVIII et praesenti

Per 2018, processus aedificationis et applicationes evolutae Jenkins perfecte motae sunt, tincidunt e machinis dimittendis cessaverunt, et solum quadrigis emissio ius solvendi habuit.

Iam voluimus emendare missionem testium et analysis statice, et scripta nostra creverunt et creverunt. Creverunt et mutaverunt cum applicationibus nostris. Illo tempore erant circiter 10 applicationes. Considerans quod duo tabulata habemus, quod est de 20 scriptis "vivis".

Quotiescumque novum gradum scriptionis addere voluimus, fragmenta crustulum in omnem testam scriptam habuimus. Fortassis diligentius laborasse potuimus, sed saepe tales mutationes in typos finitae sunt, quae in vesperas versae sunt ut turmae emissio figere scripta et cognosceret quis dolor guy hoc mandatum addidit et quid actu facit. In universum dici non potest scripta conventus pro uno suggestu fuisse saltem aliquid simile. Etsi certe idem fecerunt.

Ut processum novam applicationis inire, necesse fuit diem desumere ut versionem "novam" harum scriptorum legeret, eam debug et dicere "ita operatur."

Aestate MMXVIII, iterum spectavimus ad fastlane adhuc progredientem.

Negotium # I: Summatim omnes scriptor gradus et rescribe in Fastfile

Cum coepimus, scripta nostra vidi quasi pannum ex omnibus gradibus et fusum in una scriptura Jenkins in testa. Nondum switched ad fistulam et divisionem per scenam nondum habemus.

Inspeximus ea quae habemus et identificantur 4 gradus qui descriptioni nostrae CI/CD aptant:

  • construere - installare clientelas, archivum convocare;
  • test - elit cursus unitatis probat, calculandum coverage;
  • sonar - linters omnes immittit et nuntios mittit ad SonarQube;
  • explicandam - mittens artificium ad alpha (TestFlight).

Et si in details non ingredieris, omissis clavibus in actionibus adhibitis, hoc fastigium habebis:

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

Re quidem vera, primum Fastfile nostrum evasit monstrum, considerans aliquot fusculas adhuc necessarias et parametris quos substituimus;

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

In specimine supra, tantum partem parametri designare oportet: hi sunt parametri - schema, figuratio, nominum provisio provisio, necnon parametri distributio - Apple ID rationi elit, tesserae, applicationis ID, et sic reliqua. Ad primam approximationem, has omnes claves in specialibus fasciculis ponemus. Gymfile, Matchfile ΠΈ Appfile.

Nunc in Jenkins dicere potes brevia mandata quae visum non suffundunt et oculo facile lecta sunt;

# fastlane ios <lane_name>

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

Eia, sumus magni

Quid habuistis? Patet per singulos gradus imperata. Scripta purganda, in scriniis fastlane eleganter dispositis. Laeti venimus ad tincidunt rogantes ut omnia quae necessaria erant ad repositoria adderet.

At nos intelleximus in tempore easdem difficultates occurrere - volumus tamen 20 scripta frequentia, quae aliter vel aliter vitam suam incipiunt vivere, difficilius esset eas recensere, cum scripta repositoria moverent; nec accessum habemus ibi. Et generaliter hoc modo dolorem nostrum solvere non poterit.

Mobile CICD usus: unum fastlane vexillum pro multis applicationibus mobilibus

Negotium # II: ut unum Fastfile ad N applicationes

Nunc videtur quod problema solvendum non ita difficile sit - variabiles ponemus, et abeamus. Ita re vera id est quomodo problema solvitur. Sed in momento, quo hoc advenivimus, neque in ipsa fastlane peritiam habuimus, neque in Ruby, in quo fastlane scriptum est, neque in retiaculis utilia exempla - omnes qui de fastlane scripserunt tunc ad exemplum unius applicationis limitatum est. quis elit.

Fastlane variabiles ambitus tractari possunt, et id iam probavimus ponendo tesseram Keychain:

ENV['KEYCHAIN_PASSWORD']

Postquam scripta nostra inspeximus, partes communes notavimus;

#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

Nunc, ut his clauibus in fasciculis fastlaneis incipiamus, debebamus instare quomodo eas ibi traderemus. Fastlane huius solutionem habet: loading variabilium per dotenv. Documenta dicit, si magni momenti est tibi claves ad diversos usus onerare, plures tabellas conformationis crea in directorio fastlane. .env, .env.default, .env.development.

Et deinde hac bibliotheca paulo aliter uti decrevimus. In repositorium tincidunt non scriptorum fastlanum eiusque meta notitia, sed singulares claves huius applicationis in tabella locamus. .env.appName.

sibi Fastfile, Appfile, Matchfile ΠΈ Gymfilein reposito separato abscondimus. Additamentum fasciculi cum clavibus clavibus ex aliis officiis ibi latebat - .env.
Potes videre exemplum hic.

Mobile CICD usus: unum fastlane vexillum pro multis applicationibus mobilibus

In CI, vocatio non multum mutatur, clavis configurationis pro applicatione specifica addita est:

# 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

Priusquam mandata curramus, repositorium cum scriptis oneramus. Non tam delicatus:

git clone [email protected]/FastlaneCICD.git fastlane_temp

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

Hanc solutionem nunc reliquit, quamvis Fastlane solutionem habeat per Fastfile deprimendi actionis import_from_git, sed tantum pro Fastfile laborat, sed non pro aliis fasciculis. Si vis "vere pulchra", scribere potes tuum action.

Similis copia applicationum Android et ReactNative facta est, lima in reposito in eodem, sed in ramis diversis. iOS, android ΠΈ react_native.

Cum turmae emissio novum gradum addere vult, mutationes in scripto scriptae per MR in git, iam non opus est reos scriptorum fractorum quaerere, et in genere, nunc illud frangere conari debes.

Nunc id est pro certo

Antea tempus omnia scriptorum conservavimus, ea adaequare et omnia consectaria renovationis destinare. Valde frustretur cum rationes errorum et temporis in emissione typos simplices erant qui tam difficile erat ut in turbatione scriptorum testarum vestigia retinerent. Reducuntur autem huiusmodi errores ad minimum. Mutationes ad omnes applicationes simul evolvuntur. Et habet 15 minuta ut novam applicationem in processu ponas pipeline templates in CI et claves addere repositorium elit.

Videtur quod punctum cum Fastfile pro Android et applicatione subscriptio inexplicabilis maneret, si articulus est interesting, continuationem scribam. Laetus sum videre interrogationes tuas vel suggestiones "quam vis hanc quaestionem solvere" in commentaria vel in Telegram bashkirova.

Source: www.habr.com