Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理

Posted 倾听小糖宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理相关的知识,希望对你有一定的参考价值。

【背景】
  • 实际开发代码管理比较混乱,缺乏统一的集中管理。
  • 部署升级纯手工,流程重复繁琐,容易出错。
  • 代码质量没有管理,对于基本错误不能在第一时间发现。
【架构】
  • 针对以上情况,采取git管理代码,搭建企业内部自己的gitlab来管理上传代码。
  • 使用jenkins从gitlab拉取代码并进行编译,持续构建发布。
  • 采取jenkins的插件sonar scanne分析源码,将结果上传到sonarqube进行质量分析。
整体流程如下:   \'Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理_jenkins\' 【服务器资源】
Gitlab : 192.168.159.148
Jenkins: 192.168.159.149
SonarQube:192.168.159.150
Web应用: 192.168.159.153 (模拟一台web应用服务器)
【搭建过程】 一、Gitlab 1.1 Gitlab是什么 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。 基础功能免费,高级功能收费 1.2. 为什么要使用Gitlab
  1. 基础功能开源,可自行搭建
  2. 可以进行权限控制,使得代码对部分人可见
  3. gitlab使用方便,非常适合企业内部使用
1.3 搭建过程
yum install vim lrzsz wget unzip zip -y 
cd /usr/local/src 
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.0.4-ce.0.el7.x86_64.rpm 
yum localinstall gitlab-ce-12.0.4-ce.0.el7.x86_64.rpm
看到如下界面,代表安装成功: \'Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理_jenkins_02\'
vim /etc/gitlab/gitlab.rb 
#修改external_url为gitlab主机的ip+要使用的端口 
如:http://192.168.159.148:8888 
#修改nginx[\'listen_port\'] = 8888
#重新配置
gitlab gitlab-ctl reconfigure
看到如下信息代表重新加载成功 \'Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理_sonarqube_03\' 重启
gitlab-ctl restart
看到如下信息代表启动成功 \'Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理_jenkins_04\'
浏览器访问:192.168.159.148:8888即可访问
\'Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理_jenkins_05\' 1.4 汉化 为了方便使用,可以采用汉化包来对gitlab进行汉化处理。
cd /usr/local/src 
#克隆汉化补丁仓库 
git clone https://gitlab.com/xhang/gitlab.git cd /usr/local/src/gitlab 
#获取对应版本的中文补丁 
git diff v12.0.4 v12.0.4-zh > ../12.0.4-zh.diff 
#将中文补丁导入
gitlab patch -d /opt/gitlab/embedded/service/gitlab-rails -p1 < 12.0.4-zh.diff
此时会出现如下页面,一路回车即可。 \'Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理_devops_06\' 执行完毕后,重启gitlab查看
gitlab-ctl start
浏览器查看发现已经汉化完成。 1.5 配置邮箱
修改gitlab配置
vim /etc/gitlab/gitlab.rb	
找到下面这一串文本,进行修改
gitlab_rails[\'smtp_enable\'] = true
gitlab_rails[\'smtp_address\'] = "smtp.qq.com"           //以qq邮箱举例
gitlab_rails[\'smtp_port\'] = 465
gitlab_rails[\'smtp_user_name\'] = "xxxxx@qq.com"
gitlab_rails[\'smtp_password\'] = "开通smtp时返回的字符"
gitlab_rails[\'smtp_domain\'] = "qq.com"
gitlab_rails[\'smtp_authentication\'] = "login"
gitlab_rails[\'smtp_enable_starttls_auto\'] = true
gitlab_rails[\'smtp_tls\'] = true
user[\'git_user_email\'] = "xxxxx@qq.com"
gitlab_rails[\'gitlab_email_from\'] = \'xxxxx@qq.com\'
#重新加载配置与启动
gitlab-ctl reconfigure
gitlad-ctl start
测试邮件服务是否正常
gitlab-rails console
Notify.test_email(\'接收方邮件地址\',\'邮件标题\',\'邮件内容\').deliver_now
按回车,测试发送
例如
Notify.test_email(\'1345098802@qq.com\',\'test\',\'hello\').deliver_now
  二、安装Jenkins 2.1 Jenkins是java语言开发的,需要jdk和tomcat,这两个安装和配置这里就不再描述。
官方网站: https://jenkins.io/zh/
2.2 直接将下载的war包放在tomcat目录webapps下面即可,启动tomcat即可。 \'Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理_sonarqube_07\' 2.3 启动后浏览器访问,进入jenkins初始化页面:
http://192.168.159.149:8080/jenkins
按照提示来安装即可。 \'Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理_devops_08\' 先选择推荐安装的插件即可,以后需要什么再安装什么。 根据提示设置好第一个管理员账号后,可以看到如下界面,表示已安装成功。 \'Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理_持续集成_09\' 三、安装Sonarqube SonarQube 需要数据库的支持,用于存储检测项目后的分析数据,同时为了实现可持续监测,还需要持续集成工具(如Jenkins)的支持,在构建版本前,通过Jenkins+Sonar 插件执行项目分析指令,最终的结果会通过SonarQube 服务器的Web 页面展示。下图是使用SonarQube做代码持续审查的流程图: \'Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理_jenkins_10\' 开发人员把代码push到SCM(如gitlab)【上图第2步】,jenkins构建定义好的job,然后通过jenkins 插件(sonar scanner)分析源码【上图第3步】,jenkins把分析报告发到sonarqube server【上图第4步】。 前置依赖:注意安装sonarqube时,需要看一下官网版本需要依赖哪些东西,本文采用sonarqube6.7版本,支持的mysql是5.6和5.7版本。 mysql 5.6 or 5.7 jdk 1.8 jdk安装这里就不记录了,主要记录一下mysql安装,以mysql5.6.45为例 3.1 源码编译安装mysql
yum install -y wget gcc gcc-c++ make tar openssl openssl-devel cmake ncurses ncurses-devel
useradd -s /sbin/nologin mysql     #创建mysql用户用于启动
cd /usr/local/src
wget https://cdn.mysql.com//Downloads/MySQL-5.6/mysql-5.6.45.tar.gz
tar -zxvf mysql-5.6.45.tar.gz
cd mysql-5.6.45
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS:STRING=all -DWITH_DEBUG=0 -DWITH_SSL=yes -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1
make && make install
cp support-files/mysql.server /etc/init.d/mysqld
chmod a+x /etc/init.d/mysqld
 
编译选项说明
 CMACK_INSTALL_PREFIX指定安装的目录
 MYSQL_DATADIR指定Mysql的数据目录
 
mysql环境变量配置  etc/profile  
export PATH=$PATH:/usr/local/mysql/bin/  
  3.2 更新mysql配置/etc/my.cnf
[mysqld]
bind-address=0.0.0.0
port=3306
datadir=/data/mysql
user=mysql
skip-name-resolve
slow_query_log=1   #开启慢sql记录,0为关闭,1为开启
long_query_time=2
slow_query_log_file=/data/mysql/mysql-slow.log
expire_logs_days=2
innodb-file-per-table=1
innodb_flush_log_at_trx_commit = 2
log=/data/mysql/mysql.log
log_warnings = 1
max_allowed_packet = 512M
connect_timeout = 60
net_read_timeout = 120
 
[mysqld_safe]
log-error=/data/mysql/mysqld.log
pid-file=/data/mysql/mysqld.pid
 
mysql数据库初始化
mkdir -pv /data/mysql          //创建数据目录
chown -R mysql:mysql  /usr/local/mysql /data/mysql/        //赋权
yum install -y perl-Module-Install
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --user=mysql  --datadir=/data/mysql/          //初始化数据
 
 
使用systemctl管理mysqld,/usr/lib/systemd/system/mysqld.service
[Unit]
Description=mysqld
After=network.target
[Service]
Type=forking
ExecStart=/etc/init.d/mysqld start
[Install]
WantedBy=multi-user.target
 #启动mysql验证
systemctl start mysqld
  3.3 下载(安装不同版本时候去官网看一下都需要哪些要求)
https://www.sonarqube.org/
如图所示:sonarqube的6.7版本需要支持Jdk8版本,Mysql的话需要5.6或者5.7版本。 \'Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理_devops_11\'   \'Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理_devops_12\' 3.4 安装unzip并解压sonarqube并移动到/usr/local
yum install unzip -y
unzip sonarqube-6.7.7.zip
mv sonarqube-6.7.7 /usr/local/
3.5 mysql里新增数据库
CREATE DATABASE sonar DEFAULT CHARACTER SET utf8;
3.6 修改sonarqube相应的配置
vim /usr/local/sonarqube-6.7.7/conf/sonar.properties
sonar.jdbc.username=root           //数据库用户名
sonar.jdbc.password=123456         //密码
sonar.jdbc.url=jdbc:mysql://192.168.159.150:3306/sonar?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
sonar.web.context=/sonar
sonar.web.host=0.0.0.0
3.7 新增用户,并将目录所属权赋予该用户
useradd -s sbin/nologin/ sonar         #添加一个启动sonar的用户,不允许其登录
chown -R sonar:sonar sonarqube-6.7.7/
3.8 启动
su - soanr  -s /bin/bash   #切换sonar用户启动
/usr/local/sonarqube-6.7.7/bin/linux-x86-64/sonar.sh start
3.9 界面访问
http://192.168.159.150:9000/sonar
3.10 汉化 https://github.com/SonarQubeCommunity/sonar-l10n-zh 在该地址查看自己的版本所对应的汉化包版本,下载对应的汉化包jar,我这里用的是6.7.7版本,对应的汉化包版本是1.19。 \'Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理_devops_13\' 下载的jar包放到这个目录下,然后重启sonarqube
/usr/local/sonarqube-6.7.7/extensions/plugins
浏览器观察,发现已经汉化完成,默认登录账号密码为:admin/admin 四、总体配置 4.1 环境配置 jenkins服务器安装java编译环境ant https://ant.apache.org/
#下载ant装包
wget https://archive.apache.org/dist/ant/source/apache-ant-1.9.13-src.tar.gz
tar -xzvf apache-ant-1.9.13-src.tar.gz
cd apache-ant-1.9.13 
sh build.sh
sh bootstrap.sh
mkdir -pv /usr/local/ant/
cd dist
cp -r bin /usr/local/ant
cp -r lib /usr/local/ant
vim etc/profile
#添加环境变量
export ANT_HOME=/usr/local/ant/
export PATH=$PATH:$ANT_HOME/bin
source etc/profile
验证
ant -version
  \'Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理_sonarqube_14\' 4.2 Jenkins安装所需插件 安装支持sonarqube的插件 \'Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理_jenkins_15\' 安装gitbab插件,安装publish over ssh \'Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理_devops_16\'   \'Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理_devops_17\' 4.3 系统配置: 系统管理--》全局工具配置 1、配置jdk,ant,sonrqube scanner ,ssh   \'Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理_sonarqube_18\'   sonarqube scanner选用默认安装即可 pubulish over ssh设置,采用ssh方式登录,按照如下设置,设置完之后,点击测试查看结果是否成功。 2、配置sonar sonarqube登录,点击配置--》权限--》用户,点击生成token 随便输入一个标识,例如输入jenkins,生成一个token,复制该token jenkins设置: 添加凭据,添加secert text类型,此种类型一般保存的是一些access token,例如gitlab或者sonar等,添加sonar的token。 管理jenkins---》Configure System--》sonarQube server设置 3、配置gitlab授权 Credentials--》system--》Global credentials 添加一个ssh登录,输入用户名即可,最好使用启动jenkins的用户设置,比如本文的tomcat使用jenkins用户启动的,所以username输入的是jenkins,private key输入秘钥中/home/jenkins/.ssh/id_rsa中内容 4、配置免密登陆,允许jenkins从gitlab中拉取代码。
jenkins服务器登录输入
ssh-keygen -t rsa -- 产生私钥
本文中服务器的tomcat使用jenkins用户启动的 配置git登陆 将Jenkins所在机子的公钥 cat home/jenkins/.ssh/id_rsa.pub 的内容拷贝到gitlab项目上 4.4 gitlab设置 将上一步公钥的内容复制到这里,用户设置--》SSH秘钥 验证一下配置是否正确 jenkins中配置如下,这里使用仓库方式为ssh方式,如果没有提示报错,即代表jenkins与gitlab配置正确,这里我们选择从git的master分支拉取代码。 4.5 构建ant配置:增加构建步骤,选择Invoke Ant 指定构建build.xml 附录:本例中build.xml如下:
<?xml version="1.0" encoding="UTF-8"?>  
  
<!-- 定义一个工程,默认任务为warFile。 -->  
<project name="WebDemo" default="warFile" basedir=".">  
      
    <!-- 定义属性,打成war包的名称。 -->  
    <property name="warFileName" value="webdemo.war"></property>  
      
    <!-- 定义路径,编译java文件时用到的jar包。 -->  
    <path >  
        <fileset dir="${basedir}/WebRoot/WEB-INF/lib">  
            <include name="**/*.jar"/>  
        </fileset>  
    </path>  
      
    <!-- 定义任务,清空任务:清空原有的class文件,创建新的build路径。 -->  
    <target name="clean">  
        <delete dir="${basedir}/build" />  
        <mkdir dir="${basedir}/build" />  
    </target>  
      
    <!-- 定义任务,编译src文件夹中的java文件,编译后的class文件放到创建的文件夹下。 -->  
    <target name="compile" depends="clean">  
        <javac srcdir="${basedir}/src" destdir="${basedir}/build" includeantruntime="false">  
            <classpath ref>  
            </classpath>  
        </javac>  
    </target>  
      
    <!-- 定义默认任务,将class文件集合成jar包。 -->  
    <target name="warFile" depends="compile">  
        <!-- 删除原有war包。 -->  
        <delete dir="${basedir}/${warFileName}" />  
        <!-- 建立新war包。 -->  
        <war destfile="${basedir}/${warFileName}" webxml="${basedir}/WebRoot/WEB-INF/web.xml">  
            <!-- 将非jar和非class文件拷贝到war包的对应路径下。 -->  
            <fileset dir="${basedir}/WebRoot">  
                <include name="**/**.*" />  
                <exclude name="**/*.jar"/>  
                <exclude name="**/*.class"/>  
            </fileset>  
            <!-- 将jar和class文件拷贝到war包的对应路径下。 -->  
            <lib dir="${basedir}/WebRoot/WEB-INF/lib" />  
            <classes dir="${basedir}/build" />  
        </war>  
    </target>  
</project>
  4.6 jenkins中构建ssh操作配置 填入以下信息,当我们构建成功之后,使用ssh将包发送给远程主机,并且调用远程主机的restart-tomcat.sh脚本来对包进行转移,备份,重启tomcat等操作。 其中Remote directory为我们发送的远程主机路径,和之前我们在系统设置里面配置ssh的remote Directory共同组成路径,该配置为将包发送到远程主机的tmp/fetchweb路径下。 附录:restart-tomcat.sh脚本
#!bin/bash
echo "backup webdemo..."
time=`date +%Y%m%d%H%M`
delete_date=`date +%Y%m%d -d \'-2 day\'`
backDir=/opt/webBack
[ ! -d $backDir ] && mkdir $backDir
find $backDir -name "webapps${delete_date}*.tar.gz" -exec rm -rf {} \\;
cd $backDir
tar -cvzf webapps$time.tar.gz /usr/local/apache-tomcat-8.5.6/webapps/webdemo/
echo "backup complete!"
sleep 2
echo "***************"
echo "begin copy file to webapps..."
cp -r /tmp/fetchweb/Webdemo/build/*  /usr/local/apache-tomcat-8.5.6/webapps/webdemo/WEB-INF/classes
cp -r /tmp/fetchweb/Webdemo/WebRoot/*.jsp  /usr/local/apache-tomcat-8.5.6/webapps/webdemo/
echo "copy complete!"
echo "***************"
echo "begin restart tomcat..."
sh /usr/local/apache-tomcat-8.5.6/bin/shutdown.sh 
sleep 2
sh /usr/local/apache-tomcat-8.5.6/bin/startup.sh
tomcat_port=`netstat -na | grep 8080 | wc -l | awk \'{print $1}\'`
if [ "$tomcat_port" -eq 1 ];then
   echo "****************"
   echo "tomcat start sucessfully!"
fi
4.7 jenkins中sonar配置 项目设置里面构建增加操作: JDK选择我们在全局工具中设置的jdk 以下为sonar分析时参数:
 #required metadata
#projectKey项目的唯一标识,不能重复
sonar.projectKey=webdemo
sonar.projectName=webdemo

sonar.projectVersion=1.0 
sonar.sourceEncoding=UTF-8
sonar.modules=java-module
# Java module
java-module.sonar.projectName=test
java-module.sonar.language=java
# .表示projectBaseDir指定的目录
java-module.sonar.sources=src
java-module.sonar.projectBaseDir=./Webdemo
java-module.sonar.java.binaries=build
  五、验证流程 5.1 有一个简单web项目部署在153上面,我们修改一下代码看看效果。 java程序中修改登录密码为111111,然后上传到gitlab中。 5.2 查看gitlab 代码已经上传 5.3 jenkins构建观察 查看构建日志:显示构建成功 浏览器验证项目 使用密码111111可以登录,其余无法登录,说明程序发布成功。   sonarqube查看是否有项目上传分析,发现我们的项目代码已经上传至sonarqube分析   查看一下服务器是否有备份 已经生成了项目备份 至此,说明我们整个持续流程已经跑通。 修改代码----》上传gitlab----》jenkins拉取代码编译----》分发到不同服务器----》备份项目,覆盖升级包到项目目录,重启tomcat---》上传至sonarqube分析   附1:采用webhook实现自动构建: 上述流程是需要手动点击jenkins的立即构建才可以生效,如果要想达到gitlab一有代码就更新,需要做到自动触发jenkins构建,我们要实现一个git钩子功能,就是我们向gitlab等远程仓库push我们的代码时,jenkins能知道我们提交了代码,这是自动构建自动部署的前提。钩子的实现原理是在远端仓库上配置一个Jenkins服务器的接口地址,当本地向远端仓库发起push时,远端仓库会向配置的Jenkins服务器的接口地址发起一个带参数的请求,jenkins收到后开始工作。 要如下配置: 1、jenkins插件安装gitlab插件。 2、配置jenkins 在项目中构建触发器选择如下,选项皆可以默认,点击高级生成token 点击高级后,点击下面Generate,生成token,此token需要在gitlab中配置。生成后,点击保存。 3、gitlab中设置增加web钩子 管理员账号登录gitlab 管理员设置--》设置(settings)--》network--》Outbound requests打开允许钩子和服务访问本地网络,如果不打开这个选项,项目中配置时候会提示网络不通。 项目中设置---》集成(链接和令牌输入jenkins上面刚才生成的链接和令牌),点击增加web钩子即可。 设置完之后点击测试:点击Test--->push events模拟一次push操作,验证钩子是否正常。   提示HTTP200代表配置正常 4、验证一下: 修改一下代码,提交查看结果 修改登录密码为123456,上传到gitlab查看结果   gitlab中已经上传 jenkins查看构建 已经触发了自动构建,是gitlab触发的 sonarqube已经有最新分析结果 查看项目 已经验证成功,使用最新的密码123456可以登录 至此代码上传至gitlab自动触发jenkins构建已经成功。   附2:采用Pipeline+Blueocean实现构建可视化 1、安装支持的插件,安装如下两个插件   2、安装好之后,主界面增加了blue ocean选项 3、点击blue ocean进入。 新界面如下:点击创建流水线 我们的代码仓库是git,就选择git,输入git仓库地址,自动会生成ssh公钥,复制到gitlab中。然后点击创建流水线。 gitlab中添加ssh公钥   4、创建流水线 按照以下步骤创建拉取代码,编译,分发的流水线 点击save run后,查看结果,正常。说明该步骤拉取代码正常,我们接下来增加其他步骤。   增加编译: 增加分发编译后项目并且重启tomcat: 5、验证 点击运行后,查看发现构建成功,也可以直观的看到每个步骤的状态,界面会比较直观好看一些。   切换到jenkins经典模式查看也是显示成功的:和blueocean显示一样 查看应用服务器153的tomcat,也是刚刚启动的 访问正常:   查看gitlab我们创建的blueocean任务会自动生成pipeline上传至gitlab   至此,通过blueocean创建流水线已经验证成功。   附3:使用Jenkins+Docker持续集成 我们改造一下上述持续集成的流程,使用docker来管理项目。这样我们的流程变为: 代码上传至gitlab---》jenkins拉取代码编译---》生成镜像--》push到镜像仓库Harbor--》目标应用服务器pull镜像---》运行容器--》浏览器验证   1、安装镜像仓库Harbor Harbor离线版安装下载地址  https://github.com/goharbor/harbor/releases  下载离线安装的版本,上传到服务器,解压 在jenkins这台服务器上面安装(192.168.159.149)   验证:使用浏览器访问: http:192.168.159.149,账号为admin,密码为配置文件设置的密码,如本文设置的123456 以下为系统进去界面,表示安装成功
安装命令
 tar -zxf harbor-offline-installer-v1.8.0.tgz
 mv harbor /usr/local/
 
配置更改harbor.yml
 改主机名
 hostname
 改密码
 harbor_admin_password: 123456
 
安装Harbor,并验证
 ./install.sh
 docker-compose ps
 访问Harbor,默认用户名admin
 
Harbor的重启
 docker-compose down
 docker-compose up -d
我们建立一个项目webdemo,一会儿存储我们上传的镜像。 2、创建一个pipeline类型的任务 以下为我们的pipeline脚本:
node {
      //拉取代码
   stage(\'Checkout code from Gitlab\') { 
      // Get some code from a GitLub repository
      git credentialsId: \'9ff06824-4825-4509-977a-1965a6f5a378\', url: \'git@192.168.159.148:wsxa/myweb.git\'
   }
    //编译代码
     stage(\'Ant invoke\') { 
                      sh \'\'\' 
                      ant -f ./Webdemo/build.xml
                      \'\'\'
   }
   //创建镜像
    stage(\'Build Image\') { 
                      sh \'\'\' 
                      echo "build new image!"
                      docker build -t webdemo_tiankai:1.0 ./Webdemo/
                      echo "build comlete!"
                      \'\'\'
   }
   //打标签上传镜像至harbor
     stage(\'Push Image to Harbor\') { 
                      sh \'\'\' 
                      echo "push new image to harbor"
                      docker tag webdemo_tiankai:1.0 192.168.159.149/webdemo/webdemo:1.0
                      docker login 192.168.159.149 -uadmin -ptiankai@0114
                      docker push 192.168.159.149/webdemo/webdemo:1.0
                      echo "push new image to harbor complete! "
                      \'\'\'
   }
     //调用目标服务器脚本删除旧的容器和镜像
      stage(\'destory old images\') { 
                      sh \'\'\' 
                      ssh  root@192.168.159.153 "sh /root/dockershell/check_image.sh"
                      \'\'\'
   }
    //调用目标服务器脚本拉取镜像并且运行容器
      stage(\'pull images & run\') { 
                      sh \'\'\' 
                      ssh  root@192.168.159.153 "sh /root/dockershell/pull_run.sh"
                      \'\'\'
   }
 
}
其中远程服务器的check_image.sh脚本如下:
#!bin/bash
DOCKER_IMAGE=`docker images | grep "webdemo" | awk  \'{print $3}\'`
if [ -n "${DOCKER_IMAGE}" ]; then
        # check docker container
        for dc in `docker ps -a | grep "webdemo" | awk -F " " \'{print $1}\'`
        do
                echo "Stop container: ${dc}"
                docker stop ${dc}
                # delete while docker container was exists
                echo "##Delete exists Container_Id: "${dc}
                docker rm ${dc}
        done
        # delete while docker image was exists
        echo "##Delete exists Image: webdemo"
        docker rmi  ${DOCKER_IMAGE}
fi
echo ""
pull_run.sh脚本如下:
#!bin/bash
docker pull 192.168.159.149/webdemo/webdemo:1.0
sleep 10
docker run --name webdemo -d -p 7000:8080 192.168.159.149/webdemo/webdemo:1.0
echo "Container started!"
3、添加运行jenkins的用户jenkins加入到docker组 由于我们tomcat是使用jenkins用户启动的,并非是root用户,要想执行docker等相关命令,需要将jenkins用户加入到docker组,采用如下命令。
sudo gpasswd -a jenkins docker #将当前用户添加至docker用户组
systemctl restart docker    #重启docker
  如果不执行如上操作,会报以下没有权限的错误:   4、构建任务查看,各个环节均已成功   查看镜像仓库harbor,已经有我们上传的镜像 查看目标服务器镜像与容器,发现已经有镜像和容器了,并且容器是启动状态 浏览器验证应用 服务已经成功 至此jenkins结合docker持续集成流程验证成功。 备注:项目中使用的Dockerfile内容如下:
From centos_tomcat:latest   #该镜像为已经创建好的基础镜像,包含了jdk和tomcat
MAINTAINER tiankai@qq.com
COPY ["webdemo.war", "/usr/local/tomcat/webapps/"]
EXPOSE 8080
CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
  注意:1、如果不用开发工具上传代码测试(例如Myelipse等),要想在本机使用git免密上传代码到gitlab,建议也采取本机生成秘钥形式,复制公钥到gitlab的ssh keys里面,就可以达到直接通过ssh方式上传代码,不用每次都要输入账号密码。 2、通过ssh执行远程脚本时候,需要导入环境变量,比如通过blueocean执行远程脚本时候,远程脚本需要导入etc/profile,例如本例中的blueocean.sh
#!bin/bash
source  /etc/profile           #导入环境变量
cd /tmp/blueocean/Webdemo
cp -r * /usr/local/apache-tomcat-8.5.6/webapps/webdemo/
sh /usr/local/apache-tomcat-8.5.6/bin/shutdown.sh 
sleep 2
sh /usr/local/apache-tomcat-8.5.6/bin/startup.sh
3、使用docker升级目标服务器的时候,目标服务器也需要安装docker。 4、本文中创建镜像,运行容器等参数是固定在脚本写定的,实际中应该将该操作的一些过程写成参数,创建或者运行时传递,这样更灵活一些,比如镜像名称,运行容器时候宿主机和容器内部端口等。

以上是关于Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理的主要内容,如果未能解决你的问题,请参考以下文章

基于Gitlab+Jenkins的代码自动化发布

jenkins+ant+junit怎样输出报告

持续集成:Jenkins部署

怎么解决jenkins运行ANT出现失败,但是本机shell运行ANT正常问题。

Jenkins+Ant+JMeter集成

jmeter+ant+jenkins