《jenkins+maven+gitlab+ansible自动化发布java项目》
1.自动化部署流程
(1)首先研发提交代码到gitlab的项目分支上。
(2)Jenkins监听对应的gitlab 分支是否有变化。
(3)如果gitlab分支有变化,jenkins拉取对应分支代码到jenkins服务器上。
(4)jenkins通过配置好的脚本进行对应分支项目的编译,打包。
(5)enkins在上边操作完成后,将需要打成镜像的Dockerfile文件,以及打镜像需要的文件拷贝到jenkins的当前构建项目的目录中,设置用户名密码自动登陆到harbor 仓库,拉取dockerfile需要的基础镜像,并开始使用dockerfile构建镜像。
(6)镜像构建完成后,并且推送镜像到仓库对应的项目目录下,这个项目目录是提前定义好的,基础镜像传到基础镜像项目中,研发镜像传到研发镜像项目中,测试对测试,生产对生产。
(7)上传打好的镜像到对应镜像仓库项目后,jenkins调用对应的ansible去进行对应环境的服务部署,首先是通过用户和密码登陆到harbor仓库,然后拉取刚打好的上传的镜像,删除原环境上相同的容器,最后启动新镜像对应的新容器,具体部署到什么环境,这个是从一开始jenkins拉取代码的时候就定义好了的,自此jenkins完成了从代码的拉取,编译,打包,发布整个自动化流程。
(8)遇到的问题
8.1Jenkins不能拉取Gitlab上的对应代码,git 已经将jenkins服务器的ssh公钥也配置到当前git用户下了,登陆git的用户也是项目的管理着了,另外使用http可以clone到jenkins服务器上,sshgit就不行,最后配置了git 的内网主机hosts可以了
8.2使用jenkins调用ansible 部署的时候,第一次调用报错了,第一因为要部署的环境没有存放jenkins主机的公钥,第二是在做好免密的时候又保存了,因为第一次ssh登陆有个yes认证,需要手动第一次输入,也可以使用ansible的ping尝试是否可用。
8.3jenkins构建脚本中每次构建前删除构建目录下之前构建好的包,防止多次打包混乱。
8.4jenkins构建脚本中的目录,以及ansible 中的目录一定写对。
2.机器配置
服务器名称 | IP地址 | 操作系统 | 机器配置 | 标准部署目录 | 备注 |
jenkins服务器 | 192.168.181.255 | centos7.8 | 8H/16G/4T | /app | 机器为硬件服务器 |
gitlab服务器 | 192.168.180.189 | centos7.8 | 8H/16G/4T | /app | 机器为虚拟机 |
3.jenkins部署
(1)Tomcat下载,我选择apache-tomcat-8.5.63.tar.gz版本
Tomcat下载地址:https://tomcat.apache.org/download-80.cgi/
(2)Maven下载,我选择pache-maven-3.6.3-bin.tar.gz版本
wget https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
(3)JDK下载,我选择jdk1.8.0_144版本
https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html
(4)git命令下载,我选择版本git version 1.8.3.1版本
yum -y install git
(5)jenkins下载,我选择2.281版本
http://mirrors.jenkins-ci.org/war/2.281/jenkins.war
(6)jenkins部署
#将下载好的jenkins.war包拷贝到tomcat默认的发布目录并解压,并启动tomcat即可。
cp -rf /root/jenkins.war /app/apache-tomcat-8.5.63/webapps/ROOT
jar -xvf jenkins.war && rm -f jenkins.war
cd /app/apache-tomcat-8.5.63/bin && /startup.sh
#至此jenkins部署完成。
2.gitlab部署(docker部署)
部署机器地址:gitlab服务器(192.168.180.189)
(1)启动gitlab容器
1 cat /app/gitlab/shell/gitlab.sh 2 #!/bin/bash 3 docker run 4 -itd 5 -p 9980:80 6 -p 9922:22 7 -v /app/gitlab/etc:/etc/gitlab 8 -v /app/gitlab/log:/var/log/gitlab 9 -v /app/gitlab/opt:/var/opt/gitlab 10 -v /app/gitlab/data:/mnt/nfs-01/git-data 11 --restart always 12 --privileged=true 13 --name gitlab 14 gitlab/gitlab-ce
(2)修改gitlab配置文件
cat /app/gitlab/etc/gitlab.rb
#添加三行:
external_url 'http://192.168.180.189'
gitlab_rails['gitlab_ssh_host'] = '192.168.180.189'
gitlab_rails['gitlab_shell_ssh_port'] = 9922
cat /app/gitlab-test/opt/gitlab-rails/etc/gitlab.yml
#修改如下配置:
## GitLab settings
gitlab:
## Web server settings (note: host is the FQDN, do not include http://)
host: 192.168.180.189
port: 80
https: false
# Otherwise, ssh host will be set to the `host:` value above
ssh_host: 192.168.180.189
# If you use non-standard ssh port you need to specify it
ssh_port: 9922
(3)进入到gitlab容器重新加载gitlab配置
gitlab-ctl reconfigure
gitlab-ctl restart
或:
重启gitlab容器
docker restart gitlab
(4)登陆gitlab的web界面
#浏览器输入:http://192.168.180.189:9980/
#第一次访问默认是root账户,会需要修改密码(密码至少8位数,出现如下界面就基本上部署成功了)
(5)gitlab web界面操作(简单演示)
#创建一个用户
#创建一个项目
#完成后根据项目下边给出的命令在gitlab服务器进行配置
(6)gitlab服务器连接web页面命令
1 #添加全局配置 2 git config --global user.name "lipc" 3 git config --global user.email "lipc@yuntongxun-l.com" 4 5 #克隆命令 6 git clone ssh://git@192.168.180.189:9922/lipc/my-test.git 7 #克隆指定分支的项目 8 git clone -b dev ssh://git@192.168.180.189:9922/my-test.git 9 #推送命令 10 git add . 11 git commit -m "add dockerfile1" 12 git push -u origin master 13 14 #删除master或者指定分支下的内容 15 git clone -b master ssh://git@192.168.180.189:9922/my-test.git 16 cd web 17 rm -rf * 18 git add -A 19 git commit -m "del " 20 git push origin master 21 22 23 #查看远程仓库的分支 24 git branch -a
(7)推送java源码到gitlab仓库
#克隆指定分支到/app/gitlab/package,然后删除下边的内容,推送新的代码到gitlab的my-test项目中的devops分支中
1 cd /app/gitlab/package 2 git clone -b devops ssh://git@192.168.180.189:9922/my-test.git 3 cd web 4 rm -rf * 5 git add -A 6 git commit -m "del " 7 git push origin devops 8 9 cp -rf /root/java-src/* /app/gitlab/package #复制java源码到gitlab推送目录 10 11 git add . 12 git commit -m "add" 13 git push origin devops
注意:由于笔记是后边补的,所以笔记中项目名称更换了下,效果是一样的,请大家谅解。
注意:至此gitlab的介绍基本完成,我这边主要是配合介绍jenkins自动化流程,所以gitlab就不详细介绍了,如有其他的疑问,请大家留言或者自行百度。。。
注意:另外以上gitlab所有的操作均是在gitlab服务器上操作。
3.gitlab配置jenkins认证(ssh公钥)
(1)在jenkins服务器上使用ssh-keygen生成密钥对,私钥id_rsa和公钥 id_rsa.pub
(2)复制jenkins服务器的公钥 id_rsa.pub里边的内容到gitlab的web页面进行配置
4.项目自动化编译使用的dockerfile目录与文件规范
注意:自动化最好创建标准的目录,不要都放在一起
说明:基础镜像是固定不变的东西打成的镜像,一般情况会手动进行打包,然后传送到harbor镜像仓库中,在jenkins自动化编译部署的时候作为基础镜像来构建业务镜像。
(1)基础镜像编译
/app/dockerfile #dockerfile标准存放基础目录
/app/dockerfile/base #项目基础镜像目录
/app/dockerfile/base/cv-cm-base #项目中每个模块的基础镜像目录
/app/dockerfile/aibox/cv-cm-base/Dockerfile #自动打基础镜像需要使用的Dockerfile文件
/app/dockerfile/aibox/cv-cm-base/face_cpu_*.tar.gz #打镜像需要使用的依赖,研发提供
/app/dockerfile/aibox/cv-cm-base/jre-8u251-linux-x64.tar.gz #打镜像需要使用的依赖java环境
/app/dockerfile/aibox/cv-cm-base/.so #打镜像需要使用的依赖,研发提供
(2)基础镜像dockerfile文件内容
1 [root@devops base]# cat Dockerfile 2 FROM openvino/centos7_runtime:latest 3 MAINTAINER lipc@yuntongxun.com 4 5 USER root 6 #设置系统编码 7 RUN yum install kde-l10n-Chinese -y 8 RUN yum install glibc-common -y 9 RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 10 #RUN export LANG=zh_CN.UTF-8 11 #RUN echo "export LANG=zh_CN.UTF-8" >> /etc/locale.conf 12 #ENV LANG zh_CN.UTF-8 13 ENV LC_ALL zh_CN.UTF-8 14 15 # java环境变量 16 WORKDIR /usr/local/ 17 ADD jre-8u251-linux-x64.tar.gz /usr/local/ 18 ENV JAVA_HOME /usr/local/jre1.8.0_251 19 ENV PATH $PATH:$JAVA_HOME/bin 20 21 #face 22 ADD face_cpu_v1.0-20210302.tar.gz / 23 COPY librl_face_vino.so /usr/lib64
(3)基础镜像编译与上传
cd /app/dockerfile/base/cv-cm-base
docker build . -t 192.168.188.25:8090/base/jre-openvino:8u251
docker push 192.168.188.25:8090/base/jre-openvino:8u251
(4)突发情况
说明:由于我在jenkins自动编译业务镜像的时候发现dockerfile的软连接不生效(RUN ln -s),所以我只能在基础镜像上运行一个容器,然后在docker容器内手动执行软连接(ln -s),然后打成新的镜像,作为基础镜像托送到harbor仓库上,为jenkins自动编译部署做基础。
#修改容器打包成新镜像步骤
首先在需要修改的镜像上启动一个容器
docker run -it --name base 383854278345 /bin/bash
然后打开另一个终端,不退出容器,使用下边命令修改容器
docker commit -a="lipc" e752c6b6123d 192.168.176.230:8090/base/jre-openvino:Beta1
最后在将新的基础镜像推送到harbor仓库
docker push 192.168.188.25:8090/base/jre-openvino:8u251
(5)jenkins自动打包和发布时需要调用的dockerfile文件
/app/dockerfile #dockerfile标准存放基础目录
/app/dockerfile/aibox #项目目录
/app/dockerfile/aibox/cv-cm #项目中每个模块的目录
/app/dockerfile/aibox/cv-cm/dockerfile #自动打镜像需要使用的Dockerfile文件
/app/dockerfile/aibox/cv-cm/entrypoint.sh #启动java服务的命令脚本,这个由研发提供
/app/dockerfile/aibox/cv-cm/face_cpu #打镜像需要使用的依赖,研发提供
/app/dockerfile/aibox/cv-cm/.so #打镜像需要使用的依赖,研发提供
(6)业务镜像Dockerfile文件内容
1 [root@devops cv-cm]# cat Dockerfile 2 FROM 192.168.176.230:8090/base/jre-openvino:Beta1 3 MAINTAINER lipc@yuntongxun.com 4 5 USER root 6 7 COPY entrypoint.sh *.jar /aibox-control-manage/ 8 COPY libzlicense.so /usr/local/jre1.8.0_251/lib/amd64/ 9 WORKDIR /aibox-control-manage/ 10 HEALTHCHECK --interval=10s --timeout=30s --retries=3 CMD 11 curl --fail -sL -w "http_code:%{http_code} " 12 -o /dev/null http://localhost:8090/info || exit 1 13 #RUN chmod +x /aibox-control-manage/entrypoint.sh 14 # CMD ["sh","cm-entrypoint.sh"] 15 ENTRYPOINT ["/aibox-control-manage/entrypoint.sh"]
6项目自动化部署使用的ansible目录与文件规范
(1)ansible安装
yum -y install ansible
说明:编辑ansible配置文件,要部署到哪个环境就是填写哪个环境的主机IP地址
vim /etc/ansible/hosts
添加:
[aibox-dev]
192.168.182.10:5555
(2)编写ansible的yml文件
说明:ansible的yml文件和dockerfile文件一样需要标准的放置在规范目录中,jenkins在自动任务中会调用
/app/ansible_file #ansible文件标准存放目录
/app/ansible_file/aibox #项目ansible目录
app/ansible_file/aibox/cm-dev.yml #dev环境的部署的执行的yml文件,具体的ansible操作都在这个文件中,jenkins也是通过调用这个文件实现自动部署的
(3)ansible的cm-dev.yml文件内容
1 [root@devops aibox]# cat cm-dev.yml 2 #- hosts: 192.168.180.89 3 # bs test 4 - hosts: aibox-dev 5 remote_user: root 6 tasks: 7 # - name: Gets the BS process number 8 # shell: "ps -ef |grep -v grep | grep wisdomeye-web | awk '{print $2}'" 9 # register: bs_id 10 - name: Pull the cm-develop images 11 shell: "docker pull 192.168.188.25:8090/develop/cm-server-openvino:develop" 12 tags: pull_images 13 14 - name: Delete old cm-develop containers 15 shell: "docker rm -f cm-server" 16 tags: Delete_containers 17 - name: Start the container 18 shell: "docker run -dit --restart always --network host --name cm-server -p 8090:8090 -v /etc/localtime:/etc/localtime:ro -v /data/aibox-common/cm-server/config:/aibox-control-manage/config -v /data/aibox-common/cm-server/logs:/aibox-control-manage/logs -v /data/pictures/:/aibox-control-manage/pic/ -v /data/aibox-common/cm-server/face_cpu/config:/face_cpu_v1.0-20210302/config -v /data/aibox-common/cm-server/face_cpu/models:/face_cpu_v1.0-20210302/models 192.168.176.230:8090/develop/cm-server-openvino:develop" 19 #become: true 20 #become_user: root 21 tags: start_container
7.jenkins web页面配置
7.1系统管理
7.1.1系统配置
7.1.2全局工具配置
(1)JDK配置
(2)Git配置
(3)maven配置
7.1.3全局安全配置
7.1.4插件管理,可以安装需要的插件
7.1.5安装插件,首先安装
Git plugin 和 Git hook plugin #连接gitlab和配置gitlab hooks的插件,必须安装
Maven Integration plugin #使用maven构建项目的插件,必须安装
7.2用户创建与权限配置
7.3项目分组视图配置
7.4项目创建与配置
#创建一个新的任务
#编辑项目名称
#启用项目安全设置
注意:在启用安全项目之前要先在系统管理中设置项目权限
#项目构建参数
#启用gitlab仓库
#设置jenkins连接gitlab配置,通过gitlab的webhooks监听分支的变化,出发jenkins的挂钩自动拉取代码,gitlab在配置webhooks的时候需要配置下边的URL地址以及Token
#配置gitlab的webhooks
说明:登陆gitlab服务器(192.168.180.189)的web管理界面,进行配置,配置成功后进行测试返回200说明连接成功。
#配置构建脚本,我选择shell
#构建后操作,我这边配置邮件通知,通知模式,构建成功和失败都会邮件通知
说明:构建后操作只需要配置发送邮件的邮箱和邮件通知的模式,其他的都是默认的调用系统管理邮件配置中定义好的变量。
7.5构建日志展示
#点击控制台输出就可以看到构建日志信息,我这边就不展示了
7.6jenkins自带监控配置
#到此整个jenkins自动化发布就部署完成了,中间可能有错误或者需要优化的地方,大家可以纠正,谢谢。。。。。。