javascript/cours_javascript_devops.md

12 KiB
Raw Permalink Blame History

📚 Cours JavaScript pour DevOps - Les Fondamentaux

⚠️ Important : JavaScript ≠ Java ! Ce sont deux langages complètement différents. JavaScript est un langage de scripting moderne utilisé pour le web, le backend (Node.js), et l'automatisation DevOps.


📖 Table des matières

  1. Les bases de JavaScript
  2. Les tableaux et leurs méthodes
  3. Les objets JavaScript
  4. Les fonctions
  5. Les boucles
  6. Les expressions régulières (Regex)
  7. Exécuter du code avec Docker

1 Les Bases de JavaScript

Variables : let, const

En JavaScript, on déclare des variables avec let ou const :

let compteur = 0;           // Variable modifiable
const MAX_LOGS = 100;       // Constante (non modifiable)

Règle d'or : Utilise const par défaut, et let seulement si tu dois modifier la valeur.

Types de données

// Nombres
const cpu = 85;
const ram = 90.5;

// Chaînes de caractères (strings)
const serveur = "srv-01";
const status = 'online';

// Booléens
const estEnLigne = true;
const estHorsDeLigne = false;

// Tableaux
const serveurs = ["srv-01", "srv-02", "srv-03"];

// Objets
const serveur1 = {
    id: "srv-01",
    cpu: 45,
    ram: 60
};

Opérateurs de comparaison

45 === 45        // true (égal strictement)
45 == "45"       // true (égal avec conversion)
45 === "45"      // false (types différents)
45 !== 50        // true (différent de)
cpu > 80         // true si cpu vaut 85
ram <= 90        // true si ram vaut 90 ou moins

Conseil : Utilise toujours === et !== (comparaison stricte).

Opérateurs logiques

// ET logique (&&) : les DEUX conditions doivent être vraies
if (cpu > 80 && ram > 80) {
    console.log("Alerte critique !");
}

// OU logique (||) : AU MOINS UNE condition doit être vraie
if (cpu > 80 || ram > 80) {
    console.log("Serveur en alerte");
}

// NON logique (!) : inverse le booléen
if (!estEnLigne) {
    console.log("Serveur hors ligne");
}

2 Les Tableaux (Arrays)

Un tableau est une liste ordonnée d'éléments.

Créer et accéder aux éléments

const logs = ["Error 404", "Warning", "Info"];

console.log(logs[0]);    // "Error 404" (premier élément, index 0)
console.log(logs[1]);    // "Warning"
console.log(logs.length); // 3 (nombre d'éléments)

Important : Les index commencent à 0, pas à 1 !

Méthodes de base (mutation du tableau)

Ces méthodes modifient le tableau directement :

const messages = [];

// Ajouter à la fin
messages.push("Nouveau log");
// Résultat : ["Nouveau log"]

// Ajouter au début
messages.unshift("Log prioritaire");
// Résultat : ["Log prioritaire", "Nouveau log"]

// Retirer le dernier élément
const dernier = messages.pop();
// Résultat : messages = ["Log prioritaire"]

// Retirer le premier élément
const premier = messages.shift();
// Résultat : messages = []

Méthode .filter() - Filtrer des éléments

Objectif : Créer un nouveau tableau contenant uniquement les éléments qui respectent une condition.

const serveurs = [
    { id: "srv-01", cpu: 45, status: "online" },
    { id: "srv-02", cpu: 85, status: "online" },
    { id: "srv-03", cpu: 12, status: "offline" }
];

// Garder seulement les serveurs online
const serveursOnline = serveurs.filter(serveur => serveur.status === "online");
// Résultat : [srv-01, srv-02]

// Garder seulement ceux avec CPU > 80%
const alertes = serveurs.filter(serveur => serveur.cpu > 80);
// Résultat : [srv-02]

Syntaxe décortiquée :

// serveur => serveur.status === "online"
// ↑ paramètre  ↑ condition qui retourne true ou false

Méthode .map() - Transformer des éléments

Objectif : Créer un nouveau tableau en transformant chaque élément.

const serveurs = [
    { id: "srv-01", cpu: 45 },
    { id: "srv-02", cpu: 85 }
];

// Extraire juste les IDs
const ids = serveurs.map(serveur => serveur.id);
// Résultat : ["srv-01", "srv-02"]

// Doubler toutes les valeurs CPU
const cpuDoubles = serveurs.map(serveur => serveur.cpu * 2);
// Résultat : [90, 170]

Méthode .reduce() - Réduire à une seule valeur

Objectif : Condenser un tableau en une seule valeur (somme, moyenne, etc.).

const valeurs = [10, 20, 30, 40];

// Calculer la somme
const somme = valeurs.reduce((accumulateur, valeur) => {
    return accumulateur + valeur;
}, 0);  // 0 = valeur initiale de l'accumulateur
// Résultat : 100

// Étape par étape :
// 1. accumulateur = 0, valeur = 10 → retourne 0 + 10 = 10
// 2. accumulateur = 10, valeur = 20 → retourne 10 + 20 = 30
// 3. accumulateur = 30, valeur = 30 → retourne 30 + 30 = 60
// 4. accumulateur = 60, valeur = 40 → retourne 60 + 40 = 100

Calcul de moyenne :

const cpuValues = [45, 85, 95];
const moyenne = cpuValues.reduce((acc, val) => acc + val, 0) / cpuValues.length;
// Résultat : 75

3 Les Objets JavaScript

Un objet est une collection de propriétés (clé-valeur).

const serveur = {
    id: "srv-01",
    cpu: 45,
    ram: 60,
    status: "online"
};

// Accéder aux propriétés
console.log(serveur.id);       // "srv-01"
console.log(serveur["cpu"]);   // 45 (notation alternative)

// Modifier une propriété
serveur.cpu = 50;

// Ajouter une nouvelle propriété
serveur.region = "eu-west-1";

4 Les Fonctions

Une fonction est un bloc de code réutilisable.

Déclaration classique

function calculerMoyenne(valeurs) {
    const somme = valeurs.reduce((acc, val) => acc + val, 0);
    return somme / valeurs.length;
}

const moyenne = calculerMoyenne([10, 20, 30]);
console.log(moyenne);  // 20

Fonction fléchée (Arrow function)

Syntaxe plus courte, très utilisée avec .map(), .filter(), .reduce() :

// Fonction classique
function doubler(x) {
    return x * 2;
}

// Fonction fléchée équivalente
const doubler = (x) => {
    return x * 2;
};

// Version ultra-courte (si une seule instruction)
const doubler = x => x * 2;

5 Les Boucles

Boucle for classique

for (let i = 0; i < 5; i++) {
    console.log("Itération numéro " + i);
}
// Affiche : 0, 1, 2, 3, 4

Décortiqué :

  • let i = 0 : Initialisation
  • i < 5 : Condition de continuation
  • i++ : Incrémentation (ajoute 1 à i)

Boucle for...of (parcourir un tableau)

const serveurs = ["srv-01", "srv-02", "srv-03"];

for (const serveur of serveurs) {
    console.log(serveur);
}
// Affiche : srv-01, srv-02, srv-03

6 Les Expressions Régulières (Regex)

Les regex permettent de chercher et extraire des motifs dans du texte.

Syntaxe de base

const regex = /motif/;

Symboles importants

Symbole Signification Exemple
\d Un chiffre (0-9) \d+ = un ou plusieurs chiffres
\w Lettre, chiffre ou _ \w+ = un ou plusieurs caractères
\s Espace blanc \s = un espace
+ 1 ou plusieurs fois \d+ = au moins un chiffre
* 0 ou plusieurs fois \d* = zéro ou plus chiffres
( ) Groupe de capture (\d+) = capture les chiffres

Méthode .test() - Vérifier une présence

const log = "ERROR: Connection failed";
const contientErreur = /ERROR/.test(log);
console.log(contientErreur);  // true

Méthode .match() - Extraire des valeurs

const config = "DB_PORT=5432";
const regex = /DB_PORT=(\d+)/;
const match = config.match(regex);

if (match) {
    console.log(match[0]);  // "DB_PORT=5432" (toute la correspondance)
    console.log(match[1]);  // "5432" (premier groupe capturé)
    
    const port = Number(match[1]);  // Convertir en nombre
    console.log(port);  // 5432
}

Exemple pratique :

const texte = "L'utilisateur ID:12345 s'est connecté";
const regex = /ID:(\d+)/;
const resultat = texte.match(regex);

if (resultat) {
    const userId = resultat[1];  // "12345"
    console.log("User ID trouvé :", userId);
}

Méthode .split() - Découper une chaîne

const config = "DB_HOST=localhost;DB_PORT=5432;DB_USER=admin";

// Découper par ";"
const parties = config.split(";");
// Résultat : ["DB_HOST=localhost", "DB_PORT=5432", "DB_USER=admin"]

7 Exécuter du Code avec Docker

Pourquoi Docker ?

Docker garantit que ton code s'exécute dans le même environnement partout (sur ton PC, celui du prof, en production).

Structure d'un projet

mon-tp/
  ├── exercice1.js
  ├── exercice2.js
  └── exercice3.js

Commande d'exécution

Ouvre un terminal dans le dossier de ton projet et tape :

docker container run -it --rm -v $(pwd):/home/node/app -w /home/node/app node:current-alpine3.23 node exercice1.js

Décortiqué :

  • docker container run : Lance un conteneur
  • -it : Mode interactif
  • --rm : Supprime le conteneur après exécution
  • -v $(pwd):/home/node/app : Monte le dossier courant dans le conteneur
  • -w /home/node/app : Définit le dossier de travail
  • node:current-alpine3.23 : Image Docker (Node.js)
  • node exercice1.js : Commande à exécuter

Version simplifiée pour Windows PowerShell :

docker container run -it --rm -v ${PWD}:/home/node/app -w /home/node/app node:current-alpine3.23 node exercice1.js

🎓 Concepts Essentiels à Retenir

1. Chaînage de méthodes

Tu peux combiner plusieurs méthodes :

const serveurs = [
    { id: "srv-01", cpu: 45, status: "online" },
    { id: "srv-02", cpu: 85, status: "online" },
    { id: "srv-03", cpu: 12, status: "offline" }
];

const cpuMoyen = serveurs
    .filter(s => s.status === "online")  // Garde les online
    .map(s => s.cpu)                      // Extrait les CPU
    .reduce((acc, cpu) => acc + cpu, 0)   // Somme
    / serveurs.filter(s => s.status === "online").length;  // Divise par le nombre

console.log(cpuMoyen);  // 65

2. Conditions ternaires (raccourci if/else)

const status = cpu > 80 ? "Alerte" : "OK";

// Équivalent à :
let status;
if (cpu > 80) {
    status = "Alerte";
} else {
    status = "OK";
}

3. Template strings (interpolation)

const serveur = "srv-01";
const cpu = 85;

// Ancien style
console.log("Serveur " + serveur + " a un CPU de " + cpu + "%");

// Nouveau style (avec backticks ` `)
console.log(`Serveur ${serveur} a un CPU de ${cpu}%`);

4. Déstructuration

const serveur = { id: "srv-01", cpu: 45, ram: 60 };

// Extraire des propriétés
const { id, cpu } = serveur;
console.log(id);   // "srv-01"
console.log(cpu);  // 45

🔧 Exemples Pratiques DevOps

Exemple 1 : Filtrer les alertes

const serveurs = [
    { id: "srv-01", cpu: 45, ram: 60 },
    { id: "srv-02", cpu: 85, ram: 90 },
    { id: "srv-03", cpu: 95, ram: 88 }
];

// Trouver tous les serveurs en alerte (CPU > 80 OU RAM > 80)
const alertes = serveurs.filter(s => s.cpu > 80 || s.ram > 80);
console.log(alertes);
// Résultat : [srv-02, srv-03]

Exemple 2 : Calculer la moyenne CPU

const serveurs = [
    { id: "srv-01", cpu: 45 },
    { id: "srv-02", cpu: 85 },
    { id: "srv-03", cpu: 95 }
];

const totalCpu = serveurs.reduce((acc, s) => acc + s.cpu, 0);
const moyenne = totalCpu / serveurs.length;
console.log(`CPU moyen : ${moyenne}%`);
// Résultat : CPU moyen : 75%

Exemple 3 : Parser une configuration

const config = "DB_HOST=localhost;DB_PORT=5432;DB_USER=admin";

const pairs = config.split(";");  // ["DB_HOST=localhost", ...]

const configObj = {};
for (const pair of pairs) {
    const [key, value] = pair.split("=");  // Sépare par "="
    
    // Si c'est un nombre, le convertir
    configObj[key] = isNaN(value) ? value : Number(value);
}

console.log(configObj);
// { DB_HOST: "localhost", DB_PORT: 5432, DB_USER: "admin" }