Afin de pratiquer CI / CD, j'ai configuré Jenkins pour générer des artefacts et les déployer sur le serveur d'applications.
Dans cet article, en tant que * préparation *, nous allons gérer le projet d'application Web écrit en Java sur Github et le configurer pour le construire en coopération avec Jenkins.
Artifacts
Je pense qu'il y a généralement deux manières de déployer, «déployer avec la guerre» et «déployer avec jar», j'ai donc décidé d'essayer l'un ou l'autre modèle.
C'est,
** 1. Sortez le fichier war et déployez-le sur le serveur d'applications. ** **
** 2. Sortez le fichier jar et exécutez-le avec la commande java
. ** **
Cette fois, le premier utilise Tomcat comme serveur d'applications, et le second utilise le Tomcat intégré dans Spring Boot pour exécuter le fichier jar.
Afin de préparer deux types d'artefacts, un fichier war et un fichier jar, nous avons préparé deux projets d'application Web Java utilisant Spring Framework.
Cliquez ici pour le référentiel Github (https://github.com/kazokmr/JavaWebAppDeploySample)
La base est basée sur Serving Web Content with Spring MVC sur Spring HP, j'ai essayé de préparer un projet Maven, mais Spring Boot Je l'ai utilisé et l'emballage était également en pot, alors je l'ai acheté avant Spring deep introduction et M. Tada l'a fait au JJUG CCC. J'ai également fait référence au matériel pratique procédure de préparation pratique de Spring 5 et Spring Boot 2.
Vérifiez que le fichier war est enregistré dans [Fichier> Structure du projet> Artefacts] d'IntelliJ IDEA, et ajoutez-le s'il n'existe pas.
J'ai préparé Maven Wrapper pour que je puisse exécuter les commandes mvn sans installer Maven sur le serveur Jenkins.
mvn -N io.takari:maven:wrapper -Dmaven=3.6.0
Pour savoir comment créer Maven Wrapper (mvnw), reportez-vous à here.
Notez qu'il était difficile de lancer Tomcat dans l'environnement de développement et de le vérifier avec un navigateur.
brew install sur mcat
/ usr / local / Cellar / tomcat / 9.0.14 / libexec
pour le chemin du [Serveur d'applications].http: // localhost: 8080 / web-spring-mvc / salutation
pour [URL].war extended
à partir de la guerre qui peut être spécifiée comme artefacts dans [Déployer au démarrage du serveur] sur l'onglet Déploiement./ web-spring-mvc
. (Correspondance avec ContextPath de l'URL 4)Lorsque vous exécutez Tomcat depuis IntelliJ IDEA, vous serez redirigé vers http: // localhost: 8080 / web-sprig-mvc / salutation et l'écran s'affichera.
Exécutez les artefacts développés par l'application Spring Boot et sortez par le jar avec la commande java
.
L'exemple de projet crée un projet Maven basé sur Construction d'une application avec Spring Boot.
Étant donné que la sortie de cet exemple était l'API Rest, je l'ai modifiée pour générer une sortie html (Thymeleaf).
Tout d'abord, créez un projet à l'aide de Spring Initializer.
Ci-dessous, sur les points difficiles
--Si vous n'ajoutez pas spring-boot-starter-thymeleaf
, l'écran ne sera pas affiché car Thymeleaf ne peut pas être utilisé.
junit
de la dépendance de spring-boot-starter-test (j'obtiens une erreur en essayant de spécifier une version qui n'existe pas à partir du junit dépendant).Les trois environnements virtuels suivants ont été créés sur la machine locale.
Pour construire, démarrez plusieurs environnements en même temps avec Vagrant et [ansible-playbook](https://github.com/kazokmr/ansible-java- Le logiciel nécessaire est installé à l'aide de deploy-env).
Logiciel d'installation principal
JRE 8 est utilisé comme environnement d'exécution pour les opérations Jenkins et OpenJDK 11 est utilisé pour créer des applications.
Pour installer Jenkins, reportez-vous au Jenkins Wiki.
Logiciel d'installation principal
Pour savoir comment écrire Ansible-playbook, je me suis référé à sample of ansible head family.
Je suis tombé sur les paramètres du pare-feu, mais j'ai pu me connecter en "changeant le démarrage du service Tomcat de démarré à redémarré" et en "démarrant firewalld avant de spécifier le port firewalld".
/roles/tomcat/tasks/main.yml(Extrait)
- name: Start Tomcat
service: name=tomcat state=restarted enabled=yes
- name: running firewall daemon
service: name=firewalld state=restarted
Lors de l'accès à l'écran du gestionnaire Tomcat (/ manager / html) à partir d'un PC local, «403 accès refusé» s'affiche, donc un écran d'erreur ou ici Quand j'ai regardé 30/000000), il a été dit que la valeur initiale était définie de sorte que l'accès à l'écran du gestionnaire ne puisse être fait qu'à partir de la machine sur laquelle Tomcat était installé, donc / webapps / manager / META-INF / context. J'ai édité le xml et l'ai changé pour qu'il soit accessible depuis le réseau de l'environnement virtuel (192.168.33.0/24).
Aussi, afin de pouvoir exécuter le gestionnaire tomcat à partir de commandes, attribuez le rôle manager-sciprt à l'utilisateur d'exécution dans tomcat-users.xml. Référence
Définissez les paramètres pour exécuter l'application Spring Boot.
Au moment de la création, le fichier jar n'existe pas encore, donc même si vous démarrez le service, le statut sera Échec.
Lorsque vous exécutez vagrant up
, les trois environnements seront démarrés dans l'ordre, et Ansible sera exécuté pour installer le logiciel et les paramètres nécessaires.
Une fois l'installation terminée, vous pouvez accéder à l'environnement virtuel avec vagrant ssh [nom d'hôte]
.
Jenkins
Vous pouvez vous connecter à Jenkins en visitant http://192.168.33.10:8080/.
Après cela, effectuez la configuration initiale à partir de l'écran et définissez le chemin du JDK et de Git installés.
Tomcat
Vous pouvez accéder à la console Tomcat en visitant http://192.168.33.30:8080/.
L'écran de gestion et le script peuvent être utilisés en utilisant les utilisateurs de roles / tomcat / vars / main.yml inclus dans l'exemple.
JVM
Confirmez que ** open jdk version ** est affiché lors de l'accès avec vagrant ssh jvm
et de l'exécution de java -version
.
De plus, si vous exécutez # systemctl status app
, vous pouvez vérifier l'état d'exécution du service d'application Spring Boot, mais la première fois, vous obtiendrez une erreur car il n'y a pas de fichier jar. (Vous pouvez le voir en regardant / var / log / message.)
Il utilise une connexion SSH pour transférer le fichier jar du serveur Jenkins vers le serveur JVM et exécuter les services de l'application. Dans cet exemple, je n'ai pas créé de clé publique à l'avance car j'ai démarré plusieurs environnements en même temps avec vagrant, j'ai donc passé la clé avec la commande suivante. (En fait, il est préférable de préparer la clé publique à l'avance et de l'enregistrer avec le module allowed_key d'ansible.)
** Activez temporairement l'accès avec authentification par mot de passe sur le serveur JVM **
# vi / etc / ssh / sshd_config
et réglez" Authentification par mot de passe "sur oui# systemctl restart sshd
.# passwd jvm
** Créez une clé SSH en tant qu'utilisateur Jenkins sur le serveur Jenkins et envoyez la clé publique au serveur JVM **
Exécutez $ sudo su -s / bin / bash jenkins
pour exécuter la commande en tant qu'utilisateur Jenkins, alors exécutez la commande pour créer une clé SSH.
1.répertoire de base de l'utilisateur jenkins[/var/lib/jenkins]Déménager à
$ cd ~
2.Créer une clé ssh
$ ssh-keygen -b 2048 -t rsa -f /var/lib/jenkins/.ssh/id_rsa -N ""
3.Envoyez la clé publique au serveur JVM(Le mot de passe de l'utilisateur jvm vous sera demandé lors de l'envoi)
$ ssh-copy-id -i .ssh/id_rsa.pub [email protected]
4.Test de connexion
$ ssh -i .ssh/id_rsa [email protected]
5.Fin
$ exit
** N'oubliez pas de désactiver l'authentification par mot de passe du serveur JVM une fois que vous avez un accès ssh **
Au fait, le répertoire personnel de l'utilisateur jvm créé sur le serveur JVM est / var / jvm
, donc les informations de connexion SSH sont stockées dans / var / jvm / .ssh
.
** Le projet Maven (Java + Spring) ** et le ** serveur Jenkins ** et ** l'environnement de déploiement ** gérés par Github sont prêts! Les paramètres pour les versions et les déploiements ultérieurs sont Tomcat Application et Spring Boot Application. ), Veuillez donc vous référer ici.
Recommended Posts