-
Notifications
You must be signed in to change notification settings - Fork 3
Home
- merger toutes les PRs désirées dans
develop
- depuis l'onglet "Actions" du dépôt, lancer le workflow
release
en utilisant biendevelop
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
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
dansconfig/.env
- mettre à jour les services
make prod pull
make prod "up -d"
- sur Trello, passer tous les tickets concernés dans la colonne
Mise en production
- publier le changelog sur GitHub : https://github.com/MTES-MCT/action-bidonvilles-api/releases/tag/x.y.z
- annoncer la mise en production sur le chan #mises-en-production du Mattermost de l'équipe
À 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
ettrelloToken
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