Reduzieren Sie die Java / Maven-Erstellungszeit mit Nexus 3 in der OpenShift (okd 3.11) DevOps-Umgebung

image

Kurz gesagt (TL; DR;)

image

Ärger

Hallo! Das ist Ishida. Ich erstelle derzeit eine Demo-Umgebung für OpenShift DevOps, aber Java / Maven-Builds sind langsam. .. Insbesondere wenn eine Java-Anwendung in einem OpenShift-Container in Maven erstellt wird, der durch eine Quelländerung ausgelöst wird **, wird der Container bei jeder Erstellung neu erstellt, sodass kein Maven-Cache vorhanden ist. Infolgedessen werden sowohl der erste Build als auch der zweite und die nachfolgenden Builds aus dem Maven-Repository im Internet heruntergeladen, was eine beträchtliche Zeit in Anspruch nimmt. ** ** **

Dies ist ein supereinfacher Servlet-Build, der jedoch jedes Mal etwa 60 Sekunden dauert, unabhängig davon, wie oft ich es versuche.

SimpleServlet.java


package my;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class SimpleServlet
 */
@WebServlet("/*")
public class SimpleServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().print("<h1><font color=green>Simple Servlet ran successfully</font></h1>"
                                   + "Powered by WebSphere Application Server Liberty Profile");
    }

}

image

Da beim Starten des neuen Containers (Pod) kein Cache ($ home / .m2 / repository) vorhanden ist, wird dieser wie folgt endlos von repo.maven.apache.org heruntergeladen.

Beispiel für ein Ausführungsprotokoll


[INFO] ------------------------< SimpleApp:SimpleApp >-------------------------
[INFO] Building SimpleApp 1.0
[INFO] --------------------------------[ war ]---------------------------------
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plugin-2.6.pom 
Progress (1): 2.2/8.1 kBProgress (1): 5.0/8.1 kBProgress (1): 7.8/8.1 kBProgress (1): 8.1 kB                        Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plugin-2.6.pom  (8.1 kB at 4.4 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/23/maven-plugins-23.pom 
Progress (1): 2.2/9.2 kBProgress (1): 5.0/9.2 kBProgress (1): 7.8/9.2 kBProgress (1): 9.2 kB                        Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/23/maven-plugins-23.pom  (9.2 kB at 48 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/22/maven-parent-22.pom 
.....

: warning: Nur für den Fall, in diesem Artikel geht es darum, Maven auf OpenShift in der DevOps-Pipeline zu erstellen. Mit anderen Worten, wenn s2i nicht verwendet wird = Maven Build from Source wird außerhalb von OpenShift ausgeführt (= kurz, normale Betriebssystembefehlsumgebung usw.), um eine War / Ear-Datei zu erstellen, und War / Ear wird in OpenShift platziert (kopiert). Wenn Sie dies nur tun, funktioniert der normale Maven-Cache, sodass es kein Problem gibt.

Ein Plan zur Reduzierung der Ausführungszeit von Maven Build

Zunächst wird im Allgemeinen im Normalfall (= nicht in einer Containerumgebung) der Inhalt unter $ home / .m2 / repository zwischengespeichert, wenn der erste MVN-Build ausgeführt wird, und der Cache wird ab dem zweiten Mal referenziert. Die Bauzeit wird reduziert.

1. Speichern und wiederherstellen Sie .m2 mithilfe des inkrementellen Build-Mechanismus von s2i

Wenn Sie dasselbe durch eine Containerumgebung ersetzen, speichern Sie zuerst .m2 in Sicherungsartefakten mit s2i build (inkrementell). Es ist möglich, es ab dem zweiten Mal wiederherzustellen. Ein Beispiel ist hier. Diese Methode ist jedoch nicht gut, da Sie das s2i-Skript selbst implementieren müssen. Wenn Sie mehrere Builds haben, müssen Sie jedes einzeln implementieren.

2. Stellen Sie Nexus 3 als Maven-Proxy unter OpenShift bereit

Eine einfachere und flexiblere Möglichkeit ist die Verwendung des von Sonatype unter OSS bereitgestellten Repository-Managers Nexus3. Nexus3 ist ein Repository-Manager und kann für verschiedene Zwecke verwendet werden, z. B. zum Ersetzen der Docker-Registrierung sowie von Maven. Standardmäßig verfügt es jedoch über die Maven-Proxy-Funktion. Da das Container-Image auf Dockerhub veröffentlicht wird, ist es sehr einfach, es unter OpenShift bereitzustellen. Wenn Sie Nexus3 als Referenz-Repository für Java / Maven-Builds auf OpenShift angeben, wird zum ersten Mal über den Nexus3 Maven-Proxy auf das Maven-Repository im Internet zugegriffen, die Ressourcen werden jedoch auf der Nexus3-Seite zwischengespeichert. Daher treffen Maven-Ressourcen im zweiten und den folgenden Builds auf den Nexus 3-Cache, wodurch die Build-Zeit verkürzt wird.

Kurz gesagt, wenn Sie ein MVN-Paket in einem neuen Container (Pod) in OpenShift ausführen

① Standardmäßig erfolgt der Download jedes Mal ② Wenn Nexus3 betrieben wird, wird es zum ersten Mal heruntergeladen, aber zwischengespeichert. ③ Der Cache wird im zweiten und nachfolgenden Build getroffen, wenn Nexus3 ausgeführt wird (daher wird er nicht heruntergeladen).

image

Ich versuchte es

Das Verfahren zum Einrichten und Verwenden von Nexus 3 ist unten dargestellt.

Beachten

Umgebung

--OKD 3.11 (unter Ubuntu 18.04), das unter IBM Cloud (IaaS) ausgeführt wird - All-in-One-Konfiguration wurde mit aktivem OC-Cluster gestartet

Bereitstellen eines Nexus 3-Images für OpenShift

image

Das obige Bild wird auf Dockerhub veröffentlicht, sodass Sie es mit dem Befehl oc problemlos für OpenShift bereitstellen können.

Melden Sie sich an und erstellen Sie ein neues Projekt. Stellen Sie dann das Sonatype / Nexus3-Image bereit, um Dienste und Routen zu erstellen.

So stellen Sie nexus3 bereit


oc login -u developer -p dummy
oc new-project nexus3
oc new-app sonatype/nexus3
oc expose svc/nexus3

Es ist in Ordnung, wenn die Route (http://nexus3-nexus3.162.133.79.188.nip.io im obigen Beispiel) im oc-Status erstellt wird.

oc_status


handson01@devops01:~$ oc status
In project nexus3 on server https://162.133.79.188:8443

http://nexus3-nexus3.162.133.79.188.nip.io to pod port 8081-tcp (svc/nexus3)
  dc/nexus3 deploys istag/nexus3:latest
    deployment #1 deployed 2 minutes ago - 1 pod

2 infos identified, use 'oc status --suggest' to see details.

Pod läuft auf der Verwaltungskonsole, nicht wahr?

image

Next3-Setup

Erhalten eines Administratorkennworts

Melden Sie sich anschließend als Administrator (Administrator) bei der Nexus 3-Konsole an, um sie einzurichten. Zuvor müssen Sie jedoch das Administratorkennwort abrufen.

Gemäß der Site-Beschreibung von sonatype / nexus3 wird das Passwort in die Datei ** admin.password ** geschrieben.

Notes: Default user is admin and the uniquely generated password can be found in the admin.password file inside the volume. See Persistent Data for information about the volume.

Verwenden Sie das oben beschriebene Verfahren, um den Pod-Namen zu identifizieren, melden Sie sich mit oc rsh beim Pod an und überprüfen Sie dann den Inhalt von ** / nexus-data / admin.password **, um das Passwort zu erhalten. [^ 1]

handson01@devops01:~$ oc get pods
NAME             READY     STATUS    RESTARTS   AGE
nexus3-1-45rpz   1/1       Running   0          2m
handson01@devops01:~$ oc rsh nexus3-1-45rpz
sh-4.4$ find / -name admin.password
find: '/var/cache/ldconfig': Permission denied
find: '/var/lib/private': Permission denied
find: '/var/lib/portables': Permission denied
find: '/lost+found': Permission denied
find: '/proc/tty/driver': Permission denied
/nexus-data/admin.password
sh-4.4$ cat /nexus-data/admin.password
6a37dec6-fc57-41c8-87ac-***********sh-4.4$

[^ 1]: admin.password wird anscheinend erst ca. 5-10 Sekunden nach dem Start des Pods generiert. Wenn Sie es also nicht finden können, warten Sie eine Weile und versuchen Sie es erneut.

Der gleiche Vorgang kann mit Pods-Terminal über die OpenShift-Verwaltungskonsole ausgeführt werden.

image

Melden Sie sich bei der Nexus 3-Verwaltungskonsole an

Gehen Sie zu der im Stammverzeichnis angegebenen URL (z. B. http://nexus3-nexus3.162.133.79.188.nip.io), öffnen Sie die Nexus 3-Administratorkonsole und klicken Sie oben rechts auf "Anmelden"

image

Geben Sie den Benutzer als Administrator und das zuvor erhaltene Passwort als "Anmelden" ein. image

Setup-Assistent

Der Assistent für die Ersteinrichtung wird gestartet. Klicken Sie daher auf "Weiter". image

Ändern Sie zunächst das ursprüngliche Passwort und klicken Sie auf "Weiter". image

Geben Sie an, ob anonymer Zugriff zugelassen werden soll. Dieses Mal dient es zum Zwischenspeichern des öffentlichen maven2-Repositorys, ist also nicht vertraulich. Aktivieren Sie daher "Anonymen Zugriff aktivieren" und klicken Sie auf "Weiter". image

Das ist es. image

Holen Sie sich die Maven Proxy URL

Rufen Sie die URL des Repositorys ab, die beim Ausführen des Maven-Pakets angegeben werden soll.

Klicken Sie in der Liste der unter "Zahnradmarke (Serververwaltung und -konfiguration)" - "Repository" - "Repositorys" oben in der Konsole angezeigten Repositorys auf ** maven-central **

image

Der Speicherort der URL ist die URL, auf die in Maven verwiesen werden soll.

image

Spezifikation zum Zeitpunkt des Maven Builds

Nachdem Nexus 3 einsatzbereit ist, geben Sie die URL an, die beim Erstellen mit Maven auf den Nexus 3 Maven-Proxy (anstelle des Standard-repo.maven.apache.org) als Repository verweist. Geben Sie insbesondere die Benutzereinstellungsdatei mit -s nexus-settings.xml [^ 2] an, wenn Sie mit dem mvn-Paket wie unten gezeigt erstellen.

[^ 2]: -s, --settings Bedeutung des alternativen Pfads für die Benutzereinstellungsdatei

Spezifikationsbeispiel in s2i zusammenstellen


mvn package -s nexus-settings.xml
cp -f target/*.war /config/dropins/

Der Inhalt der Benutzereinstellungsdatei lautet wie folgt und die URL wird an drei Stellen neu geschrieben. [^ 3] Für die Beschreibung habe ich auf den Artikel verwiesen: Zeitung: OpenShift Nexus.

[^ 3]: Sie müssen keinen Benutzernamen und kein Kennwort angeben, da Sie den anonymen Zugriff im Nexus 3-Einstellungsassistenten aktiviert haben.

nexus-settings.xml


<settings>
    <servers>
        <server>
            <id>nexus</id>
            <!-- username>admin</username -->
            <!-- password>password</password -->
        </server>
    </servers>
    <mirrors>
        <mirror>
            <id>nexus</id>
            <mirrorOf>*</mirrorOf>
            <url>http://nexus3-nexus3.162.133.79.188.nip.io/repository/maven-central/</url>
        </mirror>
    </mirrors>
    <profiles>
        <profile>
            <id>nexus</id>
            <!--Enable snapshots for the built in central repo to direct -->
            <!--all requests to nexus via the mirror -->
            <repositories>
                <repository>
                    <id>central</id>
                    <url>http://nexus3-nexus3.162.133.79.188.nip.io/repository/maven-central/</url>
                    <releases><enabled>true</enabled></releases>
                    <snapshots><enabled>true</enabled></snapshots>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <id>central</id>
                    <url>http://nexus3-nexus3.162.133.79.188.nip.io/repository/maven-central/</url>
                    <releases><enabled>true</enabled></releases>
                    <snapshots><enabled>true</enabled></snapshots>
                </pluginRepository>
            </pluginRepositories>
        </profile>
    </profiles>
    <activeProfiles>
        <activeProfile>nexus</activeProfile>
    </activeProfiles>
</settings>

Ergebnis

Wenn Sie den Maven-Build erneut ausführen, nachdem Sie das oben Gesagte angegeben haben, dauert das Herunterladen beim ersten Mal mehr als 60 Sekunden. Nach dem zweiten Mal funktioniert der Cache und der Build ist in etwa 15 Sekunden abgeschlossen!

image

Sie können sehen, dass sich das Pod-Build-Protokoll auch auf Nexus 3 bezieht. (Herunterladen vom Nexus: ~)

[INFO]
[INFO] ------------------------< SimpleApp:SimpleApp >-------------------------
[INFO] Building SimpleApp 1.0
[INFO] --------------------------------[ war ]---------------------------------
Downloading from nexus: http://nexus3-nexus3.162.133.79.188.nip.io/repository/maven-central/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plugin-2.6.pom 
Progress (1): 4.1/8.1 kBProgress (1): 7.7/8.1 kBProgress (1): 8.1 kB                        Downloaded from nexus: http://nexus3-nexus3.162.133.79.188.nip.io/repository/maven-central/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plugin-2.6.pom  (8.1 kB at 43 kB/s)
Downloading from nexus: http://nexus3-nexus3.162.133.79.188.nip.io/repository/maven-central/org/apache/maven/plugins/maven-plugins/23/maven-plugins-23.pom 
Progress (1): 4.1/9.2 kBProgress (1): 7.8/9.2 kBProgress (1): 9.2 kB                        Downloaded from nexus: http://nexus3-nexus3.162.133.79.188.nip.io/repository/maven-central/org/apache/maven/plugins/maven-plugins/23/maven-plugins-23.pom  (9.2 kB at 766 kB/s)
...

abschließend

Der Maven-Proxy von Nexus 3 in einer OpenShift-Umgebung ist sehr einfach bereitzustellen und zu konfigurieren und kann dazu beitragen, die Maven-Erstellungszeit beim Erstellen einer DevOps-Pipeline für Java-Anwendungen zu verkürzen. Bitte versuche. Sie können Nexus 3 auch zum Erstellen einer privaten Docker-Image-Registrierung verwenden. OpenShift wird standardmäßig mit einer eigenen Image-Registrierung geliefert, daher ist dies möglicherweise nicht erforderlich, es ist jedoch eine gute Idee, dies als Alternative zu berücksichtigen. das ist alles.

Recommended Posts

Reduzieren Sie die Java / Maven-Erstellungszeit mit Nexus 3 in der OpenShift (okd 3.11) DevOps-Umgebung
CICS-Java-Anwendung ausführen- (2) Build-Management mit Maven
Erstellen Sie eine E2E-Testumgebung mit Selenium (Java).
Erstellen Sie eine Java-Entwicklungsumgebung mit VS Code
Erstellen Sie eine Java-Entwicklungsumgebung mit VS Code auf dem Mac
Maven schlägt in der Java7-Umgebung fehl (schwerwiegende Warnung erhalten: protocol_version)
[Hinweis] Erstellen Sie eine Python3-Umgebung mit Docker in EC2
So erstellen Sie eine Java-Entwicklungsumgebung mit VS Code
Erstellen Sie eine Java-Programmentwicklungsumgebung mit Visual Studio Code
Erstellen Sie Java mit Wercker
Zip-Komprimierung, die in einer Java-Umgebung nicht beeinträchtigt wird
Erstellen Sie mit Java + Spring eine Web-APP-Entwicklungsumgebung mit Visual Studio Code
JavaFX-Umgebungskonstruktion in Java 13
Erstellen einer Docker-Umgebung mit WSL