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
Inhaltsverzeichnis Probleme, die Redux Toolkit lö...
In diesem Artikelbeispiel wird der spezifische Co...
CPU-Last und CPU-Auslastung Beides kann bis zu ei...
Dieser Artikel beschreibt anhand eines Beispiels ...
In diesem Artikel erfahren Sie, wie Sie Kylin auf...
Inhaltsverzeichnis 1. Projektbeschreibung 1.1 Hin...
Inhaltsverzeichnis 1. Einleitung 2. MVCC (Multi-V...
1. Unlink-Funktion Bei Hardlinks wird mit „unlink...
Inhaltsverzeichnis Tomcat mit Docker installieren...
Inhaltsverzeichnis 1. Einfügen der abgefragten Er...
Das Projekt interagiert mit dem Server, greift üb...
Das neueste Tutorial zur Installation von MySQL 8...
Vorwort Es ist sehr einfach, einen Server in node...
Inhaltsverzeichnis Natives JS So senden Sie eine ...
In diesem Artikel wird der spezifische Code von j...