1. 安全管理
Jenkins的权限管理是这样的,你如果启用安全,需要先添加一个即将使用的用户,并分配权限(至少要有管理员权限),保存后会跳到首页注册,这里就使用刚添加的用户来注册,输入用户名密码保存即可。如果事先没有为新注册的用户分配权限,这里就会导致你无法再登录了。
1).点击系统管理->安全设置
2).点击“启用安全”,在“安全域”下勾选“Jenkins专有用户数据库”,注意第一次一定要保留“允许用户注册”的勾选,否则点击保存后无法再登录了。
3).”授权策略“下,选择“安全矩阵”
4).在"添加用户/组"输入框输入一个名称"admin",点击添加,作为管理员,然后将该用户下的所有复选框都勾选上。
5).点击保存,这时会跳到登录注册页面,因为我们还有没有用户,这时就需要新注册一个,点击“创建一个用户账号“,注意这里新注册的用户名不是随便取的,就是刚才在授权策略下新添加的那个用户,这就是为什么我们需要先授权再注册,输入各个信息后保存即可,这样就完成了第一个用户的创建。
6).重新点击“系统管理”,然后点击”Configure Global Security“,此时将”允许用户注册“的勾选去掉,我们不允许用户注册,采用管理员新建用户并分配权限的方式统一管理。当然这里可以根据需要自行选择。
7.新增用户:;
1).点击系统管理->管理用户->新建用户
2).输入新的用户名密码即可。
可以为团队的每个人员新增一个用户,并根据实际情况分配权限。
2.进入“系统管理”->“系统设置”
点击新增JDK,去掉自动安装前边的复选框,我们使用自己安装的JDK,在别名处输入JDK的别名,JAVA_HOME变量则输入Jenkins所在服务器的jdk路径即可:
同样,点击新增Maven,配置好我们自己安装的Maven.
3.配置系统管理员邮件地址
一定要注意这里的邮件地址,这个用户必须与下面邮件通知处的用户保持一致,否则无法发送通知邮件!:
我们用的svn,这里也一并将版本改一下,改到1.7.
4.配置邮件通知:
在邮件通知右下角点击”高级”:
在SMTP服务器中填入你使用邮箱的发件服务器(具体查询自己的邮件服务提供商),我们使用的163的企业邮箱,输入用户名密码,注意这里的用户名即上边配置的系统管理员邮件地址,具体配置如下:
配置完可勾选”通过发送测试邮件测试配置”来进行测试一下是否正确:
如果报错了,请仔细检查上下邮件地址是否一致,并且邮件的发件服务器是否正确。
5.配置SSH服务器:
点击增加,点击高级,我们使用用户名密码的验证方式,注意远程目录输入的必须是一个已存在的目录,这里演示用的是/tmp下的目录,实际中应该换成其他目录比如/opt下,因为/tmp目录下的东西在重启后可能会自动删除:
至此配置完毕,我们可以点击右边的测试按钮测试一下是否成功。
注意,这里对目标主机上的ssh版本会有要求,如果你的OpenSSH版本高于6.7,则无法连接:
jenkins.plugins.publish_over.BapPublisherException:
Failed to connectsession for config [test(192.168.1.52)]. Message [Algorithm negotiation fail]
据stackoverflow上的一个帖子(http://stackoverflow.com/questions/26424621/algorithm-negotiation-fail-ssh-in-jenkins)说,ssh升级后,为了安全,默认去掉了一些不安全的加密算法,一种解决办法是,我们将这部分算法再手动添加进去:
sudo vi/etc/ssh/sshd_config
注意这是一行:
[email protected],ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
然后保存退出,重启ssh服务:
sudo systemctlrestart ssh
如果是早期的发行版:
sudo service ssh restart
或
sudo/etc/init.d/ssh restart
这时我们再测试一下,发现没有问题了:
如果不想用这种方式,可以换成ssh免密码登录的方式认证,这里就不说这种情况了,网上贴子很多,也可参考之前的文章《设置ssh免密码登录》。
这里还要针对Ubuntu发行版的用户多说一点,由于Ubuntu系统默认不启用root用户(不使用root帐号是个好习惯),所以在执行一些命令的时候需要添加sudo ,但是我们Jenkins中的ssh并不是工作在交互模式,所以在执行服务启动停止操作时,便会出现无响应的情况(一直在等待输入sudo密码),解决方法是,给我们前面配置的ssh用户添加一些规则,使其在使用sudo 命令的时候无需输入确认密码即可直接执行命令,这里主要是修改/etc/sudoers文件
需要注意的是,该文件默认是只读属性,无法直接修改,我们先改一下权限,使其可写(默认440):
sudo chmod 640/etc/sudoers
sudo vi/etc/sudoers
简单点的话。直接将develALL = NOPASSWD: ALL 这一行追加到该文件即可,其中devel是我们的登录用户名,这是说devel这个用户可以在任意机器访问并且可以执行任意命令而无需密码确认。更加复杂的规则可以查看man手册(man sudoers),这里给出一个我的详细一点的例子:
# User aliasspecification
User_Alias JENKINS = devel
# Host aliasspecification
Host_Alias JENKINSSERVER = 192.168.1.0
# Cmnd aliasspecification
Cmnd_Alias KILL = /bin/kill
Cmnd_Alias CP = /bin/cp
Cmnd_Alias RM = /bin/rm
Cmnd_Alias MKDIR = /bin/mkdir
Cmnd_Alias TOUCH = /usr/bin/touch
Cmnd_Alias CHMOD = /bin/chmod
Cmnd_Alias ZIP = /usr/bin/zip
Cmnd_Alias SERVICE = /usr/sbin/service
Cmnd_Alias SYSTEMCTL = /bin/systemctlCmnd_Alias TOMCATSHELL =/var/lib/tomcat7/bin/startup.sh, /var/lib/tomcat7/bin/shutdown.sh
JENKINS JENKINSSERVER = NOPASSWD: KILL, CP, RM, MKDIR,TOUCH,CHMOD,ZIP,SERVICE,SYSTEMCTL, TOMCATSHELL
保存完毕,记得将该文件权限再改回来:
sudo chmod 440/etc/sudoers
为了验证这一步的正确性,我们有必要测试一下,进入Jenkins首页,点击新建,我们新建一个自由风格的软件项目,默认配置都不许要改,我们在构建下增加一个构建步骤,用来模拟构建过程:
输入:echo thisis a test build from jenkins > build.log
进入最下边的”构建后操作“下拉列表,选择:Send Build artifacts over SSH 一项:
远程主机上可以找到我们上传的文件:
这样就可以执行管理员命令了,到现在为止,所有系统方面的配置全都完成,接下来就可以配置我们的具体构建任务了。
本文已迁移到我的新博客地址:blog.favorstack.io 欢迎访问~
最后,附上一个远程部署的完整shell脚本,工作流程为,检查目标服务,停止服务,备份当前应用,拷贝新应用,重启服务,检查服务,如果失败则回滚到之前的应用,直接贴到插件的Exec command框里就可以,其中的应用名称及路径需要自己根据情况修改:
JAVA_HOME=/usr/lib/jvm/jdk1.7.0_80
CATALINA_HOME=/var/lib/tomcat7
NAME=myapp
PORT=8080
ARCHIVE=/opt/jenkins/archives
BACKDIR=/opt/jenkins/backup
LOG=/opt/jenkins/deploy.log
FMT="+%Y-%m-%d %H:%M:%S"
RETVAL="0"
if [ ! -d $BACKDIR ]; then
sudo mkdir -p $BACKDIR >/dev/null 2>&1
fi
if [ ! -f $LOG ]; then
sudo touch $LOG >/dev/null 2>&1
sudo chmod 777 $LOG
fi
if [ -d $CATALINA_HOME ]; then
cd $CATALINA_HOME
echo "`date "$FMT"` starting to deploy apps ..." > $LOG 2>&1
echo "`date "$FMT"` checking to stop tomcat service..." >> $LOG 2>&1
if [ `netstat -nlt |grep -c $PORT` -eq "1" ] && [ ` ps -ef |grep -c tomcat` -gt "1" ]; then
sudo ./bin/shutdown.sh >> $LOG 2>&1
fi
# make sure our tomcat port is not used
if [ `netstat -nlt |grep -c $PORT` -eq "1" ]; then
sudo kill -9 `sudo lsof -nPti :$PORT`
fi
sleep 5
echo "`date "$FMT"` backup old apps war files to $BACKDIR..." >> $LOG 2>&1
if [ -e $CATALINA_HOME/webapps/$NAME.war ]; then
sudo cp -f $CATALINA_HOME/webapps/$NAME.war $BACKDIR && echo "`date "$FMT"` old file backuped..." >> $LOG 2>&1
elif [ -d $CATALINA_HOME/webapps/$NAME ]; then
cd $CATALINA_HOME/webapps/$NAME
sudo zip -r $BACKDIR/$NAME.war * && echo "`date "$FMT"` old file ziped..." >> $LOG 2>&1
cd -
else
echo "`date "$FMT"` nothinng to backup..." >> $LOG 2>&1
fi
echo "`date "$FMT"` copy new .war file to cover the old one..." >> $LOG
sudo cp -f $ARCHIVE/$NAME.war $CATALINA_HOME/webapps/ && echo "new deploy file copied ok" >> $LOG 2>&1
#clean
echo "`date "$FMT"` do something cleaning..." >> $LOG
sudo rm -rf $CATALINA_HOME/webapps/$NAME
sudo rm -rf $CATALINA_HOME/webapps/../work/Catalina/localhost/$NAME
sudo rm -rf $CATALINA_HOME/conf/Catalina
sleep 2
echo "`date "$FMT"` starting service..." >> $LOG
sudo ./bin/startup.sh >> $LOG || RETVAL=1
echo "`date "$FMT"` waiting..." >> $LOG
sleep 4
count="0"
until [ `netstat -nlt |grep -c $PORT` -eq "1" ] || \
[ "$count" -gt "40" ]; do
echo "waiting start..." >> $LOG
sleep 1
let count="${count}+1"
done
if [ $RETVAL -eq "0" -a `netstat -nlt |grep -c $PORT` -eq "1" ]; then
echo "`date "$FMT"` deployed successfully!" >> $LOG
else
echo "`date "$FMT"` deployed failed!" >> $LOG
if [ `netstat -nlt |grep -c $PORT` -eq "1" ]; then
sudo ./bin/shutdown.sh >> $LOG 2>&1
fi
sleep 3
echo "`date "$FMT"` recover the old .war file..." >> $LOG
#clean
echo "`date "$FMT"` do something cleaning..." >> $LOG
sudo rm -rf $CATALINA_HOME/webapps/$NAME
sudo rm -rf $CATALINA_HOME/webapps/../work/Catalina/localhost/$NAME
sudo rm -rf $CATALINA_HOME/conf/Catalina
echo "`date "$FMT"` recover the old backup file..." >> $LOG
sudo cp -f $BACKDIR/$NAME* $CATALINA_HOME/webapps/ && echo old file recovered... >> $LOG
sleep 4
sudo ./bin/startup.sh >> $LOG
fi
fi
参考:https://wiki.jenkins-ci.org/display/JENKINS/Standard+Security+Setup