SlideShare une entreprise Scribd logo
1  sur  20
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

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
 

Tendances (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
 

Similaire à 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] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade ServerlessKatyShimizu
 
[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
 
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
 

Similaire à 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] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] 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] Functions 2.0: 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
 

Dernier

WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplatePresentation.STUDIO
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park masabamasaba
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdfPearlKirahMaeRagusta1
 
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfonteinmasabamasaba
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Bert Jan Schrijver
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...Jittipong Loespradit
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...Shane Coughlan
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfkalichargn70th171
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareJim McKeeth
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...masabamasaba
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...panagenda
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrainmasabamasaba
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnAmarnathKambale
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesVictorSzoltysek
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...Health
 

Dernier (20)

WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 

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