SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]

【项目笔记】SpringCloud+Jenkins+Docker持续部署积木学堂

写在前面

本项目搞了三天两夜。。

好多东西不太理解,网上也搜不到答案,只能一点点的试,而且最开始目的是想压榨到服务器极限,

最后虽然成功部署,可是一段时间就会有微服务被kill掉。所以跟朋友又借了一台,各占一半内存,稳定性还高。

先说下准备工作

A:部署了九个微服务 (需要安装git,java,maven,docker)

B:部署了Mysql,Nacos,Redis,前端项目(需要安装docker,node,nginx)

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第1张图片

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第2张图片

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第3张图片

动机

一开始想把积木学堂部署到阿里云送的那个半年的主机。

本项目一共九个微服务,加上服务器还需要mysql,redis,nacos三个服务。还可能会把前端也部署上去。

小伙伴们都说可能部署不了。所以为了不浪费时间,先测试一下使用内存。

(先看写在前面)

准备工作

首先打开Java自带的性能监测工具jvisualvm

就在java安装目录那个bin里面 jvisualvm.ext

打开之后啥也没干。发现这么一个现象。应该就是传说中jvm自动回收了

(这个是网关微服务,大概还在75M就自动回收了)

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第4张图片

再看一下课程微服务edu,毕竟核心功能,发现他是400M才回收

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第5张图片

http://localhost:8110/admin/edu/teacher/list

开始搞事情,打开JMeter

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第6张图片

设置20线程,每个100条,我发现到了400M回收了,那我改一下。

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第7张图片

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第8张图片

依然400M回收了。如果大家同时400M 九个微服务,加上mysql之类的,肯定不够。

那我给他设置一个最大内存,看一下,会不会报错!!

-Xms64M -Xmx64M -XX:PermSize=512M -XX:MaxPermSize=1024M

50线程,每个200条共用12s,其实我觉得很顺滑啊。于是乎,我全部改了一下

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第9张图片

我重启了这些服务

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第10张图片

并没有出现可能的故障,也不确定这种方法是否准确,先继续往下做

正式开始

好 全部关闭!开始部署。应湖总要求。我重装了一下服务器,从头开始

简介

部署有两种方式

1.服务器安装java环境。

然后把打包的jar包扔上去,运行一下。

2.持续集成

持续集成(简称CI)指的是,频繁的(一天多次)将代码集成到主干。

持续部署(CD)

持续集成的目的,就是让产品快速迭代,同时还能保持高质量。

简单来说就是把代码提交到git上面,就自动根据规则部署成服务。

那这里使用第二种进行部署。

Jenkins介绍

Jenkins在这里充当了一个自动构建的角色。无需人工干预。一个配置简单和使用方便的持续集成服务器,或许可以写一个脚本,监控git是否有更新,有的话就下载下来,package一下。但是他最强大的功能是他有很多插件,比如邮件发送

项目部署

安装软件

我的Linux服务器是centon7

1.安装Java

查找java相关的列表

yum -y list java*

安装jdk

http://apache.apooloo.cn/#/down/f1b54d77df533af9d9de55cf3f4e2cea

cd /usr/local 放到此目录

tar -zxvf jdk-8u202-linux-x64.tar.gz

建立软连接

ln -s /usr/local/jdk1.8.0_202/ /usr/local/jdk

完成安装后验证

java -version

配置环境变量

vim /etc/profile

在文件最后加入:

#set java environment
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

修改/etc/profile之后让其生效

source /etc/profile

2.安装Maven

yum -y list maven* #查看了一下发现版本都特别低,跟平时用的不太一样,为了安全,还是手动安装吧

官网下载好托到/usr/local

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第11张图片

解压

cd /usr/local

tar -zvxf apache-maven-3.6.3-bin.tar.gz

编辑文件

cd apache-maven-3.6.3

vim conf/settings.xml

找到localRepository

<localRepository>/opt/jarstorelocalRepository>

找到mirror

<mirror>
	 <id>alimavenid>
 	<mirrorOf>centralmirrorOf>
 	<name>aliyun mavenname>
 	<url>https://maven.aliyun.com/repository/centralurl>
mirror>

<mirror> 
	<id>alimavenid> 
	<name>aliyun mavenname> 
	<url>http://maven.aliyun.com/nexus/content/groups/public/url> 
 	<mirrorOf>centralmirrorOf> 
mirror> 

你还没有jarstore文件夹

cd /opt

mkdir jarstore

配置环境变量

vim /etc/profile

在文件最后加入:

export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH 

修改/etc/profile之后让其生效

source /etc/profile

3.安装Git

yum -y install git

4.安装Docker

安装些必要的工具

yum install -y yum-utils device-mapper-persistent-data lvm2

添加软件源信息

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新并安装Docker-CE

yum makecache fast

yum -y install docker-ce

开启Docker服务

service docker start

这里到另一台服务器B也安装Docker,然后开始安装下面软件

安装Mysql

docker pull mysql #我这里直接装最新版了

然后创建一个外部目录,用来映射数据之类的

mkdir /opt/mysql

运行mysql

docker run -p 3306:3306 --name mymysql -v /opt/mysql/conf:/etc/mysql/conf.d -v /opt/mysql/logs:/logs -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql

然后远程连接一下(如果你的服务器安全组规则没有配置,记得去开放下3306)

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第12张图片

这时候顺便把本地开发时候的数据库上传上去

代码里面的和数据库有关的信息等会一起改。

安装Redis

docker pull redis

然后创建一个外部目录,用来映射数据之类的

mkdir /opt/redis

运行redis

docker run -p 6379:6379 --name redis1 -v /opt/redis/redis.conf:/etc/redis/redis.conf -v /opt/redis/data:/data -d redis redis-server /etc/redis/redis.conf --requirepass "123456" --appendonly yes

测试

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第13张图片

安装Nacos

docker pull nacos/nacos-server

挂载日志和配置文件

mkdir -p /opt/nacos/logs/ #新建logs目录
mkdir -p /opt/nacos/init.d/
touch /opt/nacos/init.d/custom.properties
vim /opt/nacos/init.d/custom.properties

配置文件可以不用MySQL,这里尽量模拟真实环境就用了

server.contextPath=/nacos
server.servlet.contextPath=/nacos
server.port=8848
 
spring.datasource.platform=mysql
 
db.num=1
db.url.0=jdbc:mysql://xxx.xxx.xxx.xxx:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=1234
 
 
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
 
management.metrics.export.elastic.enabled=false
 
management.metrics.export.influx.enabled=false

server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i
 
 
nacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/login,/v1/console/health/**,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/**,/v1/console/server/**
nacos.naming.distro.taskDispatchThreadCount=1
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
nacos.naming.expireInstance=true

执行mysql脚本

新建一个nacos 数据库 然后选择utf8mb4 //是不是很贴心

CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(255) DEFAULT NULL,
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
 
/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_aggr   */
/******************************************/
CREATE TABLE `config_info_aggr` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(255) NOT NULL COMMENT 'group_id',
  `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
  `content` longtext NOT NULL COMMENT '内容',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';
 
 
/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_beta   */
/******************************************/
CREATE TABLE `config_info_beta` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';
 
/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_tag   */
/******************************************/
CREATE TABLE `config_info_tag` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';
 
/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_tags_relation   */
/******************************************/
CREATE TABLE `config_tags_relation` (
  `id` bigint(20) NOT NULL COMMENT 'id',
  `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
  `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`nid`),
  UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';
 
/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = group_capacity   */
/******************************************/
CREATE TABLE `group_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';
 
/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = his_config_info   */
/******************************************/
CREATE TABLE `his_config_info` (
  `id` bigint(64) unsigned NOT NULL,
  `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',
  `src_user` text,
  `src_ip` varchar(20) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`nid`),
  KEY `idx_gmt_create` (`gmt_create`),
  KEY `idx_gmt_modified` (`gmt_modified`),
  KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';
 
 
/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = tenant_capacity   */
/******************************************/
CREATE TABLE `tenant_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';
 
 
CREATE TABLE `tenant_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `kp` varchar(128) NOT NULL COMMENT 'kp',
  `tenant_id` varchar(128) default '' COMMENT 'tenant_id',
  `tenant_name` varchar(128) default '' COMMENT 'tenant_name',
  `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
  `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
  `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
  `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';
 
CREATE TABLE users (
	username varchar(50) NOT NULL PRIMARY KEY,
	password varchar(500) NOT NULL,
	enabled boolean NOT NULL
);
 
CREATE TABLE roles (
	username varchar(50) NOT NULL,
	role varchar(50) NOT NULL,
	constraint uk_username_role UNIQUE (username,role)
);
 
CREATE TABLE permissions (
    role varchar(50) NOT NULL,
    resource varchar(512) NOT NULL,
    action varchar(8) NOT NULL,
    constraint uk_role_permission UNIQUE (role,resource,action)
);
 
INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
 
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

启动容器

docker run
–name mynacos -d
-p 8848:8848
–privileged=true
–restart=always
-e JVM_XMS=128m
-e JVM_XMX=128m
-e MODE=standalone
-e PREFER_HOST_MODE=hostname
-v /opt/nacos/logs:/usr/docker/data/nacos/logs
-v /opt/nacos/init.d/custom.properties:/usr/docker/data/nacos/init.d/custom.properties
nacos/nacos-server

这里限制了nacos的最大内存

使用docker stats 查看docker内存占用

然后访问

http://xxxx.xxx…xxx.xx:8848/nacos 记得后面的nacos

默认密码 nacos nacos //登录之后右上角改密码,毕竟不是开发阶段了

到这里以后就要修改下代码中每个微服务设计到mysql,redis,nacos的配置信息了。

修改的时候遇到一个坑,nacos也不要加http:// 否则可能会出问题

创建git仓库

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第14张图片

这里创建私有仓库,毕竟代码中包含很多私密配置信息

然后把代码上传上去

!!!注意,从下面开始,我就要用另一台服务器了,

经过我很多天的测试,一台服务器确实跑不起来

整个项目我用了两台4G服务器

A:部署Nacos,Redis,Mysql ,前端项目 B:运行九个微服务。

这时候回到服务器A,开始做部署

配置jenkins.war

首先把jenkins.war 上传到 /usr/local/jenkins

cd /usr/local/jenkins

nohup java -jar /usr/local/jenkins/jenkins.war >/usr/local/jenkins/jenkins.out &

//这句话要敲两次回车

记得去打开8080端口 然后访问http://xxxx:8080/

这里他加载有些慢,等着就好

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第15张图片

等他加载完了然后查看密码

cat /root/.jenkins/secrets/initialAdminPassword

然后把密码输入进去。顺便暂时保存一下密码,等下还用

然后赶快更新源

cd /root/.jenkins/updates #进入更新配置位置

输入下面内容

sed -i ‘s/http://updates.jenkins-ci.org/download/https://mirrors.tuna.tsinghua.edu.cn/jenkins/g’ default.json && sed -i ‘s/http://www.google.com/https://www.baidu.com/g’ default.json

这时候重启下jenkins

nohup java -jar /usr/local/jenkins/jenkins.war >/usr/local/jenkins/jenkins.out &

然后刷新下网页,他又让你输密码,你输就完事了

选第一个

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第16张图片

大概几分钟就好了,他会卡一会

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第17张图片

然后一直下一步

登录之后点这里

全局工具配置

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第18张图片

配置JDK

which jdk //输出jdk目录

然后填进去,记得把自动安装取消勾选

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第19张图片

配置Maven

which jdk //这个也可以查路径

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第20张图片

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第21张图片

配置Git

git也一样

which git

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第22张图片

自动化部署项目

在每一个项目中添加文件Dockerfile

#FROM java:8
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar", "app.jar", "-Xms32M -Xmx32M -XX:PermSize=32M -XX:MaxPermSize=64M"]

-Xms32M -Xmx32M -XX:PermSize=32M -XX:MaxPermSize=64M 有些过分,如果两个服务器可以改大点

在项目pom文件添加打包类型,和maven插件

jar

<plugin>
    <groupId>com.spotifygroupId>
    <artifactId>dockerfile-maven-pluginartifactId>
    <version>1.3.6version>
    <configuration>
        <repository>${project.artifactId}repository>
        <buildArgs>
            <JAR_FILE>target/${project.build.finalName}.jarJAR_FILE>
        buildArgs>
    configuration>
plugin>

在有数据库的微服务pom里面加上这个

<resource>
    <directory>src/main/resourcesdirectory>
    <includes>
        <include>**/*.ymlinclude>
        <include>**/*.xmlinclude>
        <include>**/*.propertiesinclude>
    includes>
resource>

打开Jenkins 添加项目,添加一个流水线项目

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第23张图片

构建这里添加一个参数,脚本会根据你的参数去拉取git,你也可以写死

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第24张图片

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第25张图片

选择执行本地文件,添加一下git账号密码

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第26张图片

然后保存。。。。这里可以选择哪个git钩子函数,这样你一上传git他就能自动构建。

git凭证ID这里查询

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第27张图片

如果你问我的都是英文,找不到这个啊,emmm。出来挨打!

在总项目目录下添加

//git凭证ID
def git_auth = "xxxxxxxxxxxxxxxxxxx"
//git的url地址
def git_url = "https://gitee.com/jimu98/jimuxuetang.git"
//镜像的版本号
def tag = "latest"

node {
    stage('拉取代码') {
      checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
    }

    stage('编译,项目依赖工程') {
      sh "mvn -f common clean install"
    }

    stage('编译,网关微服务') {
      sh "mvn -f infrastructure/api_gateway clean package dockerfile:build"
    }



    stage('编译,service_cms') {
      sh "mvn -f service/service_cms clean package dockerfile:build"
    }
    stage('编译,service_edu') {
      sh "mvn -f service/service_edu clean package dockerfile:build"
    }
    stage('编译,service_oss') {
      sh "mvn -f service/service_oss clean package dockerfile:build"
    }
    stage('编译,service_sms') {
      sh "mvn -f service/service_sms clean package dockerfile:build"
    }
    stage('编译,service_statistics') {
      sh "mvn -f service/service_statistics clean package dockerfile:build"
    }
    stage('编译,service_trade') {
      sh "mvn -f service/service_trade clean package dockerfile:build"
    }
    stage('编译,service_ucenter') {
      sh "mvn -f service/service_ucenter clean package dockerfile:build"
    }
    stage('编译,service_vod') {
      sh "mvn -f service/service_vod clean package dockerfile:build"
    }



}

然后再创建一个任务

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第28张图片

这次选择自由风格的就可以了。

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第29张图片

这里我选择的是在前一个工程创建完成之后构建,也就是前一个任务把微服务都打包成docker容器之后

这个脚本作用自动去构建这些,不用手动运行。

构建就点执行shell 如果遇到英文 翻译一下 shell总认识吧。

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第30张图片

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第31张图片

添加脚本

贴心提示:我这里微调了一下限制的内存

经过测试 edu,cms微服务比较容易被kill 我给他的容量大一点

imageId=`docker ps -a| grep api_gateway | awk '{print $1}'`
if [ "$imageId" !=  "" ] ; then
    #停掉容器
    docker stop $imageId
    #删除容器
    docker rm $imageId
	
	echo "成功删除容器"
fi
docker run -di -m 200M --name api_gateway -p 9110:9110 api_gateway

imageId=`docker ps -a| grep service_edu | awk '{print $1}'`
if [ "$imageId" !=  "" ] ; then
    #停掉容器
    docker stop $imageId
    #删除容器
    docker rm $imageId
	
	echo "成功删除容器"
fi
docker run -di -m 400M --name service_edu -p 8110:8110 service_edu

imageId=`docker ps -a| grep service_oss | awk '{print $1}'`
if [ "$imageId" !=  "" ] ; then
    #停掉容器
    docker stop $imageId
    #删除容器
    docker rm $imageId
	
	echo "成功删除容器"
fi
docker run -di -m 256M --name service_oss -p 8120:8120 service_oss

imageId=`docker ps -a| grep service_vod | awk '{print $1}'`
if [ "$imageId" !=  "" ] ; then
    #停掉容器
    docker stop $imageId
    #删除容器
    docker rm $imageId
	
	echo "成功删除容器"
fi
docker run -di -m 256M --name service_vod -p 8130:8130 service_vod

imageId=`docker ps -a| grep service_cms | awk '{print $1}'`
if [ "$imageId" !=  "" ] ; then
    #停掉容器
    docker stop $imageId
    #删除容器
    docker rm $imageId
	
	echo "成功删除容器"
fi
docker run -di -m 400M --name service_cms -p 8140:8140 service_cms

imageId=`docker ps -a| grep service_sms | awk '{print $1}'`
if [ "$imageId" !=  "" ] ; then
    #停掉容器
    docker stop $imageId
    #删除容器
    docker rm $imageId
	
	echo "成功删除容器"
fi
docker run -di -m 256M --name service_sms -p 8150:8150 service_sms

imageId=`docker ps -a| grep service_ucenter | awk '{print $1}'`
if [ "$imageId" !=  "" ] ; then
    #停掉容器
    docker stop $imageId
    #删除容器
    docker rm $imageId
	
	echo "成功删除容器"
fi
docker run -di -m 256M --name service_ucenter -p 8160:8160 service_ucenter

imageId=`docker ps -a| grep service_trade | awk '{print $1}'`
if [ "$imageId" !=  "" ] ; then
    #停掉容器
    docker stop $imageId
    #删除容器
    docker rm $imageId
	
	echo "成功删除容器"
fi
docker run -di -m 256M --name service_trade -p 8170:8170 service_trade

imageId=`docker ps -a| grep service_statistics | awk '{print $1}'`
if [ "$imageId" !=  "" ] ; then
    #停掉容器
    docker stop $imageId
    #删除容器
    docker rm $imageId
	
	echo "成功删除容器"
fi
docker run -di -m 256M --name service_statistics -p 8180:8180 service_statistics


修改下脚本路径

端口号,项目路径,名字

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第32张图片

我这里放一些名字,如果你需要的话可以从这里复制

api_gateway
service_cms
service_edu
service_oss
service_sms
service_statistics
service_trade
service_ucenter

然后把代码提交到git,选择运行

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第33张图片

如果出现构建找不到dockerfile文件

需要在maven的xml文件中添加信赖

com.spotify

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第34张图片

构建成功,看一下docker运行

SpringCloud+Jenkins+Docker持续部署积木学堂[谷粒学院]_第35张图片

free -h 看下Linux内存

看完是不是觉得,就这?就这三天两夜???哈哈,主要是本人太菜了。

前端:

前端其实也是可以使用Jenkins持续构建的。但是我感觉前端项目不怎么修改

而且夜已深。直接扔到服务器运行了,Nginx代理一下

暂时先写到这里了

你可能感兴趣的:(微服务,Linux,前端,linux,docker,微服务,SpringCloud,SpringBoot)