web-dev-qa-db-fra.com

Jenkins SMTP TLS

J'essaie de configurer Jenkins pour qu'il utilise le serveur SMTP de notre société pour envoyer des notifications de génération par courrier électronique. Nous utilisons TLS comme méthode de cryptage sur le port 587. Toutefois, la notification par courrier électronique ne semble pas fonctionner correctement.

Voici mon fichier Hudson.Tasks.Mailer.xml afin que vous puissiez voir ma configuration (j'ai supprimé l'utilisateur et le mot de passe d'authentification SMTP et modifié légèrement le smtpHost au cas où).

<hudson.tasks.Mailer_-DescriptorImpl>
  <helpRedirect/>
  <defaultSuffix></defaultSuffix>
  <hudsonUrl>http://localhost:8080/</hudsonUrl>
  <smtpAuthUsername></smtpAuthUsername>
  <smtpAuthPassword></smtpAuthPassw$
  <adminAddress></adminAddress>
  <smtpHost>pod#####.Outlook.com</smtpHost>
  <useSsl>true</useSsl>
  <smtpPort>587</smtpPort>
  <charset>UTF-8</charset>
</hudson.tasks.Mailer_-DescriptorImpl>

Il semble que ce soit un problème connu, tiré de http://issues.hudson-ci.org/browse/HUDSON-2206

Je ne connais pas très bien Apple OS (la machine qui exécute Jenkins), mais je pensais pouvoir résoudre le problème en utilisant la solution de contournement mentionnée. Je ne savais pas exactement où mettre cette solution de contournement, alors j’essayais de la mettre ici: /Bibliothèque/Application Support/Jenkins/jenkins-runner.sh

defaults="defaults read /Library/Preferences/org.jenkins-ci"

war=`$defaults war` || war="/Applications/Jenkins/jenkins.war"

javaArgs="-Dmail.smtp.starttls.enable=\"true\""
heapSize=`$defaults heapSize` && javaArgs="$javaArgs -Xmx${heapSize}"
permGen=`$defaults permGen` && javaArgs="$javaArgs -XX:MaxPermSize=${permGen}"

home=`$defaults JENKINS_HOME` && export JENKINS_HOME="$home"

add_to_args() {
  val=`$defaults $1` && args="$args --${1}=${val}"
}

args=""
add_to_args prefix
add_to_args httpPort
add_to_args httpListenAddress
add_to_args httpsPort
add_to_args httpsListenAddress
add_to_args ajp13Port
add_to_args ajp13ListenAddress

echo "JENKINS_HOME=$JENKINS_HOME"
echo "Jenkins command line for execution"
echo /usr/bin/Java $javaArgs -jar "$war" $args
exec /usr/bin/Java $javaArgs -jar "$war" $args

Cela n'a pas semblé le résoudre. Je peux voir cet appel dans la console lorsque Jenkins est démarré, mais lorsque je tente un courrier électronique de configuration de test, l'erreur suivante apparaît:

Failed to send out e-mail

javax.mail.MessagingException: Could not connect to SMTP Host: pod#####.Outlook.com, port: 587;
nested exception is:
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
at com.Sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.Java:1934)
at com.Sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.Java:638)
at javax.mail.Service.connect(Service.Java:317)
at javax.mail.Service.connect(Service.Java:176)
at javax.mail.Service.connect(Service.Java:125)
at javax.mail.Transport.send0(Transport.Java:194)

Des idées sur quoi d'autre je peux essayer? J'ai essayé de changer le compte de messagerie pour utiliser le serveur smtp de gmail et cela fonctionne bien, mais je préférerais qu'il utilise notre serveur smtp si je le peux.

17
UWSkeletor

enter image description here

Changer le port SMTP de 587 à 465 a résolu ce problème pour moi:

SMTP server:               smtp.mandrill.com
Use SMTP Authentication:   true
Use SSL:                   true
SMTP Port:                 465

D'après ce que je peux dire (disclaimer: je ne suis en aucun cas un expert de Hudson/Jenkins))} , Le plug-in de messagerie Hudson/Jenkins prend en charge la communication SMTP cryptée SSL, mais cette implémentation requiert que les communications soient cryptées. dès le départ. 

Lors de la connexion sur le port 587, le serveur à l'autre extrémité peut s'attendre à une commande STARTTLS (voir ceci SSL vs TLS vs STARTTLS article). Cette commande est envoyée en texte brut pour «mettre à niveau» la connexion afin d’utiliser SSL/TLS.

Hudson/Jenkins tente à la place de commencer à négocier le protocole SSL sur le port 587, qui est rapidement rejeté, ce qui entraîne l'erreur suivante:

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?

J'ai essayé d'ajouter les options Java suggérées "-Dmail.smtp.starttls.enable = true" pour activer TLS:

JENKINS_Java_OPTIONS="-Djava.awt.headless=true -Dmail.smtp.starttls.enable=true"

Malheureusement, cela n'a pas résolu le problème pour moi.

Après la modification du port sur 465, la négociation SSL s'est déroulée correctement et la communication a abouti. 

J'espère que cela pourra aider.

Remarque: Le plug-in de messagerie Jenkins a toujours besoin d'informations d'identification SMTP, qui sont souvent les informations d'identification de messagerie de l'expéditeur, lorsque vous cochez l'option "Utiliser l'authentification SMTP" pour toute configuration "SSL - port 465" ou "non SSL - port 587".

20
jiwanrai

J'ai eu le même problème avec Jenkins mais le mien est installé sur Centos plutôt que sur Apple OS. Je pensais toujours poster la solution ici car A), vous pourriez peut-être apporter les ajustements nécessaires à la solution et B) les utilisateurs de Linux & Jenkins pourraient en tirer parti.

Quoi qu'il en soit, recherchez le fichier de configuration Jenkins (dans CENTOS, dans/etc/sysconfig/jenkins).

Dans celui-ci, localisez la variable JENKINS_Java_OPTIONS et ajoutez l'option suivante "-Dmail.smtp.starttls.enable = true" Dans mon cas, voici ce que j'avais auparavant:

JENKINS_Java_OPTIONS="-Djava.awt.headless=true"

Et c'est après;

JENKINS_Java_OPTIONS="-Djava.awt.headless=true -Dmail.smtp.starttls.enable=true"

redémarrer le serveur Jenkins (sous Linux)

/etc/init.d/jenkins restart
17
nsof

Pour Jenkins sous Windows

Ouvrez jenkins.xml et modifiez le noeud des arguments

-Xrs -Xmx256m -Dhudson.lifecycle = hudson.lifecycle.WindowsServiceLifecycle -Dmail.smtp.starttls.enable = true -jar "% BASE%\jenkins.war" --httpPort = 8080 

Pour smtp.live.com: 

Définissez le port SMTP sur 587 et décochez Use SSL

9
kaloyan

Même après avoir défini -Dmail.smtp.starttls.enable=true comme indiqué dans les réponses de @ nsof dans le fichier /etc/default/jenkins (debian/ubuntu), cela ne fonctionnait pas pour moi.

L'astuce consistait à définir le port SMTP sur 587 et décocher Use SSL comme indiqué ci-dessous, puis l'e-mail a été envoyé avec succès.

 enter image description here

3
iTech

Essayez la solution de contournement mentionnée dans le bogue lui-même:

http://issues.hudson-ci.org/browse/HUDSON-2206

En Java:

props.put("mail.smtp.starttls.enable","true");

Dans Tomcat:

Ajoutez Java_OPTS=-Dmail.smtp.starttls.enable="true" au fichier de configuration Tomcat.

1
ATOzTOA

Pour Jenkins sur Ubuntu 16.04 :

1 - Editez le fichier de configuration:

Sudo nano /etc/default/jenkins

2 - Mettez en commentaire les Java_ARGS existants, ajoutez-en un nouveau ci-dessous:

#Java_ARGS="-Djava.awt.headless=true"
Java_ARGS="-Djava.awt.headless=true -Dmail.smtp.starttls.enable=true"

3 - Redémarrer Jenkins

Sudo service jenkins restart

 enter image description here

0
Paul Lockwood

Avec Jenkins 2.134, les éléments suivants ont fonctionné pour moi:

  • Java_TOOL_OPTIONS=-Dmail.smtp.starttls.enable=true
  • Décocher Use SSL!
0
schnatterer

Pour Jenkins sur Red Hat Enterprise Linux Server version 7.4 (Maipo) , Modifiez/etc/sysconfig/jenkins pour ajouter 

 enter image description here

Le fichier de configuration du service Jenkins nécessite un accès root à la machine. Dans CloudBees Jenkins Enterprise, vous pouvez trouver ce fichier sous:

  • / etc/default/jenkins: emplacement de la plupart des distributions Linux.
  • / etc/sysconfig/jenkins: emplacement de la distribution RedHat/CentOS.
  • C:\Program Files\Jenkins\jenkins.xml: emplacement par défaut pour Windows
0
Alferd Nobel

L'ajout de -Dmail.smtp.starttls.enable = true comme arguments de Java_OPTS a résolu mon problème.

Si votre jenkins fonctionne en mode autonome, mettez à jour Java_OPTS dans/etc/sysconfig/jenkins Si votre jenkins est en cours d'exécution dans la mise à jour de Tomcat, Java_OPTS

  • catalina.sh pour unix
  • catalina.bat pour windows
0
Abid