53 votes

Comment configurer Jenkins pour qu'il fonctionne sur le port 80

Je suis sous Ubuntu 11.10 et j'ai exécuté sudo apt-get install jenkins pour installer Jenkins sur ce système.

J'ai vu quelques tutoriels sur la façon de configurer un proxy inverse (Apache, Nginx, etc.), mais il s'agit d'une VM dédiée uniquement à Jenkins et j'aimerais qu'elle soit aussi légère que possible, tout en faisant tourner Jenkins sur le port 80.

J'ai trouvé la configuration upstart dans /etc/init/jenkins.conf et modifié le port à 80 env HTTP_PORT=80

Lorsque je démarre jenkins via service jenkins start , ps révèle qu'il fonctionne pendant quelques secondes puis se termine.

Est-ce que c'est parce que Jenkins est exécuté en tant que jenkins sur un port privilégié ? Si oui, comment puis-je résoudre ce problème ? Toute autre idée est la bienvenue.

Voici la configuration upstart :

description "jenkins: Jenkins Continuous Integration Server"
author "James Page <james.page@ubuntu.com>"

start on (local-filesystems and net-device-up IFACE!=lo)
stop on runlevel [!2345]

env USER="jenkins"
env GROUP="jenkins"
env JENKINS_LOG="/var/log/jenkins"
env JENKINS_ROOT="/usr/share/jenkins"
env JENKINS_HOME="/var/lib/jenkins"
env JENKINS_RUN="/var/run/jenkins"
env HTTP_PORT=80
env AJP_PORT=-1
env JAVA_OPTS=""
env JAVA_HOME="/usr/lib/jvm/default-java"

limit nofile 8192 8192

pre-start script
    test -f $JENKINS_ROOT/jenkins.war || { stop ; exit 0; }
    $JENKINS_ROOT/bin/maintain-plugins.sh   
    mkdir $JENKINS_RUN > /dev/null 2>&1  || true
    chown -R $USER:$GROUP $JENKINS_RUN || true
end script

script
    JENKINS_ARGS="--webroot=$JENKINS_RUN/war --httpPort=$HTTP_PORT --ajp13Port=$AJP_PORT"
    exec daemon --name=jenkins --inherit --output=$JENKINS_LOG/jenkins.log --user=$USER \
        -- $JAVA_HOME/bin/java $JAVA_OPTS -jar $JENKINS_ROOT/jenkins.war $JENKINS_ARGS \
        --preferredClassLoader=java.net.URLClassLoader
end script

50voto

Chris Laskey Points 768

Une autre solution consiste à utiliser simplement iptables pour rediriger le trafic entrant de 80 vers 8080. Les règles ressembleraient à ceci :

-A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
-A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

Reformaté comme un fichier iptables.rules :

*filter
:INPUT ACCEPT [100:100000]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [95:9000]
-A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
COMMIT

*nat
-A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
COMMIT

L'avantage d'un fichier iptable.rules est que les règles peuvent persister après les redémarrages. Assurez-vous simplement d'intégrer toutes les autres règles iptable en cours dans le même fichier !

Sur Redhat/CentOS, ce fichier peut se trouver dans /etc/sysconfig/iptables .

Sur les systèmes Debian/Ubuntu, ils peuvent être enregistrés dans /etc/iptables/rules.v4 en utilisant le iptables-persistent paquet. Ou bien on peut appeler iptable.rules en modifiant /etc/network/interfaces ou en se connectant à if-up / if-down scripts. Le site Wiki de la communauté Ubuntu a une excellente page expliquant ces méthodes.

Comme c'est généralement le cas avec les réseaux, il existe de nombreuses façons différentes d'obtenir le même résultat. Utilisez celle qui vous convient le mieux !

1 votes

Pour l'utilisation de localhost vous aurez également besoin : iptables -A OUTPUT -t nat -p tcp -o lo --dport 80 -j REDIRECT --to-port 8080

1 votes

Il y a aussi un Jenkins wiki pour documenter cela.

0 votes

Le problème est résolu

37voto

Ripon Al Wasim Points 5161
  1. Allez dans le dossier /etc/default --> Ouvrez le fichier "jenkins".
  2. Modifiez la ligne HTTP_PORT=8080 en HTTP_PORT=80
  3. Démarrez jenkins en tant que Root en utilisant la commande : sudo /etc/init.d/jenkins start
  4. Ouvrez un navigateur et naviguez en tant que localhost:80

c'est tout

0 votes

Pour l'étape 3, avec quel utilisateur commencez-vous ?

0 votes

Pour l'étape 3 : vous pouvez démarrer en tant que Root. Ou, si ce n'est pas l'utilisateur Root, utilisez "sudo" comme sudo /etc/init.d/jenkins start

0 votes

J'ai effectué le changement que vous avez mentionné et j'obtiens ce qui semble être une erreur de port 80 dans le journal de Jenkins. L'extrait est : Causé par : java.io.IOException : Failed to listen on port 80 at winstone.HttpListener.getServerSocket(HttpListener.java:119) at winstone.HttpListener.start(HttpListener.java:72) at winstone.Launcher.spawnListener(Launcher.java:220) ... 8 autres Causé par : java.net.BindException : Permission refusée

33voto

JScoobyCed Points 4232

Essayez d'essayer ' authbind ' :

sudo apt-get install authbind
sudo touch /etc/authbind/byport/80
sudo chmod 500 /etc/authbind/byport/80 
sudo chown jenkins /etc/authbind/byport/80

Ensuite, modifiez le script ci-dessus pour avoir (ajouter authbind avant le $JAVA_HOME/bin/java partie) :

exec daemon --name=jenkins --inherit --output=$JENKINS_LOG/jenkins.log \
--user=$USER -- authbind $JAVA_HOME/bin/java $JAVA_OPTS \
-jar $JENKINS_ROOT/jenkins.war $JENKINS_ARGS \
--preferredClassLoader=java.net.URLClassLoader

Pour les installations Jenkins les plus récentes (1.598) sur les installations Ubuntu les plus récentes (14.04), éditez /etc/init.d/jenkins et ajouter authbind avant $JAVA

$SU -l $JENKINS_USER --shell=/bin/bash -c "$DAEMON $DAEMON_ARGS -- authbind $JAVA $JAVA_ARGS -jar $JENKINS_WAR $JENKINS_ARGS" || return 2

Comme mentionné par Alan (voir le commentaire ci-dessous) si vous avez besoin d'IPv6 et que votre système est inférieur à Quantal, vous pouvez au lieu d'utiliser apt-get pour installer authbind télécharger une version supérieure. Assurez-vous que vous avez libc6 et libc6-udeb installé. Voici authbind version 2.1.1 d'Ubuntu :

Alors exécutez :

sudo dpkg -i authbind_2.1.1_amd64.deb
# or sudo dpkg -i authbind_2.1.1_i386.deb

sudo touch /etc/authbind/byport/80
sudo chmod 500 /etc/authbind/byport/80 
sudo chown jenkins /etc/authbind/byport/80

0 votes

Merci ! En référence à la man page

1 votes

Note aux futurs utilisateurs de cette approche : J'utilise Ubuntu 12.04 (Precise) avec Jenkins 1.495. La version d'authbind dans Precise est 1.20build3. authbind ne prenait pas en charge ipv6 avant la version 2.0, j'ai donc dû utiliser apt pinning pour forcer l'installation de la version authbind de Quantal (2.1.1). Juste pour info, au cas où quelqu'un aurait trouvé cette solution mais qu'elle ne fonctionnait pas pour lui. L'IPv6 peut être le problème !

0 votes

Merci. Je ne savais pas pour authbind avant. Je ne sais toujours pas comment ils font ça. Il faut lire les sources. Cependant, cela a fonctionné. Jenkins maintenant sur le port 80 :)

7voto

regulatethis Points 1138

Je vous suggère d'utiliser apache et mod_proxy. C'est ce que je fais, et ma configuration de serveur virtuel ressemble à ceci (je redirige également pour SSL mais vous pouvez l'omettre) :

<VirtualHost *:443>
ServerAdmin webmaster@example.com
ServerName ci.example.com

ProxyRequests Off
<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>
ProxyPreservehost on
ProxyPass / http://localhost:8080/

Header edit Location ^http://ci.example.com/ https://ci.example.com/

SSLEngine on
SSLCertificateFile /etc/apache2/keys/apache.pem
</VirtualHost>

0 votes

J'ai essayé la méthode authbind car elle semblait la plus correcte, mais je n'ai pas réussi à la faire fonctionner. C'est ce que j'ai fini par faire (puisque je ne voulais pas me soucier des tables IP). Pour plus d'informations sur la configuration de mod_proxy sur Ubuntu, voir ici : abhirama.wordpress.com/2008/11/03/apache-mod_proxy-in-ubuntu

0 votes

Omettre le SSL pour <VirtualHost *:80> est également acceptable, cela fonctionne pour moi.

-1voto

maximus Points 2926

Le problème de base est l'environnement java, j'ai trouvé la solution suivante après de nombreuses recherches.

Le problème était dans /etc/init/jenkins.conf :

env JAVA_HOME="/usr/lib/jvm/default-java"

Le lien symbolique default-java n'était pas là. Pour résoudre le problème, j'ai fait ce qui suit (en tant que Root) :

cd /usr/lib/jvm
ln -s java-6-openjdk default-java

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X