jenkins+maven+gitlab+ansible自动化发布java项目

《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自动化发布就部署完成了,中间可能有错误或者需要优化的地方,大家可以纠正,谢谢。。。。。。

原文地址:https://www.cnblogs.com/Leonardo-li/p/14520596.html