Workflow

Automatisation, développement, intégration continue...

Session 1

Stéphane HULARD
Expert technique

https://chstudio.fr
@s_hulard
http://github.com/shulard
s.hulard@chstudio.fr
s.hulard@univ-lyon2.fr

Pendant ce cours...

  1. Il était un projet...
  2. Gestion de version
  3. Gestion des dépendances
  4. Intégration continue
  5. Outils

Il était un projet...

Codé en différent langages...

  • BackEnd: PHP, Java, Go, JavaScript, Ruby...
  • FrontEnd: CSS, Sass, Less, JavaScript, CoffeeScript, TypeScript, HTML, HAML...

Utilisant des framework...

  • BackEnd: Symfony, Laravel, WordPress...
  • FrontEnd: Compass, React, Node modules...

Et des standards mal supportés...

  • JavaScript écrit en ES2016
  • CSS sans propriétés préfixés

Pour des navigateurs un peu butés...

  • Chaque navigateur a son propre rythme de développement
  • Les nouveautés sont apportées versions par versions
  • Les applications développées doivent s'adapter et toujours fonctionner

Mais les développeurs aiment profiter des nouveautés

  • Sans contrainte lors du développement
  • Pour motiver les équipes en adoptant des pratiques innovantes
  • Pour la beauté du code écrit 😀

Heureusement des outils existent !

  • Pour transpiler du code
    • TypeScript => JavaScript
    • ES2016 => JavaScript
    • Sass => CSS
  • Pour optimiser le code
    • Compilation / Minification
    • Nettoyage
  • Pour vérifier le code
    • Application de style de code
    • Tests unitaires et tests d'intégration

Pour cela le code doit être géré correctement

Gestion de version

Qu'est-ce que c'est ?

Principe de maintenir l'ensemble des versions d'un ou plusieurs fichiers.

  • Centralisé : Subversion, CVS
    • Tout est stocké sur un serveur
    • Le dépôt sans le serveur est inutile
  • Décentralisé : Git, Mercurial, Baazar, GNU Arch...
    • Chaque utilisateur dispose de sa propre copie
    • Chaque copie est indépendante
    • Plusieurs copie peuvent partager des modifications

Pourquoi ?

  • Collaborer autour du code source
  • Avoir une trace de l'évolution d'un projet

Les branches

  • Différentes versions du code source indépendantes
  • Possibilité de fusionner deux branches

Lexique

  • Dépôt,Repository
    • Conteneur utilisé par le logiciel pour stocker les versions
  • Révision,Commit
    • Une modification de code
  • Branche,Branch
    • Un flux de modification du code

Gestion des dépendances

Qu'est-ce que c'est ?

Principe de gestion du code source externe intégré à l'application.

  • FrontEnd : NPM, Bower...
  • BackEnd : Composer, Bundler...

Comment en PHP ?

Un fichier pour décrire les dépendances du projet et une commande pour les installer.

composer.json

                {
                    "name": "exoskills/applux-bo",
                    "description": "ExoSkills - AppLux Back Office.",
                    "license": "proprietary",
                    "type": "project",
                    "require": {
                        "php": ">=5.5.9",
                        "laravel/framework": "5.2.*",
                        ...
                    },
                    "require-dev": {
                        "phpunit/phpunit": "~4.0",
                        "squizlabs/php_codesniffer": "~2"
                    }
                }
                            

Comment en JavaScript ?

package.json

                {
                  "name": "Applux-BO",
                  "version": "1.0.0",
                  "description": "Back Office - Afflux",
                  "private": true,
                  "repository": {
                    "type": "git",
                    "url": "git+https://gitlab.com/exoskills/applux-bo"
                  },
                  "dependencies": {
                    "autoprefixer": "^6.3.7",
                    "babel-plugin-transform-inline-environment-variables": "^6.8.0",
                    "babel-preset-es2015": "^6.9.0",
                    "babelify": "^7.3.0",
                    ...
                  },
                  "devDependencies": {
                    "nodemon": "^1.9.2",
                    "parallelshell": "^2.0.0",
                    "watchify": "^3.7.0"
                  }
                }
                            

Comment en Ruby ?

Gemfile

                source "https://rubygems.org"
                gemspec :name => "jekyll"

                gem "rake", "~> 11.0"

                # Dependency of jekyll-mentions. RubyGems in Ruby 2.1 doesn't shield us from this.
                gem "activesupport", "~> 4.2", :groups => [:test_legacy, :site] if RUBY_VERSION < '2.2.2'

                group :development do
                  gem "launchy", "~> 2.3"
                  gem "pry"

                  unless RUBY_ENGINE == "jruby"
                    gem "pry-byebug"
                  end
                end

                            

Mais pas que...

  • Fiabilisation de l'environnement
  • Détection de fonctionnalités (extensions)
  • Définition de scripts génériques
  • Gestion de l'autoload...

Intégration continue

Principe

  • Workflow de traitement du code
    • Vérifier chaque commit pour garantir la stabilité
  • Tester toute l'application (backend / frontend)
    • Identifier les étapes (préparation, tests, build...)
    • Créer un contexte de test fiable (données, outils tiers)
    • Rendre les tests reproductibles (local, préprod...)

L'environnement d'exécution est :

  • Éphémère
  • Reconstructible
  • Léger
  • Complet
  • Identique à la production
  • Le plus simple possible

Les étapes sont :

  • Fiables
  • Séquencées

Des outils spécifiques

  • Task runner
    • Gulp, Phing, Ant, Make, Grunt...
  • Tests unitaires
    • PHPUnit, Atoum, QUnit, UnitJS...
  • Tests d'intégration
    • Behat, Selenium...
  • Plaforme d'intégration continue
    • TravisCI, GitlabCI, Jenkins, Hudson, TeamCity...