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

【Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理】吾生也有涯,而知也无涯。这篇文章主要讲述Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理相关的知识,希望能为你提供帮助。
【背景】

  • 实际开发代码管理比较混乱,缺乏统一的集中管理。
  • 部署升级纯手工,流程重复繁琐,容易出错。
  • 代码质量没有管理,对于基本错误不能在第一时间发现。
【架构】
  • 针对以上情况,采取git管理代码,搭建企业内部自己的gitlab来管理上传代码。
  • 使用jenkins从gitlab拉取代码并进行编译,持续构建发布。
  • 采取jenkins的插件sonar scanne分析源码,将结果上传到sonarqube进行质量分析。
整体流程如下:
Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理

文章图片
【服务器资源】
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实现持续集成,质量管理

文章图片
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实现持续集成,质量管理

文章图片
重启
gitlab-ctl restart

看到如下信息代表启动成功
Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理

文章图片
浏览器访问:192.168.159.148:8888即可访问

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

文章图片
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实现持续集成,质量管理

文章图片
执行完毕后,重启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实现持续集成,质量管理

文章图片
2.3 启动后浏览器访问,进入jenkins初始化页面:
http://192.168.159.149:8080/jenkins

按照提示来安装即可。
Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理

文章图片
先选择推荐安装的插件即可,以后需要什么再安装什么。根据提示设置好第一个管理员账号后,可以看到如下界面,表示已安装成功。
Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理

文章图片
三、安装Sonarqube SonarQube 需要数据库的支持,用于存储检测项目后的分析数据,同时为了实现可持续监测,还需要持续集成工具(如Jenkins)的支持,在构建版本前,通过Jenkins+Sonar 插件执行项目分析指令,最终的结果会通过SonarQube 服务器的Web 页面展示。下图是使用SonarQube做代码持续审查的流程图:
Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理

文章图片
开发人员把代码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实现持续集成,质量管理

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

文章图片
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实现持续集成,质量管理

文章图片
下载的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实现持续集成,质量管理

文章图片
4.2 Jenkins安装所需插件 安装支持sonarqube的插件
Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理

文章图片
安装gitbab插件,安装publish over ssh
Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理

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

文章图片
4.3 系统配置: 系统管理--》全局工具配置 1、配置jdk,ant,sonrqube scanner ,ssh
Jenkins+Ant+Gitlab+Sonarqube+Docker实现持续集成,质量管理

文章图片
sonarqube scanner选用默认安装即可pubulish over ssh设置,采用ssh方式登录,按照如下设置,设置完之后,点击测试查看结果是否成功。2、配置sonar sonarqube登录,点击配置--》权限--》用户,点击生成token随便输入一个标识,例如输入jenkins,生成一个token,复制该tokenjenkins设置: 添加凭据,添加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="https://www.songbingjia.com/android/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=webdemosonar.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 \'\'\' sshroot@192.168.159.153 "sh /root/dockershell/check_image.sh" \'\'\' } //调用目标服务器脚本拉取镜像并且运行容器 stage(\'pull images & run\') { sh \'\'\' sshroot@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、本文中创建镜像,运行容器等参数是固定在脚本写定的,实际中应该将该操作的一些过程写成参数,创建或者运行时传递,这样更灵活一些,比如镜像名称,运行容器时候宿主机和容器内部端口等。

    推荐阅读