Réduisez le temps de construction de Java / Maven avec Nexus 3 dans l'environnement DevOps OpenShift (okd 3.11)

image

En bref (TL; DR;)

image

difficulté

salut! C'est Ishida. Je crée actuellement un environnement de démonstration pour OpenShift DevOps, mais les versions Java / Maven sont lentes. .. Plus précisément, lorsqu'une application Java est construite par Maven avec un conteneur sur OpenShift déclenché par un changement de source **, le conteneur est nouvellement créé à chaque fois qu'il est construit, il n'y a donc pas de cache Maven. En conséquence, la première version et la deuxième version et les versions suivantes seront téléchargées à partir du référentiel Maven sur Internet, ce qui prendra un temps considérable. ** **

Ceci est une construction de servlet super simple, mais cela prend environ 60 secondes à chaque fois, peu importe le nombre de fois que je l'essaie.

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

Puisqu'il n'y a pas de cache ($ home / .m2 / repository) lorsque le nouveau conteneur (Pod) est démarré, il est téléchargé à l'infini depuis repo.maven.apache.org comme suit.

Exemple de journal d'exécution


[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 
.....

: avertissement: Juste au cas où, cet article concerne ** la construction de Maven sur OpenShift ** dans le pipeline DevOps **. En d'autres termes, lorsque s2i n'est pas utilisé = la construction Maven à partir des sources est exécutée en dehors d'OpenShift (= en bref, l'environnement de commande normal du système d'exploitation, etc.) pour créer un fichier war / ear, et war / ear est placé (copie) dans OpenShift. Si vous faites juste), le cache Maven normal fonctionnera, donc il n'y a pas de problème.

Un plan pour réduire le temps d'exécution de maven build

Tout d'abord, en termes généraux, dans le cas normal (= pas dans un environnement conteneur), le contenu est mis en cache sous $ home / .m2 / repository lorsque la première build mvn est exécutée, et le cache est référencé à partir de la deuxième fois. Le temps de construction est réduit.

1. Stockez et restaurez .m2 vous-même en utilisant le mécanisme de construction incrémentielle de s2i

Si vous remplacez la même chose par un environnement de conteneur, enregistrez d'abord .m2 dans save-artifacts en utilisant s2i build --incremental). Il est possible de le restaurer à partir de la deuxième fois. Un exemple est ici. Cependant, cette méthode n'est pas bonne car vous devez implémenter vous-même le script s2i et si vous avez plusieurs versions, vous devez les implémenter individuellement.

2. Déployez Nexus 3 en tant que proxy Maven sur OpenShift

Un moyen plus simple et plus flexible consiste à utiliser le gestionnaire de référentiel Nexus3 fourni par Sonatype sur OSS. Nexus3 est un gestionnaire de référentiel et peut être utilisé à diverses fins telles que le remplacement du registre Docker ainsi que Maven, mais par défaut, il a la fonction de proxy Maven. Étant donné que l'image du conteneur est publiée sur Dockerhub, il est très facile de la déployer sur OpenShift. Si vous spécifiez Nexus3 comme référentiel de référence lors de la création de Java / Maven sur OpenShift, le référentiel Maven sur Internet sera accessible pour la première fois via le proxy Maven de Nexus3, mais les ressources seront mises en cache du côté Nexus3. Par conséquent, dans la deuxième génération et les versions suivantes, les ressources Maven atteindront le cache du Nexus 3, réduisant le temps de construction.

En bref, lors de l'exécution du package mvn dans un nouveau conteneur (Pod) dans OpenShift

① Par défaut, le téléchargement a lieu à chaque fois ② Lorsque Nexus3 est utilisé, il sera téléchargé pour la première fois, mais il sera mis en cache. ③ Le cache sera atteint dans la deuxième version et les versions suivantes lorsque Nexus3 est en cours d'exécution (il ne sera donc pas téléchargé).

image

Je l'ai essayé

La procédure de configuration et d'utilisation du Nexus 3 est indiquée ci-dessous.

Remarquer

environnement

--OKD 3.11 (sur ubuntu 18.04) s'exécutant sur IBM Cloud (IaaS) - configuration tout-en-un démarrée avec oc cluster up

Déployer une image Nexus 3 sur OpenShift

image

L'image ci-dessus est publiée sur Dockerhub, vous pouvez donc la déployer facilement sur OpenShift avec la commande oc.

Connectez-vous et créez un nouveau projet, puis déployez l'image sonatype / nexus3 pour créer des services et des itinéraires.

Comment déployer nexus3


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

Ce n'est pas grave si la route (http://nexus3-nexus3.162.133.79.188.nip.io dans l'exemple ci-dessus) est créée dans l'état oc.

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.

Le pod fonctionne sur la console de gestion, n'est-ce pas?

image

Configuration Next3

Obtention d'un mot de passe administrateur

Ensuite, connectez-vous à la console Nexus 3 en tant qu'administrateur (admin) pour la configuration, mais avant cela, vous devez obtenir le mot de passe administrateur.

Selon la description du site de sonatype / nexus3, le mot de passe est écrit dans le fichier ** admin.password **.

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.

Utilisez les étapes ci-dessus pour identifier le nom du pod, connectez-vous au pod avec oc rsh, puis envoyez le contenu de ** / nexus-data / admin.password ** pour obtenir le mot de passe. [^ 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 ne semble pas être généré avant environ 5 à 10 secondes après le démarrage du pod, donc si vous ne le trouvez pas, veuillez patienter quelques instants et réessayer.

La même opération peut être effectuée avec Pods-Terminal depuis la console de gestion OpenShift.

image

Connectez-vous à la console de gestion Nexus 3

Accédez à l'URL affichée à la racine (par exemple http://nexus3-nexus3.162.133.79.188.nip.io), ouvrez la console d'administration du Nexus 3 et cliquez sur «Se connecter» en haut à droite

image

Entrez l'utilisateur en tant qu'administrateur et le mot de passe que vous avez obtenu précédemment en tant que «Connexion» image

Assistant de configuration

L'assistant de configuration initiale démarre, cliquez donc sur "Suivant". image

Tout d'abord, changez le mot de passe initial et cliquez sur "Suivant" image

Spécifiez s'il faut autoriser l'accès anonyme. Cette fois, le but est de mettre en cache le référentiel public maven2, donc ce n'est pas confidentiel, donc cochez "Activer l'accès anonyme" et cliquez sur "Suivant" image

C'est tout. image

Obtenez l'URL du proxy Maven

Obtenez l'URL du référentiel à spécifier lors de l'exécution du package maven.

Cliquez sur ** maven-central ** dans la liste des référentiels affichés dans "Gear mark (Server Administration and Configulation)" - "Repository" - "Repositories" en haut de la console.

image

La partie de l'URL est l'URL qui doit être référencée dans Maven.

image

spécification au moment de la construction de maven

Maintenant que Nexus 3 est prêt à être utilisé, spécifiez l'URL pour faire référence au proxy Nexus 3 Maven (au lieu du repo.maven.apache.org par défaut) comme référentiel lors de la construction avec Maven. Spécifiquement, spécifiez le fichier de configuration utilisateur avec -s nexus-settings.xml [^ 2] lors de la construction avec le package mvn comme indiqué ci-dessous.

[^ 2]: -s, --settings Signification du chemin alternatif pour le fichier de paramètres utilisateur

assembler un exemple de spécification dans s2i


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

Le contenu du fichier de paramètres utilisateur est le suivant et l'URL est réécrite à 3 endroits. [^ 3] Pour la description, je me suis référé à l'article: journal: OpenShift Nexus.

[^ 3]: vous n'avez pas besoin de spécifier le nom d'utilisateur et le mot de passe, car vous avez activé l'accès anonyme dans l'assistant de configuration du Nexus 3.

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>

résultat

Si vous exécutez à nouveau la compilation Maven après avoir spécifié ce qui précède, il faudra plus de 60 secondes pour télécharger la première fois, mais après la deuxième fois, le cache fonctionnera et la construction sera terminée dans environ 15 secondes!

image

Vous pouvez voir que le journal de construction du pod fait également référence à Nexus 3. (Téléchargement depuis 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)
...

en conclusion

Le proxy Maven de Nexus 3 dans un environnement OpenShift est très facile à déployer et à configurer, et peut aider à réduire le temps de construction de Maven lors de la création d'un pipeline DevOps pour les applications Java. S'il vous plaît essayez. Vous pouvez également utiliser Nexus 3 pour créer un registre d'images Docker privé. OpenShift est livré en standard avec son propre registre d'images, donc cela peut ne pas être nécessaire, mais cela peut être une bonne idée de garder à l'esprit comme alternative. c'est tout.

Recommended Posts

Réduisez le temps de construction de Java / Maven avec Nexus 3 dans l'environnement DevOps OpenShift (okd 3.11)
Application Java CICS-Run - (2) Gestion de build avec Maven
Créer un environnement de test E2E avec Selenium (Java)
Créer un environnement de développement Java avec VS Code
Créer un environnement de développement Java avec VS Code sur Mac
Maven échoue dans l'environnement Java7 (alerte fatale reçue: version_protocole)
[Note] Créez un environnement Python3 avec Docker dans EC2
Comment créer un environnement de développement Java avec VS Code
Créer un environnement de développement de programme Java avec Visual Studio Code
Construire Java avec Wercker
Compression Zip qui ne brouille pas dans l'environnement Java
Créer un environnement de développement Web APP avec Java + Spring avec Visual Studio Code
Construction de l'environnement JavaFX dans Java 13
Créer un environnement Docker avec WSL