Bipbip.js

Créé par Baptiste Donaux

Baptiste Donaux

Contexte

Contexte

Modernisation de nos outils de déploiements

  • Jenkins
  • Capifony

Objectif

  • Supprimer Jenkins
  • Déployer nos projets avec un outils non-déprécié

Pourquoi développer Bipbip.js

Capifony 2++

  • Capifony correspond à Capistrano 2 avec le module Symfony.
  • Capistrano 2 est déprécié
  • Capistrano 3 semble l'héritier logique
  • Mais Capifony n'est plus, et l'utilisation de plugins est nécessaire

Capifony 3

(Arguments valables au moment de nos recherches)

  • Peu de documentation
  • Faible communauté
  • Configuration de nos projets qui doit être changée

Troll.rb

  • Ruby
  • Syntaxe désagréable pour les configuration

La concurrence

  • Peu de concurrent sérieux
  • La plupart sont dédiés au déploiement PHP
  • La syntaxe déplaisante souvent copié sur Capistrano (cf. Deployer)

Extras

Quelques problèmes avec Capifony qu'on aimerait bien changer.

  • Rollback systématique du déploiement des releases en erreur
  • Syntaxe difficile
  • Système de plugins qui prouvent qu'on manque de liberté
  • Des systèmes qui imposent une certaine façon pour déployer
  • Des logs qui manquent d'informations

Objectifs

Objectifs

Be better !

On veut un outils…

  • Simple
  • Facile à comprendre et appréhender
  • Qui nous laisse libre de faire ce que l'on veut
  • Facile à déboguer
  • Qui facilite les contributions

On ne veut pas un outils…

  • Lié à un langage
  • Qui soit fourre-tout
  • Qui propose pleins de solutions et de protocoles (ex: FTP)
  • Qui fasse des choses non prévus…
  • … ou dans une moindre mesure qui nous informe de ce qu'il a fait

Stratégie

Workflow

Architecture

On reprend ce qui fonctionne (très) bien.

./your_project
|_ current -> ./releases/20160301010000
|_ releases
   |_ 20160101010000
   |_ 20160201010000
   |_ 20160301010000
|_ shared

Configuration

Bipbip.js veut rendre libre le DevOps. Par conséquent, terminer les configurations à deux balles (et encore je suis gentil).

Configuration

  • Fichier en JavaScript (à la Node.js)
  • Un unique fichier pour tous les déploiements

Configuration

exports.config = {
  default: {
    workspace: "/path/to/workspace",
    requirements: {
        local: [],
        remote: []
    },
    servers: [{
      user: "user",
      host: "server_to_deploy.io",
      to: "/path/to/deploy"
    }],
    repository: {
      url: "git@github.com:baptistedonaux/bipbip.js.git",
      branch: null,
      tag: null,
      options: {
        submodules: true|false
      }
    },
    commands:  {
      local: [
        // local commands to run (before send to remote server)
      ],
      remote: [
        // remote commands to run (after project send to remote server)
      ],
      postDeploy: [
        // remote commands to run (after new release deployed)
      ]
    },
    ignores: [
      // ignore files/folders
    ],
    shared: {
      files: [
        // files shared
      ],
      folders: [
        // folders shared
      ]
    },
    releases: 3
  },
  <env1>: {
  },
  <env2>: {
  }
}

Exemple

Déployer un Symfony

Configuration

exports.config = {
  default: {
    commands:  {
      local: [
        "curl -sS https://getcomposer.org/installer | php",
        ["php composer.phar install -o --no-progress", "npm run gulp prod"]
      ]
    },
    requirements: {
      local: ["php", "npm"],
      remote: ["php"]
    },
    ignores: [
      ".git",
      ".gitignore",
      ".gitlab-ci.yml",
      "composer.json",
      "composer.phar",
      "docker-compose.yml.dist",
      "gulpfile.js",
      "package.json",
      "deploy.js",

      "docker",
      "node_modules",
      "web/app_dev.php",
      "web/config.php"
    ],
    shared: {
      files: ["app/config/parameters.yml"],
      folders: ["var/logs", "web/uploads"]
    },
    releases: 3
  },
  dev: {
    commands: {
      remote: [
        "php bin/console cache:clear -e prod",
        "php bin/console doctrine:schema:update --force",
        "chown www-data:www-data -R bin/console var/{cache,logs} web/app.php",
        "chmod 775 -R bin/console var/{cache,logs} web/app.php",
      ],
      postDeploy: ["sudo service php5-fpm reload"]
    },
    servers: [{
      user: "www-data",
      host: "webserver.org",
      to: "/home/www/my_project"
    }]
  }
};

Go !

$ npm install -g bipbip@0.7.*
$ bipbip dev

Vers l'infini et l'au-delà !

Améliorations à venir - Part 1

  • Meilleur affichage des logs
  • Mise en place de différent niveau de logs (abstrait, technique…)
  • Gestion des exclusions/inclusions grâce via des regex
  • Faire une gestion avancé des connexions SSH en les gardant ouvertes (EPIC !)
  • Synchroniser les fichiers/dossiers partagés lors du premier déploiement
  • Mettre en place un outils pour initialiser un nouveau projet
  • Mettre en place de template d'aide pour les différents types de projets (Symfony, Drupal, Laravel…)
  • Mettre en place plus de tests unitaires

Améliorations à venir - Part 2

  • Améliorer la documentation
  • Mettre en place plus de services de validation (Coveralls…)
  • Mettre en place un système de .retry à la Ansible pour relancer un déploiement
  • Mettre en forme une fonction pour configurer une step-to-stop (permet de découper la partie build de la partie deploy)

Amélioration far far away

Re-écrire le projet une fois stable dans un langage qui n'imposerai pas l'installation d'autre paquet (comme Node.js actuellement).

Thank you !