自动编译,持续集成,测试,打包,发布/部署

一 安全管理

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

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

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

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

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

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

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

7).新增用户:;

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

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

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

二 JDK和Maven配置

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

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

三 邮件配置

1 配置系统管理员邮件地址

一定要注意这里的邮件地址,这个用户必须与下面邮件通知处的用户保持一致,否则无法发送通知邮件!:
2019-03-17T05:03:39.png
我们用的svn,这里也一并将版本改一下,改到1.7.

2 配置邮件通知

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

在SMTP服务器中填入你使用邮箱的发件服务器(具体查询自己的邮件服务提供商),我们使用的163的企业邮箱,输入用户名密码,注意这里的用户名即上边配置的系统管理员邮件地址,具体配置如下:
2019-03-17T05:04:27.png
配置完可勾选”通过发送测试邮件测试配置”来进行测试一下是否正确:
2019-03-17T05:04:37.png
如果报错了,请仔细检查上下邮件地址是否一致,并且邮件的发件服务器是否正确。

四 配置SSH服务器

1 鉴权设置

点击增加,点击高级,我们使用用户名密码的验证方式,注意远程目录输入的必须是一个已存在的目录,这里演示用的是/tmp下的目录,实际中应该换成其他目录比如/opt下,因为/tmp目录下的东西在重启后可能会自动删除:
2019-03-17T05:05:10.png
至此配置完毕,我们可以点击右边的测试按钮测试一下是否成功。

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

jenkins.plugins.publish_over.BapPublisherException:

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

2019-03-17T05:05:43.png
据StackoverFlow上的一个帖子说,ssh升级后,为了安全,默认去掉了一些不安全的加密算法,一种解决办法是,我们将这部分算法再手动添加进去:

sudo vi/etc/ssh/sshd_config

注意这是一行:

KexAlgorithmscurve25519-sha256@libssh.org,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

这时我们再测试一下,发现没有问题了:
2019-03-17T05:06:24.png

如果不想用这种方式,可以换成ssh免密码登录的方式认证,这里就不说这种情况了,网上贴子很多,也可参考之前的文章ssh免密码登录服务器设置

2 特殊配置

这里还要针对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首页,点击新建,我们新建一个自由风格的软件项目,默认配置都不需要改,我们在构建下增加一个构建步骤,用来模拟构建过程:
2019-03-17T05:08:44.png

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

进入最下边的”构建后操作“下拉列表,选择:Send Build artifacts over SSH 一项:
2019-03-17T05:09:20.png
2019-03-17T05:09:29.png
远程主机上可以找到我们上传的文件:
2019-03-17T05:09:39.png

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

3 完整脚本

最后,附上一个远程部署的完整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


注: 本文原文最初发表在我的CSDN博客,现归档于此。
文章目录