Java开发流程自动化(svn+maven+nexus+jenkins) --自动编译,持续集成,测试,打包,发布/部署

本文已迁移到我的新博客地址:blog.favorstack.io 欢迎访问~

二 配置篇

 

 

1.     安全管理

Jenkins的权限管理是这样的,你如果启用安全,需要先添加一个即将使用的用户,并分配权限(至少要有管理员权限),保存后会跳到首页注册,这里就使用刚添加的用户来注册,输入用户名密码保存即可。如果事先没有为新注册的用户分配权限,这里就会导致你无法再登录了。

1).点击系统管理->安全设置

2).点击“启用安全”,在“安全域”下勾选“Jenkins专有用户数据库”,注意第一次一定要保留“允许用户注册”的勾选,否则点击保存后无法再登录了。

3).”授权策略“下,选择“安全矩阵”

4).在"添加用户/组"输入框输入一个名称"admin",点击添加,作为管理员,然后将该用户下的所有复选框都勾选上。

Java开发流程自动化(svn+maven+nexus+jenkins) --自动编译,持续集成,测试,打包,发布/部署_第1张图片

 

5).点击保存,这时会跳到登录注册页面,因为我们还有没有用户,这时就需要新注册一个,点击“创建一个用户账号“,注意这里新注册的用户名不是随便取的,就是刚才在授权策略下新添加的那个用户,这就是为什么我们需要先授权再注册,输入各个信息后保存即可,这样就完成了第一个用户的创建。

6).重新点击“系统管理”,然后点击”Configure Global Security“,此时将”允许用户注册“的勾选去掉,我们不允许用户注册,采用管理员新建用户并分配权限的方式统一管理。当然这里可以根据需要自行选择。

7.新增用户:;

1).点击系统管理->管理用户->新建用户

2).输入新的用户名密码即可。

 可以为团队的每个人员新增一个用户,并根据实际情况分配权限。

 

2.进入“系统管理”->“系统设置”

点击新增JDK,去掉自动安装前边的复选框,我们使用自己安装的JDK,在别名处输入JDK的别名,JAVA_HOME变量则输入Jenkins所在服务器的jdk路径即可:

Java开发流程自动化(svn+maven+nexus+jenkins) --自动编译,持续集成,测试,打包,发布/部署_第2张图片

 

 

 

 

 

同样,点击新增Maven,配置好我们自己安装的Maven.

3.配置系统管理员邮件地址

一定要注意这里的邮件地址,这个用户必须与下面邮件通知处的用户保持一致,否则无法发送通知邮件!:

Java开发流程自动化(svn+maven+nexus+jenkins) --自动编译,持续集成,测试,打包,发布/部署_第3张图片

 

我们用的svn,这里也一并将版本改一下,改到1.7.

 

4.配置邮件通知:

在邮件通知右下角点击”高级”:

在SMTP服务器中填入你使用邮箱的发件服务器(具体查询自己的邮件服务提供商),我们使用的163的企业邮箱,输入用户名密码,注意这里的用户名即上边配置的系统管理员邮件地址,具体配置如下:

Java开发流程自动化(svn+maven+nexus+jenkins) --自动编译,持续集成,测试,打包,发布/部署_第4张图片

 

配置完可勾选”通过发送测试邮件测试配置”来进行测试一下是否正确:

 

 

 

 

如果报错了,请仔细检查上下邮件地址是否一致,并且邮件的发件服务器是否正确。

 

5.配置SSH服务器:

 

点击增加,点击高级,我们使用用户名密码的验证方式,注意远程目录输入的必须是一个已存在的目录,这里演示用的是/tmp下的目录,实际中应该换成其他目录比如/opt下,因为/tmp目录下的东西在重启后可能会自动删除:

Java开发流程自动化(svn+maven+nexus+jenkins) --自动编译,持续集成,测试,打包,发布/部署_第5张图片

 

至此配置完毕,我们可以点击右边的测试按钮测试一下是否成功。

注意,这里对目标主机上的ssh版本会有要求,如果你的OpenSSH版本高于6.7,则无法连接:

jenkins.plugins.publish_over.BapPublisherException: 

Failed to connectsession for config [test(192.168.1.52)]. Message [Algorithm negotiation fail]

 

Java开发流程自动化(svn+maven+nexus+jenkins) --自动编译,持续集成,测试,打包,发布/部署_第6张图片

 

 

 

据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

 

这时我们再测试一下,发现没有问题了:

Java开发流程自动化(svn+maven+nexus+jenkins) --自动编译,持续集成,测试,打包,发布/部署_第7张图片

 

 

 

 

如果不想用这种方式,可以换成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首页,点击新建,我们新建一个自由风格的软件项目,默认配置都不许要改,我们在构建下增加一个构建步骤,用来模拟构建过程:

Java开发流程自动化(svn+maven+nexus+jenkins) --自动编译,持续集成,测试,打包,发布/部署_第8张图片

 

 

 

输入:echo thisis a test build from jenkins > build.log

进入最下边的”构建后操作“下拉列表,选择:Send Build artifacts over SSH 一项:

Java开发流程自动化(svn+maven+nexus+jenkins) --自动编译,持续集成,测试,打包,发布/部署_第9张图片

 

 

 

Java开发流程自动化(svn+maven+nexus+jenkins) --自动编译,持续集成,测试,打包,发布/部署_第10张图片

 

 

远程主机上可以找到我们上传的文件:

Java开发流程自动化(svn+maven+nexus+jenkins) --自动编译,持续集成,测试,打包,发布/部署_第11张图片

 

 

 

 

这样就可以执行管理员命令了,到现在为止,所有系统方面的配置全都完成,接下来就可以配置我们的具体构建任务了。

本文已迁移到我的新博客地址: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

 

本文已迁移到我的新博客地址:blog.favorstack.io 欢迎访问~

 

 

你可能感兴趣的:(项目管理,JavaEE)