Der Autor arbeitet seit über einem Jahr an einem Micro-Frontend-Projekt. Ein Team verwaltet zehn Mikroanwendungen. Nach der Umstellung auf die Bereitstellung von Docker-Images hat sich der Release-Vorgang von 1 Minute, wenn das ursprüngliche Skript direkt eine Verbindung zum Server herstellt, auf Dutzende von Minuten geändert, insbesondere beim Hochladen jeder Anwendung in ihr jeweiliges Alibaba Cloud-Lager. Hier schreiben wir ein weiteres Skript, um das Docker-Image mit einem Klick zu verpacken und in die Alibaba Cloud hochzuladen. In diesem Artikel wird nur darüber gesprochen, wie man ein Skript erstellt, um die Belastung der Entwickler zu verringern. Informationen zur Konfiguration von Docker-Compose finden Sie unter: Bequemes Bereitstellen von Micro-Frontend-Projekten mithilfe verschiedener Haltungen (Teil 1: Verpacken und Hochladen) RendernDirekt auf dem Code/** * @name Docker-Image-Verpackungs- und Upload-Skript * @author weilan * @Zeit 2021.02.22 */ const fs = erfordern('fs'); const path = require('Pfad'); const util = erfordern('util'); const { log } = erfordern('../utils/log'); const exec = util.promisify(require('child_process').exec); const sub_app_ath = Pfad.resolve(); let sub_apps = fs.readdirSync(sub_app_ath).filter(i => /^subapp|master/.test(i)); const inquirer = require('inquirer'); // Für Befehlszeileninteraktion/** * @name Konfigurationselement für die Befehlszeileninteraktion*/ const Frage = [ { Typ: 'bestätigen', Name: "dist", Nachricht: ,,Müssen Sie die statischen Front-End-Ressourcen verpacken? ', }, { Typ: 'bestätigen', Name: "Umgebung", Meldung: „Bitte wählen Sie aus, ob Sie es für die Offline-Intranet-Bereitstellung verpacken müssen“, wann: Funktion (Antworten) { // Die aktuelle Frage wird nur gestellt, wenn die Antwort wahr ist. returniere Antworten.dist } }, { Typ: 'Kontrollkästchen', Name: "Apps", Meldung: 'Bitte wählen Sie das zu veröffentlichende Modul aus', Auswahlmöglichkeiten: Unteranwendungen, validieren: Funktion (Wert) { if (val.length) { // prüfen return true; } return "Die Auswahl darf nicht leer sein"; } }, ] /** * @name Führen Sie eine logische Verarbeitung basierend auf den Ergebnissen der Befehlsinteraktionskonfiguration durch*/ inquirer.prompt(Frage).dann(async (Antwort) => { Lassen Sie subApps = Antwort.apps; let buildScript = answer.env ? 'Garn-Build – Intranet': 'Garn-Build'; sei needDist = answer.dist; lass jetzt = +neues Datum(); // Bei Alibaba Cloud anmelden const { error: loginError } = await exec('docker login --username=Benutzername--password=Registrierung.cn-zhangjiakou.aliyuncs.com'); if (Anmeldefehler) { log.red(loginError, 'Anmeldung zum Spiegelcenter fehlgeschlagen') zurückkehren; } console.log(`Starten Sie die Verarbeitung von ${JSON.stringify(subApps)} in der Reihenfolge ......`); subApps.reduce((Kette, Element) => { returniere chain.then(() => publishIamge(item, now, needDist, buildScript)) }, Versprechen.auflösen()) }); /** * @name Verpacke das Image und pushe es in die Alibaba Cloud* @param {String} moduleName Modulname* @param {String} now Zeitstempel der aktuellen Version* @param {Boolean} needDist Gibt an, ob die statischen Front-End-Ressourcen gepackt werden sollen* @param {String} buildScript Befehl zum Packen statischer Front-End-Ressourcen*/ asynchrone Funktion publishIamge(Modulname, jetzt, needDist, BuildScript) { //Paket statische Front-End-Ressourcen if (needDist) { console.log('Beginnen Sie mit dem Verpacken statischer Front-End-Ressourcen' + moduleName); const { Fehler } = warte auf exec(BuildScript, { cwd: Pfad.Resolve(Modulname) }); if (Fehler) { log.red(Modulname, 'Fehler beim Packen des Frontend-Codes:', Fehler) zurückkehren; } log.green(Modulname + 'Frontend-Code erfolgreich gepackt') } // Abbild verpacken console.log(`Starten Sie das Verpacken des Abbilds ${moduleName} ......`); const { stdout: buildStdout, Fehler: buildError } = warte auf exec('docker-compose build ' + Modulname); wenn (Build-Fehler) { log.red(buildError, 'Fehler beim Spiegelpaketieren') zurückkehren; } log.cyan(buildStdout) log.green('Bildverpackung abgeschlossen, beginnen Sie mit der Erstellung von Bild-Tags') // Image-Tag aktualisieren const imageName = 'ibp2fe_' + moduleName; const { Fehler: tagError } = warte auf exec(`Docker-Tag ${imageName} registry.cn-zhangjiakou.aliyuncs.com/futureweb/${imageName}:${now}`); wenn (tagError) { log.red(tagError, 'Ausnahme Spiegeltag') zurückkehren; } log.green('Tag der Spiegelversion aktualisiert, mit der Aktualisierung des letzten Tags beginnen') // Aktualisiere die letzte Version des Image-Tags const { error: tagLastError } = await exec(`docker tag ${imageName} registry.cn-zhangjiakou.aliyuncs.com/futureweb/${imageName}`); if (tagLetzterFehler) { log.red(tagError, 'Ausnahme letztes Tag spiegeln') zurückkehren; } log.green('Zuletzt aktualisiertes Tag spiegeln, Hochladen starten') const { stdout: pushStdout, Fehler: pushError } = warte auf exec('docker push registry.cn-zhangjiakou.aliyuncs.com/futureweb/' + imageName); wenn (pushError) { log.red(pushError, 'Bild-Upload fehlgeschlagen') zurückkehren; } log.cyan(pushStdout) log.green('Bild-Upload erfolgreich') } Prozess.Ein('unbehandelteAblehnung', (Grund, p) => { console.log('Unbehandelte Ablehnung bei: Promise', p, 'Grund:', Grund); // anwendungsspezifisches Logging, Auslösen eines Fehlers oder andere Logik hier }); Umsetzungsideen und Vorsichtsmaßnahmen
Hier ist ein Punkt zu beachten. Da dies von Toolfunktionen gehandhabt wird, wird der Pfad jedes Moduls von Knoten gelesen, sodass Ihr Modulname mit dem Dienstnamen und dem Containernamen in docker-compose.yml übereinstimmen muss. Beachten Sie außerdem, dass nach dem Verpacken Ihres Images der Unterstrich des Stammverzeichnisses außerhalb Ihrer docker-compose.yml mit Ihrem Docker-Compose-Dienstnamen verbunden ist, sodass Ihr Alibaba Cloud-Image-Repository einen Namen haben sollte, der mit dem kombinierten Imagenamen übereinstimmt. Das Obige soll der Toolfunktion die universelle Handhabung der Images verschiedener Module erleichtern.
Das könnte Sie auch interessieren:
|
<<: HTML-Codebeispiel: Detaillierte Erklärung von Hyperlinks
>>: Detaillierte Erklärung der Semiotik in Html/CSS
Hintergrund Temporäre Tablespaces werden verwende...
Installation und Konfiguration von MySQL8.0.22 (s...
In diesem Artikel erfahren Sie, wie Sie mit think...
Überblick Das Prototypmuster bezieht sich auf den...
Vorwort Für das Projekt ist ein kreisförmiges Men...
1. Commonjs Commonjs ist ein benutzerdefiniertes ...
MySQL-Vollsicherung 1. Aktivieren Sie das Binärpr...
Als PHP7 herauskam, habe ich als Fan der neuesten...
1. Prinzip des Hotlinking 1.1 Vorbereitung der We...
Frage: Nach dem Neustart des Computers kann der M...
Vorwort Standardmäßig initialisiert MySQL einen g...
Warum habe ich das verwendet? Alles begann mit de...
Wenn wir Frontend-Entwicklung betreiben, werden w...
Inhaltsverzeichnis 2. Komma-Operator 3. JavaScrip...
In diesem Artikel wird die MySQL-Datenbank-übergr...