热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于java:基于JenkinsMavenGiteaNexus从0到1搭建CICD环境

当拆分成微服务之后,单个利用能够被拆分成多个微服务,比方用户零碎,能够拆分成根本信息管理、积分治理、订单治理、用户信息管理、合同治理等多个微服务模块。

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

当拆分成微服务之后,单个利用能够被拆分成多个微服务,比方用户零碎,能够拆分成根本信息管理、积分治理、订单治理、用户信息管理、合同治理等多个微服务模块。

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

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

  1. 软件交付周期减少
  2. 多环境部署的状况下,各个环境差别带来的问题。
  3. 人工运维容易给环境带来一些不可重现的影响,而且一旦产生运维谬误又比拟难立即复原,造成故障解决工夫较长。并且对于运维人员的能力要求较高

所有的这些问题,会导致软件交付工夫变长、危险减少、以及运维成本增加等问题。因而,咱们须要一套自动化部署体系,来构建一个CICD的模型。

一般Jar包的运行形式
  1. 应用maven package
  2. nohup java -jar ${APP_NAME} > goods-service.log 2>&1 &
  • 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

下载和装置

  1. 拜访:https://sonatype-download.global.ssl.fastly.net/repository/downloads-prod-group/3/nexus-3.37.0-01-unix.tar.gz地址,下载Sonatype Nexus。
  2. 解压缩到/data/program目录下
[root@localhost program]# tar -zxvf nexus-3.37.0-01-unix.tar.gz 
  1. 进入到${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
  1. 进入到${NEXUS_HOME}\bin目录,执行上面命令启动Nexus

    用./nexus start启动,后盾启动,启动胜利后能够拜访

    用./nexus run启动,前台启动,显示日志,启动后能够拜访

./nexus start 

启动时,会有如下提醒,这个是倡议咱们应用非root账户来拜访。

WARNING: ************************************************************
WARNING: Detected execution as "root" user.  This is NOT recommended!
WARNING: ************************************************************
  1. 拜访:http://localhost:8081拜访Nexus仓库

如果想配置 nexus 的利用在本地启动的 JVM参数,能够在 nexus.vmoptions

如果想扭转 nexus 的 端口号,能够在 nexus-default.properties

登录控制台

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

  1. 内容如下,间接复制该内容登录即可。
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-public: 仓库分组,把下面三个仓库组合在一起对外提供服务,在本地maven根底配置settings.xml中应用。

Nexus默认的仓库类型有以下四种:(下面的名字能够轻易取,要害是它对应的是什么仓库类型)

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

2)hosted(宿主类型):外部我的项目的公布仓库(外部开发人员,公布下来寄存的仓库);

3)proxy(代理类型): 从近程地方仓库中寻找数据的仓库(能够点击对应的仓库的Configuration页签下Remote Storage Location属性的值即被代理的近程仓库的门路);

4)virtual(虚构类型): 虚构仓库(这个根本用不到,重点关注下面三个仓库的应用);

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

目录阐明

nexus-3.34.0-01 目录

  1. bin 蕴含nexus的启动脚本和相干配置
  2. etc jetty、karaf等配置文件
  3. jre jre环境
  4. lib java架包库
  5. public 对于nexus利用在本地跑起来所须要的资源
  6. system 利用所有的插件和组件
  7. LICENSE.txt 和 NOTICE.txt 版权申明和法律细则

sonatype-work\nexus3 目录

  1. blobs/ 创立blob的默认门路,当然也能够从新指定
  2. cache/ 以后缓存的karaf包的信息
  3. db/ OrientDB数据库的数据,用于存储nexus的元数据的数据库
  4. elasticsearch/ 以后配置的Elasticsearch状态
  5. etc/ 大略是运行时配置状态和对于资源库的自定义的相干的货色
  6. health-check/ 看目录,健康检查的相干报告的存储目录吧
  7. keystores/ 主动生成的对于资源库的ID主键
  8. log/ 运行实例生成的日志文件,也有日志文件的压缩包,貌似是每天都会生成日志文件,你能够定期删除老的日志文件
  9. tmp/ 用于存储临时文件的目录

Nexus设置成零碎服务

依照以下步骤执行

  1. 批改${NEXUS_HOME}\bin\nexus这个脚本,减少上面的配置
INSTALL4J_JAVA_HOME_OVERRIDE=/data/program/jdk1.8.0_241
  1. 设置软链接
[root@localhost bin]# ln -s /data/program/nexus-3.37.0-01/bin/nexus /etc/init.d/nexus
  1. 通过chkconfig形式配置零碎服务
cd /etc/init.d
sudo chkconfig --add nexus #增加nexus服务
sudo chkconfig --levels 345 nexus on #设置开启自启动
  1. 启动和进行服务

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

搭建Gitea环境

参考文档: https://docs.gitea.io/zh-cn/i…

  1. 装置git环境: yum -y install git
  2. 通过上面的命令下载linux中的安装包到/data/program/gitea目录下。
wget -O gitea https://dl.gitea.io/gitea/1.15.7/gitea-1.15.7-linux-amd64
  1. 执行chmod +x gitea命令,授予执行权限
  2. 执行上面这个命令运行gitea
./gitea web

装置成零碎服务(重要)

  1. 创立Git用户
sudo useradd \
   --system \
   --shell /bin/bash \
   --comment 'Git Version Control' \
   --create-home \
   --home /home/git \
   git
  1. 下载二进制文件
wget -O gitea https://dl.gitea.io/gitea/1.15.7/gitea-1.15.7-linux-amd64
  1. 依据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
  2. 装置启动实现后,拜访: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"
我的项目革新

我的项目配置本地的私服

  1. 批改setting.xml文件,减少mirror配置

    
        
            nexus
            maven-public
            http://192.168.8.136:8081/repository/maven-public/
        
    

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

  1. 在我的项目中减少如下配置,也就是指定snapshots和releases 不同发行版本jar包的公布仓库

    
        
            snapshots
            Nexus Snapshot Repository
            http://192.168.8.136:8081/repository/maven-snapshots/
        
        
            releases
            Nexus Release Repository
            http://192.168.8.136:8081/repository/huhy-nexus/
        
    

批改公布服务器的settings.xml文件

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


    
        nexus
        maven-public
        http://192.168.8.136:8081/repository/maven-public/
    

     
      nexusRep
      
        
          nexus
          http://192.168.8.136:8181/repository/maven-public/
          default
          
              true
              always
          
        
      
        
          
           
            nexus  
            http://192.168.8.136:8181/repository/maven-public/  
                 
              true    
                
                  
                true    
             
        
       
    
  

  
    nexusRep
  
配置主动集成与公布

配置Jenkins的环境变量

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

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

装置Jenkins插件

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

  • Git Parameter , 配置Git公布属性
  • Publish Over SSH ,在近程机器上执行脚本,这一步须要先配置能ssh近程机器
  • Maven Integration, 反对Maven我的项目的集成

配置公布指标服务器信息

咱们把上面两台服务器当成是web节点

  1. 192.168.8.134
  2. 192.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插件

  1. 在Jenkins中装置Generic Webhook Trigger 插件,装置胜利后,会在构建的配置页面多了上面所示的一个选项。

  2. 配置Generiac Webhook Trigger,减少一个token作为验证。

    留神这个地址: http://JENKINS_URL/generic-we… , 在webhook中须要配置这个作为触发调用。

gitea增加webhook钩子

  1. 在gitea的我的项目中,找到Web钩子,增加Web钩子. 抉择gitea

  2. 增加webhook

验证主动触发的行为

  1. 批改gpmall-pc这个我的项目的任何一个代码,而后提交到gitea上。
  2. 察看Jenkin的我的项目构建目录,会减少一个主动构建的工作,如下图所示。

  3. 并且在gitea的webhook中,能够看到最近的推送记录

源码地址

文章演示应用的源码: https://github.com/2227324689…

版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自 Mic带你学架构
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!


推荐阅读
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • 解读中台架构:微服务与分布式技术的区别及应用
    中心化与去中心化是长期讨论的话题。中心化架构的优势在于部署和维护相对简单,尤其在服务负载较为稳定的情况下,能够提供高效稳定的性能。然而,随着业务规模的扩大和技术需求的多样化,中心化架构的局限性逐渐显现,如扩展性和故障恢复能力较差。相比之下,微服务和分布式技术通过解耦系统组件,提高了系统的灵活性和可扩展性,更适合处理复杂多变的业务场景。本文将深入探讨中台架构中微服务与分布式技术的区别及其应用场景,帮助读者更好地理解和选择适合自身业务的技术方案。 ... [详细]
  • 技术日志:Ansible的安装及模块管理详解 ... [详细]
  • 近年来,BPM(业务流程管理)系统在国内市场逐渐普及,多家厂商在这一领域崭露头角。本文将对当前主要的BPM厂商进行概述,并分析其各自的优势。目前,市场上较为成熟的BPM产品主要分为两类:一类是综合型厂商,如IBM和SAP,这些企业在整体解决方案方面具有明显优势;另一类则是专注于BPM领域的专业厂商,它们在特定行业或应用场景中表现出色。通过对比分析,本文旨在为企业选择合适的BPM系统提供参考。 ... [详细]
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • 回顾过去十多年的开发经历,我在技术能力、培训机会、国际视野以及大型企业的工作经验方面都有了显著的提升。特别是从最初的月薪8k到如今的38k,这一过程中,我深刻体会到系统化学习对提升架构能力的重要性。最初踏入职场时,面对众多未知,我主要依赖团队领导的指导,专注于编写代码、管理数据库和进行测试。随着经验的积累和技术的不断进步,我逐渐意识到,只有通过系统化的学习和实践,才能在技术领域取得更大的突破。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本指南详细介绍了如何在CentOS 6.6 64位系统上以root用户身份部署Tomcat 8服务器。系统环境为CentOS 6.6 64位,采用源码安装方式。所需软件为apache-tomcat-8.0.23.tar.gz,建议将软件下载至/root/opt目录。具体下载地址请参见官方资源。本指南涵盖了从环境准备到服务启动的完整步骤,适用于需要在该系统环境下搭建高性能Web应用服务器的技术人员。 ... [详细]
  • 本文深入解析了Django框架中的MVT(Model-View-Template)设计模式,详细阐述了其工作原理和应用流程。通过分析URL模式、视图、模型和模板等关键组件,读者将全面理解Django应用程序的架构体系,掌握如何高效地构建和管理Web应用。 ... [详细]
  • 老杨谈IT运维 | 快速实现日志异常检测与根源分析
    在智能运维领域,指标和日志是最常用的数据来源,能够有效反映系统的运行状况和健康状态。通过对这些数据的深入分析,可以为监控和告警系统提供关键信息,帮助快速实现日志异常检测与根源分析,提升整体运维效率。 ... [详细]
  • Docker入门指南:初探容器化技术
    Docker入门指南:初探容器化技术摘要:Docker 是一个使用 Go 语言开发的开源容器平台,旨在实现应用程序的构建、分发和运行的标准化。通过将应用及其依赖打包成轻量级的容器,Docker 能够确保应用在任何环境中都能一致地运行,从而提高开发和部署的效率。本文将详细介绍 Docker 的基本概念、核心功能以及如何快速上手使用这一强大的容器化工具。 ... [详细]
  • Syncnavigator激活工具及破解方法详解
    本文详细介绍了Syncnavigator激活工具的使用方法及其破解技巧。用户可以通过访问官方网站www.SyncNavigator.CN获取相关资源,并通过客服QQ 1793040获得技术支持和帮助。此外,文章还提供了详细的步骤说明和常见问题解答,以确保用户能够顺利激活并使用Syncnavigator软件。 ... [详细]
  • 如何在Oracle ASM_Diskgroup中重命名现有磁盘
    如何在Oracle ASM_Diskgroup中重命名现有磁盘 ... [详细]
author-avatar
我爱投资理财
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有