在传统的单体软件架构中,软件开发、测试、运维都是以单个过程为单位。
当拆分成微服务之后,单个利用能够被拆分成多个微服务,比方用户零碎,能够拆分成根本信息管理、积分治理、订单治理、用户信息管理、合同治理等多个微服务模块。
这个时候对每个模块别离打包、公布运行、开发、测试、运维的,对于测试、运维的工作量会极大减少。
在这个过程中,如果不足自动化测试、自动化集成/部署、主动运维等能力,带来的影响是
- 软件交付周期减少
- 多环境部署的状况下,各个环境差别带来的问题。
- 人工运维容易给环境带来一些不可重现的影响,而且一旦产生运维谬误又比拟难立即复原,造成故障解决工夫较长。并且对于运维人员的能力要求较高
所有的这些问题,会导致软件交付工夫变长、危险减少、以及运维成本增加等问题。因而,咱们须要一套自动化部署体系,来构建一个CICD的模型。
一般Jar包的运行形式
- 应用
maven package
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
下载和装置
- 拜访:
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
- 下载Maven:
https://dlcdn.apache.org/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.tar.gz
- 配置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
-
进入到
${NEXUS_HOME}\bin
目录,执行上面命令启动Nexus用./nexus start启动,后盾启动,启动胜利后能够拜访
用./nexus run启动,前台启动,显示日志,启动后能够拜访
./nexus start
启动时,会有如下提醒,这个是倡议咱们应用非
root
账户来拜访。
WARNING: ************************************************************
WARNING: Detected execution as "root" user. This is NOT recommended!
WARNING: ************************************************************
- 拜访:
http://localhost:8081
拜访Nexus仓库
如果想配置 nexus 的利用在本地启动的 JVM参数,能够在 nexus.vmoptions
如果想扭转 nexus 的 端口号,能够在 nexus-default.properties
登录控制台
- 默认登录的帐号是
admin
,明码在会提醒你在:/data/program/sonatype-work/nexus3/admin.password
文件中。
- 内容如下,间接复制该内容登录即可。
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 目录
- 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设置成零碎服务
依照以下步骤执行
- 批改
${NEXUS_HOME}\bin\nexus
这个脚本,减少上面的配置
INSTALL4J_JAVA_HOME_OVERRIDE=/data/program/jdk1.8.0_241
- 设置软链接
[root@localhost bin]# ln -s /data/program/nexus-3.37.0-01/bin/nexus /etc/init.d/nexus
- 通过chkconfig形式配置零碎服务
cd /etc/init.d
sudo chkconfig --add nexus #增加nexus服务
sudo chkconfig --levels 345 nexus on #设置开启自启动
-
启动和进行服务
sudo service nexus start #开启服务
service nexus status #查看服务状态
搭建Gitea环境
参考文档: https://docs.gitea.io/zh-cn/i…
- 装置git环境:
yum -y install git
。 - 通过上面的命令下载linux中的安装包到
/data/program/gitea
目录下。
wget -O gitea https://dl.gitea.io/gitea/1.15.7/gitea-1.15.7-linux-amd64
- 执行
chmod +x gitea
命令,授予执行权限 - 执行上面这个命令运行gitea
./gitea web
装置成零碎服务(重要)
- 创立Git用户
sudo useradd \
--system \
--shell /bin/bash \
--comment 'Git Version Control' \
--create-home \
--home /home/git \
git
- 下载二进制文件
wget -O gitea https://dl.gitea.io/gitea/1.15.7/gitea-1.15.7-linux-amd64
-
依据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
-
- 装置启动实现后,拜访:
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公布属性
- Publish Over SSH ,在近程机器上执行脚本,这一步须要先配置能ssh近程机器
- Maven Integration, 反对Maven我的项目的集成
配置公布指标服务器信息
咱们把上面两台服务器当成是web节点
- 192.168.8.134
- 192.168.8.135
在Jenkins 全局配置中,配置这两台服务器的信息,用来后续实现jar包近程传输。其中Remote Directory
指标服务器的工作目录,jar包会被近程传输到该目录下
增加我的项目公布机制
创立一个Maven我的项目的工作。
配置源码起源,这里应用Gitea中我的项目的源码地址,并配置登录帐号密码信息。
配置Maven的执行命令,其中
root POM
,如果是在多模块我的项目中,须要指定以后要构建的模块的pom.xml。
减少构建胜利之后的执行逻辑,就是把jar包公布到远程目标服务器,而后执行相干shell脚本启动服务
编写公布脚本
编写shell脚本,当jar包发送到指标服务器之后,执行上面脚本。
- 做历史jar备份和清理
- 执行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-we… , 在webhook中须要配置这个作为触发调用。
gitea增加webhook钩子
-
在gitea的我的项目中,找到
Web钩子
,增加Web钩子
. 抉择gitea
。 -
增加webhook
验证主动触发的行为
- 批改gpmall-pc这个我的项目的任何一个代码,而后提交到gitea上。
-
察看Jenkin的我的项目构建目录,会减少一个主动构建的工作,如下图所示。
-
并且在gitea的webhook中,能够看到最近的推送记录
源码地址
文章演示应用的源码: https://github.com/2227324689…
版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自
Mic带你学架构
!
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!
发表回复