Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Profiter de l'intégration continue dans ses pro...

Profiter de l'intégration continue dans ses projets Android

Avec les méthodes de développement actuelles, avoir une plateforme d'intégration continue est un besoin vital.
Si dans de nombreux domaines il s'agit de quelque chose d'évident, on se rend vite compte qu'il y a encore des lacunes lors du développement d'application mobile.
Peu de documentations, des contraintes matérielles, des gestions de tests uniques,... L'environnement de développement Android ne facilite pas la tâche!
Mais il ne faut pas perdre espoir, car c'est tout de même possible!

Avatar for Caroline Mouden

Caroline Mouden

January 31, 2019
Tweet

More Decks by Caroline Mouden

Other Decks in Programming

Transcript

  1. Avant “Je sais ce que veulent mes utilisateurs. “Mon système

    est critique, je n’ai pas le droit à l’erreur. “Il y a des contraintes à la mise à jour, je n’en fais que très rarement.
  2. Aujourd’hui “J’adapte mon produit selon mes utilisateurs. “Je met à

    jour régulièrement. “Un délai trop long de correction de bug peut me faire perdre de l’argent
  3. Utilisateur Developpeurs Tester le projet Générer les livrables Publier les

    livrables (ex: sur un store) Vérifier le niveau de qualité du code Continuous Deployment Continuous Delivery Continuous Integration Mettre en commun
  4. Configurer le pipeline node('master') { stage('Build') { checkout scm sh

    'chmod u+x ./gradlew' sh './gradlew assemble' archiveArtifacts '**/build/outputs/apk/**' } }
  5. Outils pour déployer sur le store - Depuis Gradle -

    gradle-play-publisher - Depuis votre plateforme de CI - Plugins de déploiement - Autres outils spécialisés - Ex: Fastlane
  6. Mettre à jour son job node('master') { stage('Build') {...} stage('Publish')

    { androidApkUpload googleCredentialsId: 'Playstore', apkFilesPattern: '**/app-release.apk', trackName: 'internal' } }
  7. Lancer depuis gradle plugins { id 'org.sonarqube' version '2.6.2' }

    subprojects { sonarqube { properties { property 'sonar.host.url', 'http://localhost:9000/' property 'sonar.sources', android.sourceSets.main.java.srcDirs property 'sonar.binaries', file('build/intermediates/classes/debug') property 'sonar.projectVersion', android.defaultConfig.versionName } } }
  8. Première revue de code “Est-ce que je répond à ma

    User Story? “Est-ce que mon code fonctionne proprement?
  9. Aide à rendre le code maintenable “Comment vais-je pouvoir tester

    cette méthode de 2000 lignes? “Comment vais-je pouvoir caser la nouvelle fonctionnalité là-dedans?
  10. Tests unitaires Tests d’intégration Tests fonctionnels Tests d’acceptation As a

    : Dev I wa t : e t e w ut ga g e h So I c : e t o f e an t fa
  11. Ne pas toujours tout tester - Par nom de package

    - Pour tester uniquement votre fonctionnalité - Par taille - @SmallTest, @MediumTest, @LargeTest - Par morceau (shards) - Diviser vos tests en plusieurs morceaux - Paralléliser sur plusieurs téléphones
  12. node('master') { stage('Initialize') {...} stage('Unit Tests') { sh './gradlew testDebugUnitTest'

    } stage('Android Tests') { sh './gradlew connectedAndroidTest' } stage('Quality') {...} stage('Build') {...} } Mettre à jour son job
  13. Afficher les résultats dans SonarQube sonarqube { properties { ...

    property 'sonar.tests', [android.sourceSets.androidTest.java.srcDirs, 'src/test/java'] property 'sonar.junit.reportPaths', ['build/outputs/androidTest-results/connected', 'build/test-results/testDebugUnitTest'] } }
  14. !

  15. Tests unitaires Tests d’intégration Tests fonctionnels Tests d’acceptation As a

    : Dev I wa t : e t e w ut ga g e h So I c : e t o f e an t fa Est-ce vraiment utilisé?
  16. Les limites de l’accessibilité Notifications, Animations, Intent externe, services externes…

    Tout ne peut pas être testé ni contrôlé. Adapter son code pour limiter l’impact
  17. Activer la couverture pour androidTest android { ... buildTypes {

    debug { testCoverageEnabled = true (ou) project.hasProperty('coverage') } } }
  18. Afficher les résultats dans SonarQube sonarqube { properties { ...

    def jacocoPathsList = ['build/jacoco/testDebugUnitTest.exec'] fileTree('build/outputs/code-coverage/connected/') .filter {it.isFile()}.files.name .each { name -> jacocoPathsList.add('build/outputs/code-coverage/connected/'+name)} property 'sonar.jacoco.reportPaths', jacocoPathsList } }
  19. Intégrer dans Jenkins node('master') { stage('Initialize') {...} stage('Unit Tests') {

    sh './gradlew -Pcoverage testDebugUnitTest’ } stage('Android Tests') { sh './gradlew -Pcoverage createDebugCoverageReport' } stage('Merge Tests') { ... jacoco classPattern: '**/classes/debug', execPattern: '**/jacoco/*.exec, **/code-coverage/**/*.ec', inclusionPattern: '**/*.class' } stage('Quality') {...} stage('Build') {...} }
  20. Utiliser des fermes de téléphone Firebase Test Lab, AWS Device

    Farm, Samsung Remote Test Lab, ... Grand choix de téléphones Service payant Quid de la sécurité? Pour un usage occasionnel ou sur un parc important
  21. Passer les tests à partir d’une machine physique Contrôle sur

    les équipements Liberté sur l’environnement de test Nécessite d’avoir un parc de téléphone Gestion de la configuration à faire Pour un usage courant ou sur un parc limité Avec téléphones branchés ou émulateurs
  22. 2 semaines 1 an 2 mois Cibles limitées ∞ Equipements

    spécialisés (durcis) Notre contexte
  23. Les limites de notre solution Nécessite le parc de téléphones

    cibles Mise en place chez le client? Cas multi-projets
  24. Plus loin... - Utilisation de spoon - spoon-runner - screenshots

    - Scripts de pipeline avancés - Pour gérer l’installation/désinstallation - Pour gérer les téléphones (animation, lock screen, …) - Utilisation de parametrage - Jobs Pipeline Multibranches - Dockeriser ses slaves
  25. Des liens utiles - VersionBerg (pour faciliter la gestion des

    versions) - https://github.com/rockerhieu/Versionberg - Stay Alive ! - https://play.google.com/store/apps/details?id=com.synetics.stay.alive&hl=fr - Gestion émulateurs - https://github.com/butomo1989/docker-android - https://github.com/gojuno/swarmer - Article medium - https://medium.com/u-want-to-learn/case-study-for-android-ci-cd-cd-continu ous-integration-delivery-deployment-part-4-9ae4a1d2cef3