SlideShare uma empresa Scribd logo
1 de 20
Baixar para ler offline
iOS Build that
SCALES
ME in emojis
tobias hutzler
engineering lead @ otto group
!"#$%&'
AGENDA
▸ Challenges
▸ Requirements
▸ Our Approach
CHALLENGES What we do
CHALLENGES continued
▸ build and ship dev, internal, beta, release
▸ support different environments and versions (Xcode, MacOS, etc.)
▸ signing for diffrent companies
▸ parallel builds
REQUIREMENTS CI Pipeline
▸ all things automated (AMAP)
▸ one git push shipping
▸ stable and flexible
▸ keep it simple
CI/CD techstack
CI/CD pipelines & trigger branches
FASTLANE lanes & steps
BRANCHES FASTLANE LANE STEPS
wildcard default build > test > slack
beta beta build > test > sign (enterprise certificate) >
create release notes > upload to Crashlytics
(customer test group) > slack
internal internal build > test > sign (enterprise certificate) >
create release notes > upload to Crashlytics
(interal test group) > slack
nightly nightly build > test > sign (company certificate) >
slack
release release build > test > sign (company certificate) > itc
upload > slack
FASTLANE test lane
desc "Run Test Suite"
private_lane :test do |options|
test_device = 'iPhone 7'
reset_simulator(test_device)
scan(
clean: true,
scheme: "app",
device: test_device,
configuration: "Debug",
skip_build: true
)
end
FASTLANE upload to crashlytics
desc "upload to crashlytics"
private_lane :crashlytics_upload do |options|
groups = options[:groups] || "mobile_lab_qa"
crashlytics(
groups: groups,
api_token: fabric_api_key,
build_secret: fabric_build_secret,
notes: release_notes
)
upload_symbols_to_crashlytics(api_token: fabric_api_key)
end
FASTLANE beta lane
desc "Build a beta release, upload it to crashlytics and distribute it to all beta testers."
lane :beta do
puts "Hi my name is beta!"
test
update_app_version
install_beta_certificates(readonly: true)
gym(
export_method: "enterprise",
configuration: "Beta",
export_options: { compileBitcode: false },
scheme: "app",
sdk: "iphoneos",
clean: true
)
crashlytics_upload(groups: $crashlytics_beta_groups)
post_to_slack
end
JENKINS PIPELINES Define Steps
pipeline {
stages {
stage('Stage Checkout') {
steps {
deleteDir()
checkout scm
sh 'git submodule update --init'
sh 'git fetch --tags'
}
}
stage ('Stage run Build-Pipeline') {
steps {
echo "Run pipeline"
sh "./build.sh"
}
}
}
}
JENKINS PIPELINES Run on
dedicated Agent
pipeline {
agent { label 'xcode10.2' }
options {
ansiColor('xterm')
}
environment {
SLACK_HOOK_URL = credentials('slack_hook_url')
FABRIC_API_KEY = credentials('vns_fabric_api_key')
FABRIC_BUILD_SECRET = credentials('vns_fabric_build_secret')
ITC_DELIVER = credentials('mobilelab_itc_deliver')
MATCH_PASSWORD = credentials('match_password')
}
stages {
stage('Stage Checkout') {
steps {
deleteDir()
checkout scm
sh 'git submodule update --init'
sh 'git fetch --tags'
}
}
stage ('Stage run Build-Pipeline') {
steps {
echo "Run pipeline"
sh "./build.sh"
}
}
}
}
JENKINS PIPELINES We ❤ nice
output
pipeline {
agent { label 'xcode10.1' }
options {
ansiColor('xterm')
}
environment {
SLACK_HOOK_URL = credentials('slack_hook_url')
FABRIC_API_KEY = credentials('vns_fabric_api_key')
FABRIC_BUILD_SECRET = credentials('vns_fabric_build_secret')
ITC_DELIVER = credentials('mobilelab_itc_deliver')
MATCH_PASSWORD = credentials('match_password')
}
stages {
stage('Stage Checkout') {
steps {
deleteDir()
checkout scm
sh 'git submodule update --init'
sh 'git fetch --tags'
}
}
stage ('Stage run Build-Pipeline') {
steps {
echo "Run pipeline"
sh "./build.sh"
}
}
}
}
JENKINS PIPELINES Secrets
pipeline {
agent { label 'xcode10.1' }
options {
ansiColor('xterm')
}
environment {
SLACK_HOOK_URL = credentials('slack_hook_url')
FABRIC_API_KEY = credentials('vns_fabric_api_key')
FABRIC_BUILD_SECRET = credentials('vns_fabric_build_secret')
ITC_DELIVER = credentials('mobilelab_itc_deliver')
MATCH_PASSWORD = credentials('match_password')
}
stages {
stage('Stage Checkout') {
steps {
deleteDir()
checkout scm
sh 'git submodule update --init'
sh 'git fetch --tags'
}
}
stage ('Stage run Build-Pipeline') {
steps {
echo "Run pipeline"
sh "./build.sh"
}
}
}
}
JENKINS PIPELINES That's all
pipeline {
agent { label 'xcode10.1' }
options {
ansiColor('xterm')
}
environment {
SLACK_HOOK_URL = credentials('slack_hook_url')
FABRIC_API_KEY = credentials('vns_fabric_api_key')
FABRIC_BUILD_SECRET = credentials('vns_fabric_build_secret')
ITC_DELIVER = credentials('mobilelab_itc_deliver')
MATCH_PASSWORD = credentials('match_password')
}
stages {
stage('Stage Checkout') {
steps {
deleteDir()
checkout scm
sh 'git submodule update --init'
sh 'git fetch --tags'
}
}
stage ('Stage run Build-Pipeline') {
steps {
echo "Run pipeline"
sh "./build.sh"
}
}
}
}
BUILD.SH
#!/usr/bin/env bash
PROJECT_DIR=app
# 1. Check if bundle is installed if not install it
BUNDLE_BIN=$(which bundle)
if [ -e $BUNDLE_BIN ]; then
echo "Bundle installed in $BUNDLE_BIN"
else
echo "Installing Bundler"
gem update
gem install bundler
fi
# 2. Install gem
bundle install
# 3. Change into project folder
cd $PROJECT_DIR
# 4. Run fastlane with bundle
BRANCH=$(git branch | sed -n -e 's/^* (.*)/1/p')
echo "Running on Branch $BRANCH"
bundle exec fastlane select_lane
CI/CD architecture
HAPPY BUILDING
THANK YOUtobias.hutzler@ottogroup.com

Mais conteúdo relacionado

Mais procurados

Cool JVM Tools to Help You Test
Cool JVM Tools to Help You TestCool JVM Tools to Help You Test
Cool JVM Tools to Help You TestSchalk Cronjé
 
Gradle in 45min - JBCN2-16 version
Gradle in 45min - JBCN2-16 versionGradle in 45min - JBCN2-16 version
Gradle in 45min - JBCN2-16 versionSchalk Cronjé
 
Continuos integration for iOS projects
Continuos integration for iOS projectsContinuos integration for iOS projects
Continuos integration for iOS projectsAleksandra Gavrilovska
 
Jazoon12 355 aleksandra_gavrilovska-1
Jazoon12 355 aleksandra_gavrilovska-1Jazoon12 355 aleksandra_gavrilovska-1
Jazoon12 355 aleksandra_gavrilovska-1Netcetera
 
Service Discovery. Spring Cloud Internals
Service Discovery. Spring Cloud InternalsService Discovery. Spring Cloud Internals
Service Discovery. Spring Cloud InternalsAleksandr Tarasov
 
OrientDB - The 2nd generation of (multi-model) NoSQL
OrientDB - The 2nd generation of  (multi-model) NoSQLOrientDB - The 2nd generation of  (multi-model) NoSQL
OrientDB - The 2nd generation of (multi-model) NoSQLRoberto Franchini
 
Defcon_Oracle_The_Making_of_the_2nd_sql_injection_worm
Defcon_Oracle_The_Making_of_the_2nd_sql_injection_wormDefcon_Oracle_The_Making_of_the_2nd_sql_injection_worm
Defcon_Oracle_The_Making_of_the_2nd_sql_injection_wormguest785f78
 
The Screenplay Pattern: Better Interactions for Better Automation
The Screenplay Pattern: Better Interactions for Better AutomationThe Screenplay Pattern: Better Interactions for Better Automation
The Screenplay Pattern: Better Interactions for Better AutomationApplitools
 
Antons Kranga Building Agile Infrastructures
Antons Kranga   Building Agile InfrastructuresAntons Kranga   Building Agile Infrastructures
Antons Kranga Building Agile InfrastructuresAntons Kranga
 
Basic Gradle Plugin Writing
Basic Gradle Plugin WritingBasic Gradle Plugin Writing
Basic Gradle Plugin WritingSchalk Cronjé
 
Philip Shurpik "Architecting React Native app"
Philip Shurpik "Architecting React Native app"Philip Shurpik "Architecting React Native app"
Philip Shurpik "Architecting React Native app"Fwdays
 
Workshop Consul .- Service Discovery & Failure Detection
Workshop Consul .- Service Discovery & Failure DetectionWorkshop Consul .- Service Discovery & Failure Detection
Workshop Consul .- Service Discovery & Failure DetectionVincent Composieux
 
One commit, one release. Continuously delivering a Symfony project.
One commit, one release. Continuously delivering a Symfony project.One commit, one release. Continuously delivering a Symfony project.
One commit, one release. Continuously delivering a Symfony project.Javier López
 
Continous Delivering a PHP application
Continous Delivering a PHP applicationContinous Delivering a PHP application
Continous Delivering a PHP applicationJavier López
 
Android Jetpack + Coroutines: To infinity and beyond
Android Jetpack + Coroutines: To infinity and beyondAndroid Jetpack + Coroutines: To infinity and beyond
Android Jetpack + Coroutines: To infinity and beyondRamon Ribeiro Rabello
 
VCL template abstraction model and automated deployments to Fastly
VCL template abstraction model and automated deployments to FastlyVCL template abstraction model and automated deployments to Fastly
VCL template abstraction model and automated deployments to FastlyFastly
 
Arquillian Constellation
Arquillian ConstellationArquillian Constellation
Arquillian ConstellationAlex Soto
 

Mais procurados (20)

Cool JVM Tools to Help You Test
Cool JVM Tools to Help You TestCool JVM Tools to Help You Test
Cool JVM Tools to Help You Test
 
Gradle in 45min - JBCN2-16 version
Gradle in 45min - JBCN2-16 versionGradle in 45min - JBCN2-16 version
Gradle in 45min - JBCN2-16 version
 
Continuos integration for iOS projects
Continuos integration for iOS projectsContinuos integration for iOS projects
Continuos integration for iOS projects
 
Jazoon12 355 aleksandra_gavrilovska-1
Jazoon12 355 aleksandra_gavrilovska-1Jazoon12 355 aleksandra_gavrilovska-1
Jazoon12 355 aleksandra_gavrilovska-1
 
Testing Ansible
Testing AnsibleTesting Ansible
Testing Ansible
 
Service Discovery. Spring Cloud Internals
Service Discovery. Spring Cloud InternalsService Discovery. Spring Cloud Internals
Service Discovery. Spring Cloud Internals
 
OrientDB - The 2nd generation of (multi-model) NoSQL
OrientDB - The 2nd generation of  (multi-model) NoSQLOrientDB - The 2nd generation of  (multi-model) NoSQL
OrientDB - The 2nd generation of (multi-model) NoSQL
 
Nativescript angular
Nativescript angularNativescript angular
Nativescript angular
 
Defcon_Oracle_The_Making_of_the_2nd_sql_injection_worm
Defcon_Oracle_The_Making_of_the_2nd_sql_injection_wormDefcon_Oracle_The_Making_of_the_2nd_sql_injection_worm
Defcon_Oracle_The_Making_of_the_2nd_sql_injection_worm
 
The Screenplay Pattern: Better Interactions for Better Automation
The Screenplay Pattern: Better Interactions for Better AutomationThe Screenplay Pattern: Better Interactions for Better Automation
The Screenplay Pattern: Better Interactions for Better Automation
 
Antons Kranga Building Agile Infrastructures
Antons Kranga   Building Agile InfrastructuresAntons Kranga   Building Agile Infrastructures
Antons Kranga Building Agile Infrastructures
 
Basic Gradle Plugin Writing
Basic Gradle Plugin WritingBasic Gradle Plugin Writing
Basic Gradle Plugin Writing
 
Philip Shurpik "Architecting React Native app"
Philip Shurpik "Architecting React Native app"Philip Shurpik "Architecting React Native app"
Philip Shurpik "Architecting React Native app"
 
Workshop Consul .- Service Discovery & Failure Detection
Workshop Consul .- Service Discovery & Failure DetectionWorkshop Consul .- Service Discovery & Failure Detection
Workshop Consul .- Service Discovery & Failure Detection
 
One commit, one release. Continuously delivering a Symfony project.
One commit, one release. Continuously delivering a Symfony project.One commit, one release. Continuously delivering a Symfony project.
One commit, one release. Continuously delivering a Symfony project.
 
Continous Delivering a PHP application
Continous Delivering a PHP applicationContinous Delivering a PHP application
Continous Delivering a PHP application
 
Android Jetpack + Coroutines: To infinity and beyond
Android Jetpack + Coroutines: To infinity and beyondAndroid Jetpack + Coroutines: To infinity and beyond
Android Jetpack + Coroutines: To infinity and beyond
 
VCL template abstraction model and automated deployments to Fastly
VCL template abstraction model and automated deployments to FastlyVCL template abstraction model and automated deployments to Fastly
VCL template abstraction model and automated deployments to Fastly
 
Docker In Bank Unrated
Docker In Bank UnratedDocker In Bank Unrated
Docker In Bank Unrated
 
Arquillian Constellation
Arquillian ConstellationArquillian Constellation
Arquillian Constellation
 

Semelhante a iOS build that scales

Continuous Integration With Jenkins Docker SQL Server
Continuous Integration With Jenkins Docker SQL ServerContinuous Integration With Jenkins Docker SQL Server
Continuous Integration With Jenkins Docker SQL ServerChris Adkin
 
Chef Automate Workflow Demo
Chef Automate Workflow DemoChef Automate Workflow Demo
Chef Automate Workflow DemoChef
 
Test your microservices with REST-Assured
Test your microservices with REST-AssuredTest your microservices with REST-Assured
Test your microservices with REST-AssuredMichel Schudel
 
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade ServerlessKatyShimizu
 
[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade ServerlessKatyShimizu
 
Jenkins days workshop pipelines - Eric Long
Jenkins days workshop  pipelines - Eric LongJenkins days workshop  pipelines - Eric Long
Jenkins days workshop pipelines - Eric Longericlongtx
 
Jenkins Days - Workshop - Let's Build a Pipeline - Los Angeles
Jenkins Days - Workshop - Let's Build a Pipeline - Los AngelesJenkins Days - Workshop - Let's Build a Pipeline - Los Angeles
Jenkins Days - Workshop - Let's Build a Pipeline - Los AngelesAndy Pemberton
 
A re introduction to webpack - reactfoo - mumbai
A re introduction to webpack - reactfoo - mumbaiA re introduction to webpack - reactfoo - mumbai
A re introduction to webpack - reactfoo - mumbaiPraveen Puglia
 
Release with confidence
Release with confidenceRelease with confidence
Release with confidenceJohn Congdon
 
Packer, where DevOps begins
Packer, where DevOps beginsPacker, where DevOps begins
Packer, where DevOps beginsJeff Hung
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesLindsay Holmwood
 
(Declarative) Jenkins Pipelines
(Declarative) Jenkins Pipelines(Declarative) Jenkins Pipelines
(Declarative) Jenkins PipelinesSteffen Gebert
 
Automated acceptance test
Automated acceptance testAutomated acceptance test
Automated acceptance testBryan Liu
 
FP - Découverte de Play Framework Scala
FP - Découverte de Play Framework ScalaFP - Découverte de Play Framework Scala
FP - Découverte de Play Framework ScalaKévin Margueritte
 
2008 - TechDays PT: Building Software + Services with Volta
2008 - TechDays PT: Building Software + Services with Volta2008 - TechDays PT: Building Software + Services with Volta
2008 - TechDays PT: Building Software + Services with VoltaDaniel Fisher
 
FrenchKit 2017: Server(less) Swift
FrenchKit 2017: Server(less) SwiftFrenchKit 2017: Server(less) Swift
FrenchKit 2017: Server(less) SwiftChris Bailey
 
Moving from Jenkins 1 to 2 declarative pipeline adventures
Moving from Jenkins 1 to 2 declarative pipeline adventuresMoving from Jenkins 1 to 2 declarative pipeline adventures
Moving from Jenkins 1 to 2 declarative pipeline adventuresFrits Van Der Holst
 

Semelhante a iOS build that scales (20)

Scala at Netflix
Scala at NetflixScala at Netflix
Scala at Netflix
 
Continuous Integration With Jenkins Docker SQL Server
Continuous Integration With Jenkins Docker SQL ServerContinuous Integration With Jenkins Docker SQL Server
Continuous Integration With Jenkins Docker SQL Server
 
Chef Automate Workflow Demo
Chef Automate Workflow DemoChef Automate Workflow Demo
Chef Automate Workflow Demo
 
Test your microservices with REST-Assured
Test your microservices with REST-AssuredTest your microservices with REST-Assured
Test your microservices with REST-Assured
 
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
 
[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless
 
Dev ops meetup
Dev ops meetupDev ops meetup
Dev ops meetup
 
Jenkins days workshop pipelines - Eric Long
Jenkins days workshop  pipelines - Eric LongJenkins days workshop  pipelines - Eric Long
Jenkins days workshop pipelines - Eric Long
 
Jenkins Days - Workshop - Let's Build a Pipeline - Los Angeles
Jenkins Days - Workshop - Let's Build a Pipeline - Los AngelesJenkins Days - Workshop - Let's Build a Pipeline - Los Angeles
Jenkins Days - Workshop - Let's Build a Pipeline - Los Angeles
 
A re introduction to webpack - reactfoo - mumbai
A re introduction to webpack - reactfoo - mumbaiA re introduction to webpack - reactfoo - mumbai
A re introduction to webpack - reactfoo - mumbai
 
Azure from scratch part 4
Azure from scratch part 4Azure from scratch part 4
Azure from scratch part 4
 
Release with confidence
Release with confidenceRelease with confidence
Release with confidence
 
Packer, where DevOps begins
Packer, where DevOps beginsPacker, where DevOps begins
Packer, where DevOps begins
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websites
 
(Declarative) Jenkins Pipelines
(Declarative) Jenkins Pipelines(Declarative) Jenkins Pipelines
(Declarative) Jenkins Pipelines
 
Automated acceptance test
Automated acceptance testAutomated acceptance test
Automated acceptance test
 
FP - Découverte de Play Framework Scala
FP - Découverte de Play Framework ScalaFP - Découverte de Play Framework Scala
FP - Découverte de Play Framework Scala
 
2008 - TechDays PT: Building Software + Services with Volta
2008 - TechDays PT: Building Software + Services with Volta2008 - TechDays PT: Building Software + Services with Volta
2008 - TechDays PT: Building Software + Services with Volta
 
FrenchKit 2017: Server(less) Swift
FrenchKit 2017: Server(less) SwiftFrenchKit 2017: Server(less) Swift
FrenchKit 2017: Server(less) Swift
 
Moving from Jenkins 1 to 2 declarative pipeline adventures
Moving from Jenkins 1 to 2 declarative pipeline adventuresMoving from Jenkins 1 to 2 declarative pipeline adventures
Moving from Jenkins 1 to 2 declarative pipeline adventures
 

Último

Software Coding for software engineering
Software Coding for software engineeringSoftware Coding for software engineering
Software Coding for software engineeringssuserb3a23b
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanyChristoph Pohl
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
Odoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 EnterpriseOdoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 Enterprisepreethippts
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Hr365.us smith
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024StefanoLambiase
 
Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalLionel Briand
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作qr0udbr0
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样umasea
 
Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Mater
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Angel Borroy López
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsAhmed Mohamed
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfkalichargn70th171
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEEVICTOR MAESTRE RAMIREZ
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...confluent
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf31events.com
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odishasmiwainfosol
 

Último (20)

Software Coding for software engineering
Software Coding for software engineeringSoftware Coding for software engineering
Software Coding for software engineering
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
Odoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 EnterpriseOdoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 Enterprise
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
 
Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive Goal
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
 
Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)
 
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort ServiceHot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
 
2.pdf Ejercicios de programación competitiva
2.pdf Ejercicios de programación competitiva2.pdf Ejercicios de programación competitiva
2.pdf Ejercicios de programación competitiva
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML Diagrams
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEE
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
 

iOS build that scales

  • 2. ME in emojis tobias hutzler engineering lead @ otto group !"#$%&'
  • 5. CHALLENGES continued ▸ build and ship dev, internal, beta, release ▸ support different environments and versions (Xcode, MacOS, etc.) ▸ signing for diffrent companies ▸ parallel builds
  • 6. REQUIREMENTS CI Pipeline ▸ all things automated (AMAP) ▸ one git push shipping ▸ stable and flexible ▸ keep it simple
  • 8. CI/CD pipelines & trigger branches
  • 9. FASTLANE lanes & steps BRANCHES FASTLANE LANE STEPS wildcard default build > test > slack beta beta build > test > sign (enterprise certificate) > create release notes > upload to Crashlytics (customer test group) > slack internal internal build > test > sign (enterprise certificate) > create release notes > upload to Crashlytics (interal test group) > slack nightly nightly build > test > sign (company certificate) > slack release release build > test > sign (company certificate) > itc upload > slack
  • 10. FASTLANE test lane desc "Run Test Suite" private_lane :test do |options| test_device = 'iPhone 7' reset_simulator(test_device) scan( clean: true, scheme: "app", device: test_device, configuration: "Debug", skip_build: true ) end
  • 11. FASTLANE upload to crashlytics desc "upload to crashlytics" private_lane :crashlytics_upload do |options| groups = options[:groups] || "mobile_lab_qa" crashlytics( groups: groups, api_token: fabric_api_key, build_secret: fabric_build_secret, notes: release_notes ) upload_symbols_to_crashlytics(api_token: fabric_api_key) end
  • 12. FASTLANE beta lane desc "Build a beta release, upload it to crashlytics and distribute it to all beta testers." lane :beta do puts "Hi my name is beta!" test update_app_version install_beta_certificates(readonly: true) gym( export_method: "enterprise", configuration: "Beta", export_options: { compileBitcode: false }, scheme: "app", sdk: "iphoneos", clean: true ) crashlytics_upload(groups: $crashlytics_beta_groups) post_to_slack end
  • 13. JENKINS PIPELINES Define Steps pipeline { stages { stage('Stage Checkout') { steps { deleteDir() checkout scm sh 'git submodule update --init' sh 'git fetch --tags' } } stage ('Stage run Build-Pipeline') { steps { echo "Run pipeline" sh "./build.sh" } } } }
  • 14. JENKINS PIPELINES Run on dedicated Agent pipeline { agent { label 'xcode10.2' } options { ansiColor('xterm') } environment { SLACK_HOOK_URL = credentials('slack_hook_url') FABRIC_API_KEY = credentials('vns_fabric_api_key') FABRIC_BUILD_SECRET = credentials('vns_fabric_build_secret') ITC_DELIVER = credentials('mobilelab_itc_deliver') MATCH_PASSWORD = credentials('match_password') } stages { stage('Stage Checkout') { steps { deleteDir() checkout scm sh 'git submodule update --init' sh 'git fetch --tags' } } stage ('Stage run Build-Pipeline') { steps { echo "Run pipeline" sh "./build.sh" } } } }
  • 15. JENKINS PIPELINES We ❤ nice output pipeline { agent { label 'xcode10.1' } options { ansiColor('xterm') } environment { SLACK_HOOK_URL = credentials('slack_hook_url') FABRIC_API_KEY = credentials('vns_fabric_api_key') FABRIC_BUILD_SECRET = credentials('vns_fabric_build_secret') ITC_DELIVER = credentials('mobilelab_itc_deliver') MATCH_PASSWORD = credentials('match_password') } stages { stage('Stage Checkout') { steps { deleteDir() checkout scm sh 'git submodule update --init' sh 'git fetch --tags' } } stage ('Stage run Build-Pipeline') { steps { echo "Run pipeline" sh "./build.sh" } } } }
  • 16. JENKINS PIPELINES Secrets pipeline { agent { label 'xcode10.1' } options { ansiColor('xterm') } environment { SLACK_HOOK_URL = credentials('slack_hook_url') FABRIC_API_KEY = credentials('vns_fabric_api_key') FABRIC_BUILD_SECRET = credentials('vns_fabric_build_secret') ITC_DELIVER = credentials('mobilelab_itc_deliver') MATCH_PASSWORD = credentials('match_password') } stages { stage('Stage Checkout') { steps { deleteDir() checkout scm sh 'git submodule update --init' sh 'git fetch --tags' } } stage ('Stage run Build-Pipeline') { steps { echo "Run pipeline" sh "./build.sh" } } } }
  • 17. JENKINS PIPELINES That's all pipeline { agent { label 'xcode10.1' } options { ansiColor('xterm') } environment { SLACK_HOOK_URL = credentials('slack_hook_url') FABRIC_API_KEY = credentials('vns_fabric_api_key') FABRIC_BUILD_SECRET = credentials('vns_fabric_build_secret') ITC_DELIVER = credentials('mobilelab_itc_deliver') MATCH_PASSWORD = credentials('match_password') } stages { stage('Stage Checkout') { steps { deleteDir() checkout scm sh 'git submodule update --init' sh 'git fetch --tags' } } stage ('Stage run Build-Pipeline') { steps { echo "Run pipeline" sh "./build.sh" } } } }
  • 18. BUILD.SH #!/usr/bin/env bash PROJECT_DIR=app # 1. Check if bundle is installed if not install it BUNDLE_BIN=$(which bundle) if [ -e $BUNDLE_BIN ]; then echo "Bundle installed in $BUNDLE_BIN" else echo "Installing Bundler" gem update gem install bundler fi # 2. Install gem bundle install # 3. Change into project folder cd $PROJECT_DIR # 4. Run fastlane with bundle BRANCH=$(git branch | sed -n -e 's/^* (.*)/1/p') echo "Running on Branch $BRANCH" bundle exec fastlane select_lane