欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

基于Jenkins+Maven+Gitea+Nexus搭建CICD环境的方式,

来源: javaer 分享于  点击 16957 次 点评:229

基于Jenkins+Maven+Gitea+Nexus搭建CICD环境的方式,


目录
  • 普通Jar包的运行方式
  • 搭建Nexus私服环境
    • 下载和安装
    • 安装Maven
  • 登录控制台
    • Nexus控制台说明
    • 目录说明
    • Nexus设置成系统服务
  • 搭建Gitea环境
    • 搭建Jenkins环境
      • 项目改造
        • 项目配置本地的私服
        • 修改发布服务器的settings.xml文件
      • 配置自动集成与发布
        • 配置Jenkins的环境变量
        • 安装Jenkins插件
        • 配置发布目标服务器信息
        • 添加项目发布机制
      • 编写发布脚本
        • 编写运行脚本run-goods-service.sh
          • 配置代码提交后动态构建
            • 安装Webhook插件
            • gitea添加webhook钩子
            • 验证自动触发的行为
          • 源码地址

            在传统的单体软件架构中,软件开发、测试、运维都是以单个进程为单位。

            当拆分成微服务之后,单个应用可以被拆分成多个微服务,比如用户系统,可以拆分成基本信息管理、积分管理、订单管理、用户信息管理、合同管理等多个微服务模块。

            这个时候对每个模块分别打包、发布运行、开发、测试、运维的,对于测试、运维的工作量会极大增加。

            在这个过程中,如果缺乏自动化测试、自动化集成/部署、自动运维等能力,带来的影响是

            1. 软件交付周期增加
            2. 多环境部署的情况下,各个环境差异带来的问题。
            3. 人工运维容易给环境带来一些不可重现的影响,而且一旦发生运维错误又比较难立刻恢复,造成故障处理时间较长。并且对于运维人员的能力要求较高

            所有的这些问题,会导致软件交付时间变长、风险增加、以及运维成本增加等问题。因此,我们需要一套自动化部署体系,来构建一个CICD的模型。

            普通Jar包的运行方式

            1.使用maven packagenohup java -jar ${APP_NAME} > goods-service.log 2>&1 &

            2.nohup用途:不挂断地运行命令

            • &用途,在后台运行
            • 2>&1: 在bash中:

            0 代表STDIN_FILENO 标准输入(一般是键盘),

            1 代表STDOUT_FILENO 标准输出(一般是显示屏,准确的说是用户终端控制台),

            2 三代表STDERR_FILENO (标准错误(出错信息输出)。

            • 2>&1就是用来将标准错误2重定向到标准输出1中的。此处1前面的&就是为了让bash将1解释成标准输出而不是文件1。至于最后一个&,则是让bash在后台执行。

            > 直接把内容生成到指定文件

            搭建Nexus私服环境

            Nexus是一个强大的Maven仓库管理器,它极大地简化了本地内部仓库的维护和外部仓库的访问。Nexus是一套“开箱即用”的系统不需要数据库,它使用文件系统加Lucene来组织数据。

            Maven私服环境需要用sonatype nexus,下面我们从安装和配置进行详细分析

            部署服务器: 192.168.8.138

            下载和安装

            访问:https://sonatype-download.global.ssl.fastly.net/repository/downloads-prod-group/3/nexus-3.37.0-01-unix.tar.gz地址,下载Sonatype Nexus。

            解压缩到/data/program目录下

            [root@localhost program]# tar -zxvf nexus-3.37.0-01-unix.tar.gz 

            进入到${NEXUS_HOME}\bin目录,执行下面命令启动Nexus

            ./nexus start 

            安装Maven

            1.下载Maven: https://dlcdn.apache.org/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.tar.gz

            2.配置Maven 和JDK 环境变量。

            export JAVA_HOME=/data/program/jdk1.8.0_241
            export MAVEN_HOME=/data/program/apache-maven-3.8.4
            export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
            export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

            3.进入到${NEXUS_HOME}\bin目录,执行下面命令启动Nexus

            用./nexus start启动,后台启动,启动成功后可以访问

            用./nexus run启动,前台启动,显示日志,启动后可以访问

            ./nexus start 

            启动时,会有如下提示,这个是建议我们使用非root账户来访问。

            WARNING: ************************************************************
            WARNING: Detected execution as "root" user.  This is NOT recommended!
            WARNING: ************************************************************

            4.访问:http://localhost:8081访问Nexus仓库

            如果想配置 nexus 的应用在本地启动的 JVM参数,可以在 nexus.vmoptions

            如果想改变 nexus 的 端口号,可以在 nexus-default.properties

            登录控制台

            1.默认登录的帐号是admin,密码在会提示你在:/data/program/sonatype-work/nexus3/admin.password文件中。

            2.内容如下,直接复制该内容登录即可。

            090849ac-cea7-4353-b2c8-59b2bceadb50

            Nexus控制台说明

            进入Nexus控制台的Browse菜单,可以看到四种仓库类型:

            1)maven-central: maven中央库,默认从https://repo1.maven.org/maven2/拉取jar

            2)maven-releases: 私库发行版jar

            3)maven-snapshots:私库快照(调试版本)jar

            4)maven-pubpc: 仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml中使用。

            Nexus默认的仓库类型有以下四种:(上面的名字可以随便取,关键是它对应的是什么仓库类型)

            1)group(仓库组类型):又叫组仓库,用于方便开发人员自己设定的仓库;

            2)hosted(宿主类型):内部项目的发布仓库(内部开发人员,发布上去存放的仓库);

            3)proxy(代理类型): 从远程中央仓库中寻找数据的仓库(可以点击对应的仓库的Configuration页签下Remote Storage Location属性的值即被代理的远程仓库的路径);

            4)virtual(虚拟类型): 虚拟仓库(这个基本用不到,重点关注上面三个仓库的使用);

            Nuget是用于微软.NET开发平台的软件包管理器,和Maven类似。

            目录说明

            nexus-3.34.0-01 目录

            • bin 包含nexus的启动脚本和相关配置
            • etc jetty、karaf等配置文件
            • jre jre环境
            • lib java架包库
            • public 关于nexus应用在本地跑起来所需要的资源
            • system 应用所有的插件和组件
            • LICENSE.txt 和 NOTICE.txt 版权声明和法律细则

            sonatype-work\nexus3 目录

            • blobs/ 创建blob的默认路径,当然也可以重新指定
            • cache/ 当前缓存的karaf包的信息
            • db/ OrientDB数据库的数据,用于存储nexus的元数据的数据库
            • elasticsearch/ 当前配置的Elasticsearch状态
            • etc/ 大概是运行时配置状态和关于资源库的自定义的相关的东西
            • health-check/ 看目录,健康检查的相关报告的存储目录吧
            • keystores/ 自动生成的关于资源库的ID主键
            • log/ 运行实例生成的日志文件,也有日志文件的压缩包,貌似是每天都会生成日志文件,你可以定期删除老的日志文件
            • tmp/ 用于存储临时文件的目录

            Nexus设置成系统服务

            按照以下步骤执行

            1.修改${NEXUS_HOME}\bin\nexus这个脚本,增加下面的配置

            INSTALL4J_JAVA_HOME_OVERRIDE=/data/program/jdk1.8.0_241

            2.设置软链接

            [root@localhost bin]# ln -s /data/program/nexus-3.37.0-01/bin/nex

            3.通过chkconfig方式配置系统服务

            cd /etc/init.d
            sudo chkconfig --add nexus #添加nexus服务
            sudo chkconfig --levels 345 nexus on #设置开启自启动

            4.启动和停止服务

            sudo service nexus start #开启服务
            service nexus status #查看服务状态

            搭建Gitea环境

            参考文档: https://docs.gitea.io/zh-cn/install-from-binary/

            1.安装git环境: yum -y install git

            2.通过下面的命令下载pnux中的安装包到/data/program/gitea目录下。

            wget -O gitea https://dl.gitea.io/gitea/1.15.7/gitea-1.15.7-linux-amd64

            3.执行chmod +x gitea命令,授予执行权限

            4.执行下面这个命令运行gitea

            ./gitea web

            安装成系统服务(重要)

            1.创建Git用户

            sudo useradd \
               --system \
               --shell /bin/bash \
               --comment 'Git Version Control' \
               --create-home \
               --home /home/git \
               git

            2.下载二进制文件

            wget -O gitea https://dl.gitea.io/gitea/1.15.7/gitea-1.15.7-linux-amd64
            

            3.根据gitea官方推荐,按照以下方式配置gitea的安装目录

            把下载的文件移动到/usr/local/bin目录

            sudo mv /data/program/gitea /usr/local/bin
            

            使二进制文件可执行:

            chmod +x /usr/local/bin/gitea
            

            按照一下命令创建必要目录并设置权限

            sudo mkdir -p /var/lib/gitea/{custom,data,indexers,public,log}
            sudo mkdir -p /var/lib/gitea/{custom,data,indexers,public,log}
            sudo chown git: /var/lib/gitea/{data,indexers,custom,public,log}
            sudo chmod 750 /var/lib/gitea/{data,indexers,log}
            sudo mkdir /etc/gitea
            sudo chown root:git /etc/gitea
            sudo chmod 770 /etc/gitea

            根据Gitea官方提供的Systemd Unit文件,配置系统服务。

            sudo wget https://raw.githubusercontent.com/go-gitea/gitea/master/contrib/systemd/gitea.service -P /etc/systemd/system/
            

            注意,gitea.service, 不能通过wget下载,需要去github上复制

            完成上述过程后,通过下面命令开启自动启动

            systemctl enable gitea
            systemctl start gitea

            4.安装启动完成后,访问:http://192.168.8.136:3000,配置数据库相关属性即可。

            搭建Jenkins环境

            Jenkins是一个用JAVA编写的开源的持续集成工具,运行在servlet容器中,支持软件配置管理(SCM)工具,可以执行基于APACHE ANT和APACHE MAVEN的项目,以及任意Shell脚本和Windows批处理命令

            Jenkins提供了自动构建和部署的功能,具体安装方式如下:

            wget -O /etc/yum.repos.d/jenkins.repo \
                https://pkg.jenkins.io/redhat-stable/jenkins.repo
            rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
            yum upgrade
            yum install epel-release java-11-openjdk-devel
            yum install jenkins
            systemctl daemon-reload

            通过下面的命令启动或停止jenkins

            systemctl start jenkins
            systemctl stop jenkins

            访问: http://192.168.8.136:8080 访问jenkins

            按照控制台提示的步骤一步步执行即可。

            注意: Jenkins安装默认采用JENKINS用户,所以如果是使用root权限,则需要修改帐号

            [root@localhost bin]# vim /etc/sysconfig/jenkins
            
            JENKINS_USER="root"

            项目改造

            项目配置本地的私服

            修改setting.xml文件,增加mirror配置

            <mirrors>
                <mirror>
                    <id>nexus</id>
                    <mirrorOf>maven-public</mirrorOf>
                    <url>http://192.168.8.136:8081/repository/maven-public/</url>
                </mirror>
            </mirrors>

            mirror相当于一个拦截器,它会拦截maven对remote repository的相关请求,走该镜像进行jar包的获取。

            在项目中增加如下配置,也就是指定snapshots和releases 不同发行版本jar包的发布仓库

            <distributionManagement>
                <snapshotRepository>
                    <id>snapshots</id>
                    <name>Nexus Snapshot Repository</name>
                    <url>http://192.168.8.136:8081/repository/maven-snapshots/</url>
                </snapshotRepository>
                <repository>
                    <id>releases</id>
                    <name>Nexus Release Repository</name>
                    <url>http://192.168.8.136:8081/repository/huhy-nexus/</url>
                </repository>
            </distributionManagement>

            修改发布服务器的settings.xml文件

            修改发布服务器的settings.xml文件的目的,是因为Jenkins服务器在进行持续集成时,需要通过maven实现依赖jar包的下载,而这个下载需要从我们本地的私服中获取。

            <mirrors>
                <mirror>
                    <id>nexus</id>
                    <mirrorOf>maven-public</mirrorOf>
                    <url>http://192.168.8.136:8081/repository/maven-public/</url>
                </mirror>
            </mirrors>
            <profiles>
                 <profile>
                  <id>nexusRep</id>
                  <repositories>
                    <repository>
                      <id>nexus</id>
                      <url>http://192.168.8.136:8181/repository/maven-public/</url>
                      <layout>default</layout>
                      <releases>
                          <enabled>true</enabled>
                          <updatePolicy>always</updatePolicy>
                      </releases>
                    </repository>
                  </repositories>
                  <pluginRepositories>  
                    <pluginRepository>  
                      <!--插件地址--> 
                        <id>nexus</id>  
                        <url>http://192.168.8.136:8181/repository/maven-public/</url>  
                        <snapshots>     
                          <enabled>true</enabled>    
                        </snapshots>    
                        <releases>      
                            <enabled>true</enabled>    
                        </releases> 
                    </pluginRepository>
                   </pluginRepositories>
                </profile>
              </profiles>
            
              <activeProfiles>
                <activeProfile>nexusRep</activeProfile>
              </activeProfiles>

            配置自动集成与发布

            配置Jenkins的环境变量

            进入到如下页面,红色标注的配置。

            配置Maven的环境,指定发布服务器上安装的Maven目录。

            安装Jenkins插件

            Gitea , 集成Gitea,安装好之后,在Jenkins全局配置中,添加Gitea Server信息。

            Git Parameter , 配置Git发布属性

            Pubpsh Over SSH ,在远程机器上执行脚本,这一步需要先配置能ssh远程机器

            Maven Integration, 支持Maven项目的集成

            配置发布目标服务器信息

            我们把下面两台服务器当成是web节点

            192.168.8.134192.168.8.135

            在Jenkins 全局配置中,配置这两台服务器的信息,用来后续实现jar包远程传输。其中Remote Directory目标服务器的工作目录,jar包会被远程传输到该目录下

            添加项目发布机制

            创建一个Maven项目的任务。

            配置源码来源,这里使用Gitea中项目的源码地址,并配置登录帐号密码信息。

            配置Maven的执行命令,其中root POM,如果是在多模块项目中,需要指定当前要构建的模块的pom.xml。

            增加构建成功之后的执行逻辑,就是把jar包发布到远程目标服务器,然后执行相关shell脚本启动服务

            编写发布脚本

            编写shell脚本,当jar包发送到目标服务器之后,执行下面脚本。

            1. 做历史jar备份和清理
            2. 执行shell脚本启动服务
            #! bin/sh -e
            export JAVA_HOME=/data/program/jdk1.8.0_241
            export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
            export PATH=${PATH}:$JAVA_HOME/bin
            source /etc/profile 
            # define property
            JAR_PATH='/app/service/goods-service'
            TEMP_PATH='/app/service/temp'
            BACKUP_PATH='/app/service/backup'
            JAR_NAME=goods-service.jar
            FILE_NAME=goods-service
            # stop target service
            cd ${JAR_PATH}
            sh run-goods-service.sh stop
            sleep 2
            rm -rf $FILE_NAME.log
            # backup old jar
            BACKUP_DATE=$(date +%Y%m%d_%H%M)
            if [ ! -d $JAR_PATH/backup/$FILE_NAME ];then
                mkdir -p $JAR_PATH/backup/$FILE_NAME
            fi
            cd ${JAR_PATH}
            pwd
            if [ -f $JAR_NAME ];then
               mv -f ./$JAR_NAME ./backup/$FILE_NAME/$JAR_NAME$BACKUP_DATE
               sleep 1
            fi
            # start jar
            BUILD_ID=dontKillMe
            cd ${TEMP_PATH}
            mv -f $JAR_NAME  $JAR_PATH
            cd ${JAR_PATH}
            sh run-goods-service.sh restart
            # clear old backup
            cd ${JAR_PATH}/backup/$FILE_NAME
            ls -lt|awk 'NR>5{print $NF}' |xargs rm -rf
            ps -ef|grep java
            echo "=============deploy success========"

            编写运行脚本run-goods-service.sh

            # 表示当前脚本采用/bin路径的bash程序来解释执行
            #!/bin/bash
            # 执行的jar包
            APP_NAME=goods-service.jar
            usage() {
              echo "执行操作命令 [start|stop|restart|status]"
              exit 1
            }
            if_exist() {
              pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
              if [ -z "${pid}" ]; then
                return 1
              else
                return 0
              fi
            }
            start() {
              if_exist
              if [ $? -eq 0 ]; then
                echo "${APP_NAME} already running . pid=${pid}"
              else
                nohup java -jar ${APP_NAME} > goods-service.log 2>&1 &
                npid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
                echo "start ${APP_NAME} success, pid=${npid}"
              fi
            }
            stop() {
              if_exist
              if [ $? -eq 0 ]; then
                kill -9 $pid
                echo "stop $pid success".
              else
                echo "${APP_NAME} is not running"
              fi
            }
            status() {
              if_exist
              if [ $? -eq 0 ]; then
                echo "${APP_NAME} is running. pid is ${pid}"
              else
                echo "${APP_NAME} is not running "
              fi
            }
            restart() {
              stop
              sleep 5
              start
            }
            case "$1" in
               "start")
                  start
                   ;;
                "stop")
                  stop
                   ;;
                "status")
                  status
                   ;;
                "restart")
                  restart
                   ;;
                *)
                usage
                 ;;
            esac

            配置代码提交后动态构建

            如果我们希望代码提交合并到某个分支后,自动构建进行发布,怎么实现呢?

            安装Webhook插件

            在Jenkins中安装Generic Webhook Trigger 插件,安装成功后,会在构建的配置页面多了下面所示的一个选项。

            配置Generiac Webhook Trigger,增加一个token作为验证。

            注意这个地址: http://JENKINS_URL/generic-webhook-trigger/invoke , 在webhook中需要配置这个作为触发调用。

            gitea添加webhook钩子

            在gitea的项目中,找到Web钩子,添加Web钩子. 选择gitea

            添加webhook

            验证自动触发的行为

            修改gpmall-pc这个项目的任何一个代码,然后提交到gitea上。

            观察Jenkin的项目构建目录,会增加一个自动构建的任务,如下图所示。

            并且在gitea的webhook中,可以看到最近的推送记录

            源码地址

            文章演示使用的源码: https://github.com/2227324689/spring-cloud-netfpx-example.git

            到此这篇关于基于Jenkins+Maven+Gitea+Nexus从0到1搭建CICD环境的文章就介绍到这了,更多相关Jenkins+Maven+Gitea+Nexus搭建CICD环境内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程!

            您可能感兴趣的文章:
            • 在CentOS7上搭建Jenkins+Maven+Git持续集成环境的方法
            • GitLab+Jenkins+Maven+Tomcat 实现自动集成、打包、部署
            • Jenkins+maven持续集成的实现
            • Jenkins+Maven+SVN自动化部署java项目
            相关栏目:

            用户点评