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

  • 相关阅读:
    c语言小项目---通讯录2.0
    小练习 打地鼠游戏
    4-20 这是一次失败的小项目 (单链表应用--通讯录)
    4-19 易错点 链表的插入
    小练习 简易双色球模拟器
    【2019.8.22】测试题目订正
    【模板】【P1182】数列分段II——二分答案
    【P2634】聪聪可可——点分治
    【模板】【P3605】【USACO17JAN】Promotion Counting 晋升者计数——动态开点和线段树合并(树状数组/主席树)
    【AcWing 113】【交互】特殊排序——二分
  • 原文地址:https://www.cnblogs.com/Leonardo-li/p/14520596.html
Copyright © 2020-2023  润新知