Jenkins 安装
Jenkins 的安装不是一个很难得事情,官网也有安装文档 (opens new window)。
but, 有点小问题:
- Docker的方式,不是很熟的话后续维护成问题。
- linux下载整个 Jenkins包太慢了,而且很多时候并没用外网环境
- windows下安装是最简单的,没毛病,但也用的很少😂
本文记录下 linux下手动安装的方式,总的来说其实就两步:
- 安装 Java
- 下载 Jenkins,使用 Java启动 Jenkins
-> 最简单的安装方式
- 将最新的稳定Jenkins WAR包 (opens new window) 下载到您计算机上的相应目录。
- 在下载的目录内打开一个终端/命令提示符窗口到。
- 运行命令
java -jar jenkins.war
- 浏览http://localhost:8080并等到Unlock Jenkins页面出现。
- 后续升级更新 war包版本即可 该方式默认 Java已安装完成。下载速度稍微能让人接受。
-> 安装为服务
直接以上文的方式安装没有问题,但停止和重启不够优雅,比较推荐的方式是安装为jenkins 服务,并设置开机启动。
如果是使用的 init.d
(centos 6),最终期望的使用方式是这样的:
- 启动:
service jenkins start
- 查看状态:
service jenkins status
- 重启:
service jenkins restart
- 停止:
service jenkins stop
- 设置开机启动:
chkconfig --add jenkins
- 取消开机启动:
chkconfig --del jenkins
如果是使用的 systemd
(centos 7),使用方式则是:
- 启动:
systemctl start jenkins
- 查看状态:
systemctl status jenkins
- 重启:
systemctl restart jenkins
- 停止:
systemctl stop jenkins
- 设置开机启动:
systemctl enable jenkins
- 取消开机启动:
systemctl disable jenkins
具体实现如下:
-> 以守护进程的方式
- 新建一个 jenkins用户,使用该用户来启动服务
sudo useradd jenkins
1提示
该步骤非必须,有人喜欢用 root或个人账户也可以,只是推荐
- 编写 Jenkin 配置文件
- 配置文件路径定为
/etc/sysconfig/jenkins
# Jenkins system configuration JENKINS_HOME=/home/jenkins JENKINS_USER=jenkins JENKINS_LOG=/home/jenkins/jenkins.log JENKINS_JAVA=/usr/bin/java JENKINS_JAVAOPTS="-Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Shanghai \ -Duser.timezone=Asia/Shanghai -Dfile.encoding=UTF-8 -Djava.awt.headless=true" JENKINS_IP=0.0.0.0 JENKINS_PORT=8080 JENKINS_ARGS=""
1
2
3
4
5
6
7
8
9
10- 给该文件添加可执行权限
sudo chmod +x /etc/sysconfig/jenkins
- 设置
/home/jenkins
为 jenkins工作目录, 并设置为全局环境变量JENKINS_HOME
- 编辑文件
/etc/profile
, 追加以下内容export JENKINS_HOME=/home/jenkins
1 source /etc/profile
使环境变量生效
- 编辑文件
- 将下载的
jenkins.war
资源文件放在 jenkins工作目录
注意
确保 JENKINS_USER 对 JENKINS_HOME 有读写权限
- 配置文件路径定为
- 在 jenkins工作目录编写启动脚本
start-jenkins.sh
#!/bin/bash # import sysconfig settings and set defaults [ -f /etc/sysconfig/jenkins ] && . /etc/sysconfig/jenkins JENKINS_WAR=${JENKINS_HOME}/jenkins.war # check for config errors JENKINS_ERRORS=() [ ! -f ${JENKINS_WAR} ] && JENKINS_ERRORS[${#JENKINS_ERRORS[*]}]="JENKINS_HOME : The jenkins.war could not be found at ${JENKINS_HOME}/jenkins.war" [ ! -f $JENKINS_JAVA ] && JENKINS_ERRORS[${#JENKINS_ERRORS[*]}]="JENKINS_JAVA : The java executable could not be found at $JENKINS_JAVA" # display errors if there are any, otherwise start the process if [ ${#JENKINS_ERRORS[*]} != '0' ] then echo "CONFIGURATION ERROR:" echo " The following errors occurred when starting Jenkins." echo " Please set the appropriate values at /etc/sysconfig/jenkins" echo "" for (( i=0; i<${#JENKINS_ERRORS[*]}; i++ )) do echo "${JENKINS_ERRORS[${i}]}" done echo "" exit 1 else echo "starting service" echo "nohup nice $JENKINS_JAVA $JENKINS_JAVAOPTS -jar $JENKINS_WAR --httpListenAddress=$JENKINS_IP --httpPort=$JENKINS_PORT $> $JENKINS_LOG 2>&1 &" nohup nice $JENKINS_JAVA $JENKINS_JAVAOPTS -jar $JENKINS_WAR --httpListenAddress=$JENKINS_IP --httpPort=$JENKINS_PORT $> $JENKINS_LOG 2>&1 & fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32提示
此时该脚本就可启动 jenkins,通过读取配置文件,并使用nohup以守护进程的方式启动,只是不是一个系统服务
- 在 jenkins工作目录编写停止脚本
stop-jenkins.sh
#!/bin/bash kill `ps -ef | grep [j]enkins.war | awk '{ print $2 }'`
1
2 - 安装为服务并设置为开机启动
- 编写服务脚本,路径为
/etc/init.d/jenkins
#! /bin/bash # chkconfig: 2345 90 10 # description: Jenkins Continuous Integration server # Source function library. . /etc/rc.d/init.d/functions # Get network sysconfig. . /etc/sysconfig/network # Check that networking is up, otherwise we can't start [ "${NETWORKING}" = "no" ] && exit 0 # Get the Jenkins sysconfig [ -f /etc/sysconfig/jenkins ] && . /etc/sysconfig/jenkins startup=${JENKINS_HOME}/start-jenkins.sh shutdown=${JENKINS_HOME}/stop-jenkins.sh start(){ echo -n $"Starting Jenkins service: " pid=`ps -ef | grep [j]enkins.war | grep -v grep | wc -l` if [ $pid -gt 0 ]; then echo "Jenkins is already running" exit 1 fi su - $JENKINS_USER -c $startup RETVAL=$? [ $RETVAL == 0 ] && echo "Jenkins was started successfully." || echo "There was an error starting Jenkins." } stop(){ action $"Stopping Jenkins service: " pid=`ps -ef | grep [j]enkins.war | grep -v grep | wc -l` if [ ! $pid -gt 0 ]; then echo "Jenkins is not running" exit 1 fi su - $JENKINS_USER -c $shutdown RETVAL=$? [ $RETVAL == 0 ] && echo "Jenkins was stopped successfully." || echo "There was an error stopping Jenkins." } status(){ pid=`ps -ef | grep [j]enkins.war | grep -v grep | wc -l` if [ $pid -gt 0 ]; then echo "Jenkins is running..." else echo "Jenkins is stopped..." fi } restart(){ stop sleep 5 start } # Call functions as determined by args. case "$1" in start) start;; stop) stop;; status) status;; restart) restart;; *) echo $"Usage: $0 {start|stop|status|restart}" exit 1 esac exit 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78- 给启动脚本,停止脚本,服务脚本添加执行权限
chmod a+x /home/jenkins/start-jenkins.sh chmod a+x /home/jenkins/stop-jenkins.sh chmod a+x /etc/init.d/jenkins
1
2
3 - 编写服务脚本,路径为
到这里即可运行 service jenkins start
命令启动 jenkins服务了
-> systemd 服务
centos 7已经使用 systemd来做系统初始化了,在 centos 7等系统上安装服务上面的方式不适用,但很多地方可以复用。
前面的步骤相同,还需额外创建 systemd的服务脚本, 脚本路径为 /lib/systemd/system/jenkins.service
[Unit]
Description=Jenkins Continuous Integration server
After=network.target
[Service]
ExecStart=/etc/init.d/jenkins start
ExecReload=/etc/init.d/jenkins restart
ExecStop=/etc/init.d/jenkins stop
Restart=on-failure
[Install]
WantedBy=multi-user.target
2
3
4
5
6
7
8
9
10
11
12
提示
修改 service文件后需运行命令 sudo systemctl daemon-reload
使生效
如果使这样运行启动命令 systemctl start jenkins
, 再通过 systemctl status jenkins
查看服务会发现 jenkins服务启动成功后立刻停止。
StackOverflow 了以下,似懂非懂,大概是 systemd管理进程的方式已经变了,如果还是用之前的守护进程的方式启动,systemd无法获取它的状态信息。
因此,解决方案也很简单,将启动方式改成普通的进程启动方式即可,不再使用 nohup即可解决该问题。
即,将 start-jenkins.sh
脚本的第 31行,从
nohup nice $JENKINS_JAVA $JENKINS_JAVAOPTS -jar $JENKINS_WAR --httpListenAddress=$JENKINS_IP --httpPort=$JENKINS_PORT $> $JENKINS_LOG 2>&1 &
改为
$JENKINS_JAVA $JENKINS_JAVAOPTS -jar $JENKINS_WAR --httpListenAddress=$JENKINS_IP --httpPort=$JENKINS_PORT $> $JENKINS_LOG 2>&1
即可。
并且还收获了意外退出可自动重启的功能,确实功能更强大了。
-> docker 安装
https://github.com/jenkinsci/docker/blob/master/README.md (opens new window)