SlideShare une entreprise Scribd logo
1  sur  83
Déploiement automatique
d'app iOS et/ou Android
Cedric Gatay / Florian Chauveau
#DevFestToulouse
@Cedric_Gatay
Code-Troopers
iOS
@FlorianChauveau
Code-Troopers
Android
Pourquoi ?
#DevFestToulouse
Développeurs Java
Habitude du one-click deploy
Multiples outils
#DevFestToulouse
Développement mobile
IHM
Lenteur
#DevFestToulouse
Développement mobile
IHM
Lenteur
#DevFestToulouse
Objectifs
#DevFestToulouse
Objectifs
#DevFestToulouse
Objectifs
Déploiement via Jenkins
● Fiable
● Rapide
● Automatique
● Revenir dans un environnement de ‘confort’ et de facilité de livraison
=> on gagne de la confiance dans les release
Comment faire
traditionnellement ?
#DevFestToulouse
Étapes iOS
Checkout du projet
Configuration du compte dev
Récupération des certificats
Build / Archive
iTunes Connect
Screenshot / Submit
Gestion des beta testeur
Branchement Crashlytics
Commit de la nouvelle version
Création de l'app dans iTunes Connect
#DevFestToulouse
Étapes Android
Checkout du projet
Récupération du sdk dans la bonne version
Configuration du compte dev
Création du keystore
Configuration de la signature dans le build
Build / Archive
Google Play store
Screenshot / Submit
Gestion des beta testeur
Branchement Crashlytics
Commit de la nouvelle version
Création de l'app dans Google Play
Ajout du changelog
#DevFestToulouse
#DevFestToulouse
Oups, j'ai
changé de machine
aquaponey
baby-foot
pas le temps
#DevFestToulouse
Outils disponibles
https://xkcd.com/1629/
#DevFestToulouse
Phase 1 : Build
#DevFestToulouse
Android
Android Studio
#DevFestToulouse
Android
Android Studio
#DevFestToulouse
Android
Android Studio
#DevFestToulouse
Android
Android Studio
#DevFestToulouse
Android
Android Studio
Gradle
$ ./gradlew tasks
#DevFestToulouse
Android
Android Studio
Gradle
#DevFestToulouse
Android
Android Studio
Gradle
android {
signingConfigs {
release {
storeFile file("keystore.jks")
storePassword "xxxxxxxxxx"
keyAlias "release"
keyPassword "xxxxxxxxx"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
#DevFestToulouse
Android
Android Studio
Gradle
Jenkins via Gradle script
#DevFestToulouse
iOS
XCode
#DevFestToulouse
iOS
XCode
CLI avec xcodebuild
#DevFestToulouse
iOS
XCode
CLI avec xcodebuild
Plugin Jenkins XCode
#DevFestToulouse
Phase 2 : Publication
#DevFestToulouse
Android
IHM PlayStore
#DevFestToulouse
Android
IHM PlayStore
API Google
● Plugin gradle
● Tache npm
● Script Python
#DevFestToulouse
Android
IHM PlayStore
API Google
fastlane
#DevFestToulouse
iOS
Connexion au compte iTunes Connect
Upload de l’IPA par Application Loader
● GUI
● CLI /Applications/Xcode.app/Contents/Applications/Application
Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Suppo
rt/altool
fastlane
#DevFestToulouse
#DevFestToulouse
fastlane
Ruby
Felix Krause @KrauseFx
Fabric puis Twitter puis Google
Regroupe un ensemble d'outils
#DevFestToulouse
Mise en place
#DevFestToulouse
Installation
$ sudo apt-get install rubygems
$ sudo gem install fastlane
#DevFestToulouse
iOS
$ fastlane init
$ fastlane ios test
$ fastlane ios beta
$ fastlane ios release
#DevFestToulouse
iOS
$ fastlane init
$ fastlane ios test
$ fastlane ios beta
$ fastlane ios release
fastlane
├── Appfile
├── Deliverfile
├── Fastfile
├── README.md
├── metadata
├── report.xml
└── screenshots
#DevFestToulouse
Android
$ fastlane init
$ fastlane android test
$ fastlane android beta
$ fastlane android deploy
fastlane
├── metadata
├── Appfile
├── Fastfile
├── README.md
└── report.xml
#DevFestToulouse
Android
Création d’un Google service account
(uniquement par le propriétaire du compte)
Téléchargement d’une clé .json
Configuration des droits sur l’app souhaitée
#DevFestToulouse
fastlane - iOS
Initialisation de l’app lane :produce do
produce(
username: 'user@company.com',
app_identifier: 'com.company.app',
app_name: 'App1',
language: 'Occitan',
app_version: '1.0',
sku: '123')
end
#DevFestToulouse
fastlane - iOS
Initialisation de l’app
Cibles pour lancer les Tests
lane :test do
scan(
scheme: "DevFestTlse"
workspace: "DevFestTlse.xcworkspace",
devices: ["iPhone X", "iPad Air"]
)
end
#DevFestToulouse
fastlane - iOS
Initialisation de l’app
Cibles pour lancer les Tests
Déployer en préprod
lane :alpha do
match(type: "appstore")
gym(scheme: "DevFestTlse")
pilot
increment_build_number
commit_version_bump
push_to_git_remote
end
#DevFestToulouse
fastlane - iOS
Initialisation de l’app
Cibles pour lancer les Tests
Déployer en préprod
Publier en production
lane :appstore do
deliver(
skip_deploy: false
)
end
#DevFestToulouse
fastlane - Android
Initialisation de l’app (Appfile) json_key_file "publishAccount.json"
package_name "fr.demo.devfesttoulouse2017"
#DevFestToulouse
fastlane - Android
Initialisation de l’app (Appfile)
Cibles pour lancer les Tests
desc "Runs all the tests"
lane :test do
gradle(task: "test")
end
#DevFestToulouse
fastlane - Android
Initialisation de l’app (Appfile)
Cibles pour lancer les Tests
Déployer en préprod
desc "Submit a new Beta to Crashlytics Beta"
lane :beta do
gradle(task: "assembleRelease")
crashlytics
end
#DevFestToulouse
fastlane - Android
Initialisation de l’app (Appfile)
Cibles pour lancer les Tests
Déployer en préprod
Publier en production
desc "Deploy a new version to the Google Play"
lane :deploy do
gradle(task: "assembleRelease")
supply
end
#DevFestToulouse
fastlane - Android
#DevFestToulouse
Utilisation au quotidien
#DevFestToulouse
iOS
$ fastlane match --readonly
⌘ + R dans XCode
#DevFestToulouse
Android
⇧+ F10
#DevFestToulouse
Intégration continue
#DevFestToulouse
En pratique
Jenkins
● Android (Docker)
● Android OpenDeviceLab
● OSX
#DevFestToulouse
En pratique
Jenkins
● Android (Docker)
● Android OpenDeviceLab
● OSX
def acceptSDKLicense(){
//replace with real license hash
env.LICENSE = "n8933[...]9c55"
sh 'mkdir "$ANDROID_HOME/licenses" || true'
sh 'echo -e $LICENSE > 
"$ANDROID_HOME/licenses/android-sdk-license"'
sh 'echo -e $LICENSE > 
"$ANDROID_HOME/licenses/android-sdk-preview-license"'
}
#DevFestToulouse
En pratique
Jenkins
● Android Docker
● Android OpenDeviceLab
● OSX
#DevFestToulouse
En pratique
Jenkins
● Android Docker
● Android OpenDeviceLab
● OSX
#DevFestToulouse
En pratique
#DevFestToulouse
Jenkinsfile
if (env.BRANCH_NAME == 'alpha'){
sh 'fastlane alpha'
}else if (env.BRANCH_NAME == 'beta'){
sh 'fastlane alphaToBeta'
}else{
sh 'fastlane build'
junit '**/test_output/*.junit'
}
#DevFestToulouse
Passage en alpha
● fastlane alpha
lane :alpha do
gradle(task: "assembleRelease")
supply(
track: 'alpha',
apk: '../app-release.apk'
)
end
lane :alpha do
match(type: "appstore")
gym(scheme: "Example")
pilot
increment_build_number
commit_version_bump(
message: "Bump version"
)
push_to_git_remote(
local_branch: git_branch
)
end
#DevFestToulouse
Passage en beta
● fastlane alphaToBeta
desc "Move from alpha to beta"
lane :alphaToBeta do
supply(
track: "alpha",
track_promote_to: "beta",
skip_upload_apk: true
)
end
desc "Move from alpha to beta"
lane :alphaToBeta do
pilot(
distribute_external: true,
changelog: "Nouvelle beta",
groups: "Beta testeurs"
)
end
#DevFestToulouse
Passage en Prod
● fastlane alphaToBeta
desc "Move from beta to Production"
lane :betaToProd do
supply(
track: "beta",
track_promote_to: "production",
skip_upload_apk: true
)
end
desc "Deploys to the App Store"
lane :deploy do
deliver(
force: true,
submit_for_review: true,
automatic_release: false
)
end
#DevFestToulouse
Configuration avancée
#DevFestToulouse
Android
Gestion du versionCode
lane :deploy do
increment_version_code
commit_android_version_bump
…
end
#DevFestToulouse
Android
Gestion du versionCode
Upload vers Crashlytics / Hockey lane :deploy do
crashlytics(
api_token: '[insert_key]',
build_secret: '[insert_secret]'
)
end
#DevFestToulouse
Android
Gestion du versionCode
Upload vers Crashlytics / Hockey
Versionning de la fiche du store
$ fastlane supply init
#DevFestToulouse
Android
Gestion du versionCode
Upload vers Crashlytics / Hockey
Versionning de la fiche du store
● Descriptions
└── fastlane
└── metadata
└── android
├── fr-FR
│ ├── full_description.txt
│ ├── short_description.txt
│ ├── title.txt
│ └── video.txt
└── en-US
#DevFestToulouse
Android
Gestion du versionCode
Upload vers Crashlytics / Hockey
Versionning de la fiche du store
● Descriptions
● Screenshots
└── fastlane
└── metadata
└── android
├── fr-FR
│ └── images
│ └── phoneScreenshots
│ └── sevenInchScreenshots
│ └── tenInchScreenshots
│ └── tvScreenshots
└── en-US
#DevFestToulouse
Android
Gestion du versionCode
Upload vers Crashlytics / Hockey
Versionning de la fiche du store
● Descriptions
● Screenshots
● What’s new
└── fastlane
└── metadata
└── android
├── fr-FR
│ └── changelogs
│ ├── 10.txt
│ └── 12.txt
└── en-US
└── changelogs
└── 12.txt
#DevFestToulouse
Gestion du versionCode
Upload vers Crashlytics / Hockey
Versionning de la fiche du store
● Descriptions
● Screenshots
● What’s new
Android
desc "Update store description"
lane :updateStoreDescription do
supply(
skip_upload_apk: true
)
end
#DevFestToulouse
iOS
Gestion du versionCode
Upload vers Crashlytics / Hockey
Versionning de la fiche du store
● Descriptions
● Screenshots
● What’s new
Génération d’une page de boarding automatique pour Testflight
http://url.c-t.io/1
http://url.c-t.io/2
#DevFestToulouse
fastlane
MEH...
#DevFestToulouse
Utilisation d'un dépôt git chiffré
Manipule les certificats sur developer.apple.com
Permet d’éviter le “revoke”
fastlane
#DevFestToulouse
Gestion des certificats centralisée
Plus besoin de donner accès à tous
Seule la CI peut avoir un accès R/W
fastlane
#DevFestToulouse
Lance les tests sur x devices dans y locale
Piloté depuis les tests UI
$ fastlane snapshot init
fastlane
let app = XCUIApplication()
setupSnapshot(app)
app.launch()
snapshot("01HomeScreen")
#DevFestToulouse
Génère des visuels
● device frame
● marketing
fastlane
lane :screenshots do
snapshot
frameit(white: true, path:
'./fastlane/screenshots')
end
#DevFestToulouse
fastlane
Intégration avec Slack
Auto-bump version et commit
Installation automatique des cocoapods
Gestion des certificats de push (APNS)
Shell scripts / Plugins
#DevFestToulouse
Exemple
Beaucoup d’exemples dans le repo fastlane/examples
● Fabric
● Firefox
● Soundcloud
● Wikipedia
● ProductHunt
#DevFestToulouse
Conclusion
#DevFestToulouse
En pratique
Toolchain de deploy identique
● tout le monde peut livrer en 1 clic
● rapports de tests classiques
● Jenkins Multibranch Pipeline
#DevFestToulouse
En pratique
Toolchain de deploy identique
● tout le monde peut livrer en 1 clic
● rapports de tests classiques
● Jenkins Multibranch Pipeline
#DevFestToulouse
Points de vigilance
fastlane est très (trop) régulièrement mis à jour
Reverse engineering de l’API iTunes connect
Un contributeur principal (SPOF)
#DevFestToulouse
Merci !
https://url.c-t.io/1
https://url.c-t.io/2

Contenu connexe

Tendances

Spring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrineSpring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrineSyrine Ben aziza
 
JCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueJCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueRossi Oddet
 
BlaBlaCar - Going Native !
BlaBlaCar - Going Native ! BlaBlaCar - Going Native !
BlaBlaCar - Going Native ! Erwann Robin
 
Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017Julien Dubois
 
Concept de l’Intégration Continue
Concept de l’Intégration ContinueConcept de l’Intégration Continue
Concept de l’Intégration ContinueFrédéric Sagez
 
Selenium WebDriver avec Java
Selenium WebDriver avec Java Selenium WebDriver avec Java
Selenium WebDriver avec Java Ahmed HARRAK
 
20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache MavenArnaud Héritier
 
Intégration continue transco
Intégration continue transcoIntégration continue transco
Intégration continue transcolaurent_opnworks
 
IP Multimedia Subsystem : Démarrer avec Mobicents JainSLEE (Partie 1)
IP Multimedia Subsystem : Démarrer avec Mobicents JainSLEE (Partie 1)IP Multimedia Subsystem : Démarrer avec Mobicents JainSLEE (Partie 1)
IP Multimedia Subsystem : Démarrer avec Mobicents JainSLEE (Partie 1)Kokou Gaglo
 
Hermes, génération et déploiement d'ipa by Peter Meuel
Hermes, génération et déploiement d'ipa by Peter MeuelHermes, génération et déploiement d'ipa by Peter Meuel
Hermes, génération et déploiement d'ipa by Peter MeuelCocoaHeads France
 
In01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introductionIn01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introductionYann Caron
 

Tendances (19)

1 tours horizon
1 tours horizon1 tours horizon
1 tours horizon
 
Tutorial android
Tutorial androidTutorial android
Tutorial android
 
Spring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrineSpring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrine
 
Jenkins Workflow
Jenkins WorkflowJenkins Workflow
Jenkins Workflow
 
JCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueJCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratique
 
Android studio 2.0
Android studio 2.0Android studio 2.0
Android studio 2.0
 
BlaBlaCar - Going Native !
BlaBlaCar - Going Native ! BlaBlaCar - Going Native !
BlaBlaCar - Going Native !
 
Sonar-Hodson-Maven
Sonar-Hodson-MavenSonar-Hodson-Maven
Sonar-Hodson-Maven
 
Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017
 
Usine logicielle ios
Usine logicielle iosUsine logicielle ios
Usine logicielle ios
 
Concept de l’Intégration Continue
Concept de l’Intégration ContinueConcept de l’Intégration Continue
Concept de l’Intégration Continue
 
Selenium WebDriver avec Java
Selenium WebDriver avec Java Selenium WebDriver avec Java
Selenium WebDriver avec Java
 
20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven
 
Intégration continue transco
Intégration continue transcoIntégration continue transco
Intégration continue transco
 
IP Multimedia Subsystem : Démarrer avec Mobicents JainSLEE (Partie 1)
IP Multimedia Subsystem : Démarrer avec Mobicents JainSLEE (Partie 1)IP Multimedia Subsystem : Démarrer avec Mobicents JainSLEE (Partie 1)
IP Multimedia Subsystem : Démarrer avec Mobicents JainSLEE (Partie 1)
 
Hermes, génération et déploiement d'ipa by Peter Meuel
Hermes, génération et déploiement d'ipa by Peter MeuelHermes, génération et déploiement d'ipa by Peter Meuel
Hermes, génération et déploiement d'ipa by Peter Meuel
 
In01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introductionIn01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introduction
 
NextCloud
NextCloudNextCloud
NextCloud
 
Riviera JUG ff4j
Riviera JUG ff4jRiviera JUG ff4j
Riviera JUG ff4j
 

Similaire à Devops for mobile iOS/Android

Publier une application mobile en un clic
Publier une application mobile en un clicPublier une application mobile en un clic
Publier une application mobile en un clicFabernovel
 
Gitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement ContinueGitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement ContinueVincent Composieux
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsHugo Hamon
 
Symposium n°7 : Plateforme Meteor
Symposium n°7 : Plateforme MeteorSymposium n°7 : Plateforme Meteor
Symposium n°7 : Plateforme MeteorArthurMaroulier
 
Test flight et les outils de distribution continue par simone civetta de xebia
Test flight et les outils de distribution continue par simone civetta de xebiaTest flight et les outils de distribution continue par simone civetta de xebia
Test flight et les outils de distribution continue par simone civetta de xebiaCocoaHeads France
 
Fastlane snapshot presentation
Fastlane snapshot presentationFastlane snapshot presentation
Fastlane snapshot presentationCocoaHeads France
 
Octo Technology - Refcard Tests Web front-end
Octo Technology - Refcard Tests Web front-endOcto Technology - Refcard Tests Web front-end
Octo Technology - Refcard Tests Web front-endFrançois Petitit
 
Octo RefCard test front-end
Octo RefCard test front-endOcto RefCard test front-end
Octo RefCard test front-endClément Dubois
 
Retour d'expérience AdobeMC 2011
Retour d'expérience AdobeMC 2011Retour d'expérience AdobeMC 2011
Retour d'expérience AdobeMC 2011jonasmonnier
 
Usine logicielle à Orange Labs
Usine logicielle à Orange LabsUsine logicielle à Orange Labs
Usine logicielle à Orange LabsEmmanuel Hugonnet
 
Build automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et JenkinsBuild automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et JenkinsCocoaHeads France
 
Android Lab Test : La reconnaissance vocale (français)
Android Lab Test : La reconnaissance vocale (français)Android Lab Test : La reconnaissance vocale (français)
Android Lab Test : La reconnaissance vocale (français)Bruno Delb
 
Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !VISEO
 
RefCard Tests sur tous les fronts
RefCard Tests sur tous les frontsRefCard Tests sur tous les fronts
RefCard Tests sur tous les frontsOCTO Technology
 
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !vincent aniort
 
Déploiement PHP : de l'âge de pierre à nos jours.
Déploiement PHP : de l'âge de pierre à nos jours.Déploiement PHP : de l'âge de pierre à nos jours.
Déploiement PHP : de l'âge de pierre à nos jours.Amélie DUVERNET
 
CodeBuilder_DevOpsCenter.pptx
CodeBuilder_DevOpsCenter.pptxCodeBuilder_DevOpsCenter.pptx
CodeBuilder_DevOpsCenter.pptxThomasParaiso1
 

Similaire à Devops for mobile iOS/Android (20)

Publier une application mobile en un clic
Publier une application mobile en un clicPublier une application mobile en un clic
Publier une application mobile en un clic
 
Gitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement ContinueGitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement Continue
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec Jenkins
 
Symposium n°7 : Plateforme Meteor
Symposium n°7 : Plateforme MeteorSymposium n°7 : Plateforme Meteor
Symposium n°7 : Plateforme Meteor
 
Test flight et les outils de distribution continue par simone civetta de xebia
Test flight et les outils de distribution continue par simone civetta de xebiaTest flight et les outils de distribution continue par simone civetta de xebia
Test flight et les outils de distribution continue par simone civetta de xebia
 
Cours cordova & REST
Cours cordova & RESTCours cordova & REST
Cours cordova & REST
 
Fastlane snapshot presentation
Fastlane snapshot presentationFastlane snapshot presentation
Fastlane snapshot presentation
 
Octo Technology - Refcard Tests Web front-end
Octo Technology - Refcard Tests Web front-endOcto Technology - Refcard Tests Web front-end
Octo Technology - Refcard Tests Web front-end
 
Octo RefCard test front-end
Octo RefCard test front-endOcto RefCard test front-end
Octo RefCard test front-end
 
Retour d'expérience AdobeMC 2011
Retour d'expérience AdobeMC 2011Retour d'expérience AdobeMC 2011
Retour d'expérience AdobeMC 2011
 
Usine logicielle à Orange Labs
Usine logicielle à Orange LabsUsine logicielle à Orange Labs
Usine logicielle à Orange Labs
 
Apache Cordova 3.3 de zéro
Apache Cordova 3.3 de zéroApache Cordova 3.3 de zéro
Apache Cordova 3.3 de zéro
 
Build automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et JenkinsBuild automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et Jenkins
 
Android Lab Test : La reconnaissance vocale (français)
Android Lab Test : La reconnaissance vocale (français)Android Lab Test : La reconnaissance vocale (français)
Android Lab Test : La reconnaissance vocale (français)
 
Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !
 
RefCard Tests sur tous les fronts
RefCard Tests sur tous les frontsRefCard Tests sur tous les fronts
RefCard Tests sur tous les fronts
 
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
 
Déploiement PHP : de l'âge de pierre à nos jours.
Déploiement PHP : de l'âge de pierre à nos jours.Déploiement PHP : de l'âge de pierre à nos jours.
Déploiement PHP : de l'âge de pierre à nos jours.
 
Support POO Java première partie
Support POO Java première partieSupport POO Java première partie
Support POO Java première partie
 
CodeBuilder_DevOpsCenter.pptx
CodeBuilder_DevOpsCenter.pptxCodeBuilder_DevOpsCenter.pptx
CodeBuilder_DevOpsCenter.pptx
 

Plus de Cedric Gatay

2023-06-15 - #DoNotTrackMe - Camping Speakers 2023
2023-06-15 - #DoNotTrackMe - Camping Speakers 20232023-06-15 - #DoNotTrackMe - Camping Speakers 2023
2023-06-15 - #DoNotTrackMe - Camping Speakers 2023Cedric Gatay
 
Brown Bag Lunch Tours @ CEFIM - Git pour tous
Brown Bag Lunch Tours @ CEFIM - Git pour tousBrown Bag Lunch Tours @ CEFIM - Git pour tous
Brown Bag Lunch Tours @ CEFIM - Git pour tousCedric Gatay
 
HTML to REST API thoughts
HTML to REST API thoughtsHTML to REST API thoughts
HTML to REST API thoughtsCedric Gatay
 
Applications mobiles
Applications mobilesApplications mobiles
Applications mobilesCedric Gatay
 
Maven Tips - Lunch break slides
Maven Tips - Lunch break slidesMaven Tips - Lunch break slides
Maven Tips - Lunch break slidesCedric Gatay
 
Premier pas avec les tests unitaires
Premier pas avec les tests unitairesPremier pas avec les tests unitaires
Premier pas avec les tests unitairesCedric Gatay
 
Apache Wicket - Tours JUG Mars 2009
Apache Wicket - Tours JUG Mars 2009Apache Wicket - Tours JUG Mars 2009
Apache Wicket - Tours JUG Mars 2009Cedric Gatay
 

Plus de Cedric Gatay (8)

2023-06-15 - #DoNotTrackMe - Camping Speakers 2023
2023-06-15 - #DoNotTrackMe - Camping Speakers 20232023-06-15 - #DoNotTrackMe - Camping Speakers 2023
2023-06-15 - #DoNotTrackMe - Camping Speakers 2023
 
Brown Bag Lunch Tours @ CEFIM - Git pour tous
Brown Bag Lunch Tours @ CEFIM - Git pour tousBrown Bag Lunch Tours @ CEFIM - Git pour tous
Brown Bag Lunch Tours @ CEFIM - Git pour tous
 
ToursJUG mongoDB
ToursJUG mongoDBToursJUG mongoDB
ToursJUG mongoDB
 
HTML to REST API thoughts
HTML to REST API thoughtsHTML to REST API thoughts
HTML to REST API thoughts
 
Applications mobiles
Applications mobilesApplications mobiles
Applications mobiles
 
Maven Tips - Lunch break slides
Maven Tips - Lunch break slidesMaven Tips - Lunch break slides
Maven Tips - Lunch break slides
 
Premier pas avec les tests unitaires
Premier pas avec les tests unitairesPremier pas avec les tests unitaires
Premier pas avec les tests unitaires
 
Apache Wicket - Tours JUG Mars 2009
Apache Wicket - Tours JUG Mars 2009Apache Wicket - Tours JUG Mars 2009
Apache Wicket - Tours JUG Mars 2009
 

Dernier

Algo II: les files cours + exercices corrigés
Algo II: les files cours + exercices corrigésAlgo II: les files cours + exercices corrigés
Algo II: les files cours + exercices corrigésSana REFAI
 
le probleme de la planification JSP exposee (2) (2).pptx
le probleme de la planification JSP exposee (2) (2).pptxle probleme de la planification JSP exposee (2) (2).pptx
le probleme de la planification JSP exposee (2) (2).pptximaneeaouattahee
 
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024Ville de Châteauguay
 
mémoire genie civil presenté lors de la soutenance de mémoire
mémoire genie civil presenté lors de la soutenance de mémoiremémoire genie civil presenté lors de la soutenance de mémoire
mémoire genie civil presenté lors de la soutenance de mémoireEzechiasSteel
 
pdfcoffee.com_4-production-fond-des-puits-completion-pdf-free.pdf
pdfcoffee.com_4-production-fond-des-puits-completion-pdf-free.pdfpdfcoffee.com_4-production-fond-des-puits-completion-pdf-free.pdf
pdfcoffee.com_4-production-fond-des-puits-completion-pdf-free.pdfMedAbdelhayeSidiAhme
 

Dernier (6)

Algo II: les files cours + exercices corrigés
Algo II: les files cours + exercices corrigésAlgo II: les files cours + exercices corrigés
Algo II: les files cours + exercices corrigés
 
le probleme de la planification JSP exposee (2) (2).pptx
le probleme de la planification JSP exposee (2) (2).pptxle probleme de la planification JSP exposee (2) (2).pptx
le probleme de la planification JSP exposee (2) (2).pptx
 
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
 
mémoire genie civil presenté lors de la soutenance de mémoire
mémoire genie civil presenté lors de la soutenance de mémoiremémoire genie civil presenté lors de la soutenance de mémoire
mémoire genie civil presenté lors de la soutenance de mémoire
 
pdfcoffee.com_4-production-fond-des-puits-completion-pdf-free.pdf
pdfcoffee.com_4-production-fond-des-puits-completion-pdf-free.pdfpdfcoffee.com_4-production-fond-des-puits-completion-pdf-free.pdf
pdfcoffee.com_4-production-fond-des-puits-completion-pdf-free.pdf
 
JTC 2024 Bâtiment et Photovoltaïque.pdf
JTC 2024  Bâtiment et Photovoltaïque.pdfJTC 2024  Bâtiment et Photovoltaïque.pdf
JTC 2024 Bâtiment et Photovoltaïque.pdf
 

Devops for mobile iOS/Android

Notes de l'éditeur

  1. Nanak => Nanak Bonjour et merci d’être la pour nous écouter parler de devops mobile
  2. Nanak => Nanak Rapidement qui nous lui sommes, lui c’est Cedric moi c’est Florian On vient de Tours et on est co fondateur d’un studio de developpement nommé Code-Troopers Je fait de l’Android Cedric fait de l’ios
  3. Nanak => Nanak
  4. Nanak => Nanak Java Software developers, used to deliver multiple times per day thanks to proper automation, our workflow makes us use this different set of tools : * ansible * vagrant * packer * docker * maven * gradle * jenkins
  5. Nanak => Samva Our activity evolved and we now develop mobile apps too, one thing that was bothering us was the latency between build and deploy.
  6. Nanak => Samva Our activity evolved and we now develop mobile apps too, one thing that was bothering us was the latency between build and deploy.
  7. Samva => Samva Utiliser des API ou outiller tout ça pour ne pas galérer Android side is offering a nice API, that we can call from gradle Apple side is offering no API, and a click-a-drama workflow.
  8. Samva => Samva Un des premiers objectif pour nous c’est d’avoir un moyen de livrer qui nous permet de le faire depuis n’importe où très simplement. Comme on le fait habituellement via un Jenkins utilisable facilement depuis nos téléphones (bon facilement ca reste à voir, sans blue ocean c’est CHAUD). Pouvoir livrer une app en alpha / beta / prod sans avoir le laptop sous la main est hyper pratique Un autre point c’est que ca nous permet d’avoir un moyen fiable et relativement rapide de déployer: Fiable car on s’abstrait au maximum d’une particuliarité d’un env de dev spécifique Rapide car nos machines de builds n’ont que ca a faire :) Et en plus on a du feedback dans Slack ----- Essayer de rapprocher de Festroopers sur le côté mise à jour décidée par le client. We want to deliver our app with a jenkins job, thus allowing to do it from our phones / slack easily. It allows us the following : * reproduceability * speed * stability of the process * confidence
  9. Samva => Samva Un autre point c’est que ca nous permet d’avoir un moyen fiable et relativement rapide de déployer: Fiable car on s’abstrait au maximum d’une particuliarité d’un env de dev spécifique Rapide car nos machines de builds n’ont que ca a faire :) Et en plus on a du feedback dans Slack Notre objectif était tout de même principalement motivé par le fait d’enfin réussir à faire ces tricks au baby-foot. On s’entraine, mais c’est pas évident. Bon assez parlé de l’objectif, maintenant on va rentrer dans le vif du sujet Essayer de rapprocher de Festroopers sur le côté mise à jour décidée par le client. We want to deliver our app with a jenkins job, thus allowing to do it from our phones / slack easily. It allows us the following : * reproduceability * speed * stability of the process * confidence
  10. Samva => Samva Avant de chercher à outiller, il faut qu’on voie comment on fait habituellement pour construire une app mobile
  11. Samva => Nanak Côté iOS c’est un petit paquet d’étape, il y en a des faciles et commune a tous les projets, genre checkout, d’autres un peu pénibles car potentiellement lent (genre récupérer une version d’XCode dans la bonne version [surtout si c’est une ancienne]) et toute la partie compte apple et gestion des signatures peut carrément virer au cauchemard. Cela dit, une fois qu’on a tout ce qu’il faut sur son poste, on est bon pour bosser.
  12. Nanak => Nanak
  13. Nanak => Samva Du coup, s’il faut livrer dans l’urgence une nouvelle version, on est à la merci de quelques problèmes
  14. Samva => Samva Du coup, s’il faut livrer dans l’urgence une nouvelle version, on est à la merci de quelques problèmes
  15. Samva => Samva Du coup pour tenter d’outiller tout ca et d’éviter le cas où on ne peut rien faire, il y a quand même quelques outils disponibles. Pour les présenter on les répartir en deux principales phases du développement, le build puis le déploiement.
  16. Samva => Nanak On va donc commencer par parler génération du livrable, Florian comment ca se passe sous Android ?
  17. Nanak => Nanak
  18. Nanak => Nanak
  19. Nanak => Nanak
  20. Nanak => Nanak
  21. Nanak => Nanak
  22. Nanak => Nanak >> CG entoure assembleRelease <<
  23. Nanak => Nanak
  24. Nanak => Samva
  25. Samva => Samva Du coup pour builder une app iOS on a quelques possibilité, déjà la version classique en utilisant XCode et en jouant du click click pour cibler “tous” les devices iOS et en lançant l’archivage (qui n’a pas de raccourci clavier bien sur, ca serait trop simple…)
  26. Samva => Samva Une autre solution peut être d’utiliser la ligne de commande avec xcodebuild, mais, pas sur que ce soit plus simple et sympa a utiliser que la version click click de Xcode au final, l’aide n’est pas rassurante en tout cas.
  27. Samva => Samva Enfin, et dans le cadre de ce qu’on vise, il y a aussi le plugin Jenkins XCode. C’est assez fastidieux à configurer et à utiliser, il faut bien sûr que Jenkins tourne sous OSX (ou qu’un slave tourne sous OSX) mais ca fonctionne (et ca invoque xcodebuild en fait)
  28. Samva => Nanak On est content on a notre APK / IPA, maintenant il faut le pousser aux clients
  29. Nanak => Nanak
  30. Nanak => Nanak Les api sont bien et donne le controle a presque tout
  31. Nanak => Samva
  32. Samva => Samva iTunes connect : gestion des certificats au passage Les étapes sont également assez nombreuses, et assez fastidieuse, sachant qu’il arrive que ca ne se passe pas comme prévu et c’est en général à la fin de l’upload que tout se déclare. Mais passons à un outil qui peut nous permettre d’y voir plus clair : fastlane Choisir le build dans iTunes Connect
  33. Samva => Samva fastlane est l’outil de choix que nous allons vous présenter brièvement (car il est TRES complet) dans les slides à venir
  34. Samva => Samva Tout d’abord un peu d’histoire sur le projet, il a été créé par Felix Krause
  35. Samva => Nanak Comment on fait du coup pour utiliser fasltane?
  36. Nanak => Samva
  37. Samva => Samva
  38. Samva => Nanak f
  39. Nanak => Nanak
  40. Nanak => Samva
  41. Samva => Samva On peut aussi tout caler dans un AppFile à côté
  42. Samva => Samva
  43. Samva => Samva
  44. Samva => Nanak
  45. Nanak => Nanak
  46. Nanak => Nanak
  47. Nanak => Nanak
  48. Nanak => Nanak
  49. Nanak => Samva
  50. Samva => Samva
  51. Samva => Nanak
  52. Nanak => Samva
  53. Samva => Samva C’est jenkins qui utilise fastlane le plus.
  54. Samva => Samva On a un jenkins sur un serveur chez OVH, qui se connecte a différents types de slaves: Des noeuds docker android dans lesquels on a les différents SDK dont on a besoin (ou un acceptLicence qui va bien) Une machine physique connectée à beaucoup de devices android différents Un “vieux” MBP reconditionné et une OSX dans une VM (sous linux, oui c’est mal…)
  55. Samva => Samva On a un jenkins sur un serveur chez OVH, qui se connecte a différents types de slaves: Des noeuds docker android dans lesquels on a les différents SDK dont on a besoin (ou un acceptLicence qui va bien) Une machine physique connectée à beaucoup de devices android différents Un “vieux” MBP reconditionné et une OSX dans une VM (sous linux, oui c’est mal…)
  56. Samva => Samva On a un jenkins sur un serveur chez OVH, qui se connecte a différents types de slaves: Des noeuds docker android dans lesquels on a les différents SDK dont on a besoin (ou un acceptLicence qui va bien) Une machine physique connectée à beaucoup de devices android différents Un “vieux” MBP reconditionné et une OSX dans une VM (sous linux, oui c’est mal…)
  57. Samva => Samva On a un jenkins sur un serveur chez OVH, qui se connecte a différents types de slaves: Des noeuds docker android dans lesquels on a les différents SDK dont on a besoin (ou un acceptLicence qui va bien) Une machine physique connectée à beaucoup de devices android différents Un “vieux” MBP reconditionné et une OSX dans une VM (sous linux, oui c’est mal…)
  58. Samva => Samva Jenkins multibranch avec le Jenkinsfile grace au pipelineMultibranch Job qui merge master vers alpha, le merge déclenche le build, commit le version bump et le merge vers le master Job de passage vers beta, appel à l’API iTunesConnect pour mise a dispo Job de release, upload de la description, création de la version+1, promotion de beta vers prod (ou raccourci alpha -> prod)
  59. Samva => Nanak
  60. Nanak | Samva => Samva pilot distribute --distribute_external true -w "Nouvelle beta" -g "Beta Testeurs" Jenkins multibranch avec le Jenkinsfile Job qui merge master vers alpha, le merge déclenche le build, commit le version bump et le merge vers le master Job de passage vers beta, appel à l’API iTunesConnect pour mise a dispo Job de release, upload de la description, création de la version+1, promotion de beta vers prod (ou raccourci alpha -> prod)
  61. Samva | Nanak => Samva pilot distribute --distribute_external true -w "Nouvelle beta" -g "Beta Testeurs" Jenkins multibranch avec le Jenkinsfile Job qui merge master vers alpha, le merge déclenche le build, commit le version bump et le merge vers le master Job de passage vers beta, appel à l’API iTunesConnect pour mise a dispo Job de release, upload de la description, création de la version+1, promotion de beta vers prod (ou raccourci alpha -> prod)
  62. Samva => Nanak fastlane deliver submit_build --build_number 830 pilot distribute --distribute_external true -w "Nouvelle beta" -g "Beta Testeurs" Jenkins multibranch avec le Jenkinsfile Job qui merge master vers alpha, le merge déclenche le build, commit le version bump et le merge vers le master Job de passage vers beta, appel à l’API iTunesConnect pour mise a dispo Job de release, upload de la description, création de la version+1, promotion de beta vers prod (ou raccourci alpha -> prod)
  63. Nanak => Nanak Révocation de clé Possibilité de ne livrer qu’en beta pour limiter les blagues Récupération des infos du store (versionning de la fiche du store si mise a jour par l’équipe commerciale)
  64. Nanak => Nanak
  65. Nanak => Nanak
  66. Nanak => Nanak
  67. Nanak => Nanak
  68. Nanak => Nanak
  69. Nanak => Nanak
  70. Nanak => Samva Une lane dédiée à la mise a jour de la description du store
  71. Samva => Samva Avec les dSYM Description / Screenshot c’est bidirectionnel donc on peut “rattraper” un projet qui est déjà live
  72. Samva => Samva
  73. Samva => Samva
  74. Samva => Samva Bénéfices
  75. Samva => Samva Pas besoin de galérer avec la taille du simulateur
  76. Samva => Nanak Pas besoin de galérer avec la taille du simulateur
  77. Nanak => Nanak Extensible via des Shell scripts
  78. Nanak => Samva
  79. Samva => Samva On a toujours le droit de perdre son temps. Mais si on veut être efficace c’est possible
  80. Samva => Samva Server / mobile on fait pareil
  81. Samva => Samva Server / mobile on fait pareil
  82. Samva => Samva Gem install fastlane Avec 8 bras et 1h de sommeil par jour
  83. Samva | Nanak