Skip to content
Anis Safine edited this page Feb 13, 2024 · 26 revisions

Process de mise en production

1. Générer une nouvelle version

  • merger toutes les PRs désirées dans develop
  • depuis l'onglet "Actions" du dépôt, lancer le workflow release en utilisant bien develop comme ref.

La Github Action va alors automatiquement lancer un build des images Docker qui seront publiées sur le Docker Hub. Ces actions sont visibles dans l'onglet Actions de Github et vont précisément :

  • calculer le numéro de la nouvelle version en s'appuyant sur les commits publiés depuis la version précédente. Si le message d'un des commits contient #major, #minor, ou #patch on incrémente respectivement d'une majeur, mineure, ou patch. Si plusieurs commits matchent ce pattern, on retient l'incrémentation la plus importante (major > minor > patch)
  • mettre à jour le fichier package.json pour changer le numéro de version qui y est renseigné
  • commit et push ce changement de package.json sur la branche develop
  • poser le tag de version vX.Y.Z sur ce commit
  • merger develop dans master
  • build l'image Docker puis la pusher sur le bon repository du Docker Hub avec deux tags : le tag de version, et le tag latest

Si l'un des build échoue pendant l'action release, il faut rollback à la main la release :

  • aller sur la branche master et supprimer le merge de develop dans master
git checkout master
git reset HEAD~1
git checkout .
git clean -d -f .
git push origin master --force
  • aller sur la branche develop et supprimer le tag ainsi que le commit de release
git checkout develop
git reset HEAD~1
git checkout .
git clean -d -f .
git push origin develop --force
git tag --delete vx.y.z
git push origin --delete vx.y.z

2. Mettre à jour la production

Connectez vous en ssh à la machine de production avec votre compte personnel, passez root, puis allez dans le dossier de la plateforme :

su root
cd /srv/resorption-bidonvilles

Mettre à jour RB_DEPLOY_VERSION avec le numéro de version désiré dans le fichier config/.env :

nano ./config/.env

Pull les images, et redémarrer les services :

make prod pull
make prod "up -d"

Si besoin, mettre à jour la base de données avec migrations et seeders :

make sequelize db:migrate
make sequelize "db:seed --seed ./db/seeders/000000-changelogs.js"

On vérifie en production que tout est ok. Si toutefois il devait y avoir un problème, il "suffit" de faire le chemin inverse pour rollback la mise en production :

  • annuler les changements en base
make sequelize "db:seed:undo --seed ./db/seeders/000000-changelogs.js"
make sequelize "db:migrate:undo --to 000050-01-create-table-electricity_type"
  • mettre à jour RB_DEPLOY_VERSION dans config/.env
  • mettre à jour les services
make prod pull
make prod "up -d"

3. L'administratif

À noter que j'utilise le script suivant pour générer le changelog que je publie à la fois sur Github et sur Mattermost.

const trelloId = "";
const trelloToken = "";
const version = '';
const cards = {
    features: [],
    design: [],
    fixes: [],
    admin: [],
    wording: [],
    tech: [],
};

const Trello = require("trello");
var trello = new Trello(trelloId, trelloToken);

const titles = {
    features: '🛠 Nouvelles fonctionnalités et évolutions',
    design: '🎨 UX / UI',
    fixes: '🩹 Correctifs',
    admin: '🖥 Admin',
    wording: '✍🏽 Wording',
    tech: '👷🏼‍♂️ Technique',
};

function printGithubChangelog(changelog) {
    const output = Object.keys(changelog)
        .filter(key => changelog[key].length > 0)
        .map((key) => {
            const title = `## ${titles[key]}`;

            const items = changelog[key]
                .map(card => `- [[${card.idShort}]](${card.shortUrl}) ${card.name}`)
                .join(`\n`)

            return `${title}\n${items}`;
        })
        .join(`\n\n`);
    console.log(output);
}
function printSlackChangelog(changelog) {
    const output = Object.keys(changelog)
        .filter(key => changelog[key].length > 0)
        .map((key) => {
            const title = `> *${titles[key]}*`;

            const items = changelog[key]
                .map(card => `> - ${card.name}`)
                .join(`\n`)

            return `${title}\n${items}`;
        })
        .join(`\n\n`);

    console.log(`@here\n\n📦 ${version} *— MISE EN PRODUCTION*\nLa version ${version} vient d'être mise en production et apporte les modifications suivantes :\n\n${output}`);
}

(async () => {
    await Promise.all(
        Object.values(cards)
            .reduce((acc, arr) => [...acc, ...arr], [])
            .map((cardId) => trello.getCard('ziXTXxj8', cardId)),
    )
        .then((result) => {
            const hash = result.reduce((acc, card) => Object.assign(
                {},
                acc,
                {
                    [card.idShort]: card
                },
            ), {});

            const changelog = Object.keys(cards).reduce((acc, key) => Object.assign(
                {},
                acc,
                {
                    [key]: cards[key].map(cardId => hash[cardId]),
                },
            ), {});

            printGithubChangelog(changelog);
            printSlackChangelog(changelog);
        });
})();

Pour utiliser ce script :

  • installer le module trello avec npm ou yarn
  • remplir trelloId et trelloToken avec vos identifiants (à récupérer ici : https://trello.com/app-key)
  • remplir version avec votre numéro de release
  • remplir cards en saisissant le numéro de chaque ticket passé en production (integer) dans la catégorie adaptée (feature, fix, etc.)
  • démarrer le script en faisant node monScript.js
Clone this wiki locally