K8s?Jenkins?NO!只用gitlab就可以实现springboot(多模块)的自动化部署(全过程+踩坑)
为什么用
-
首先对于k8s以及Jenkins其实我也都使用过,k8s的功能是很强大,但是成本比较高(学习成本,部署成本,以及问题修复成本,当然这可能仅仅是对于我这种小菜鸡而言),至于Jenkins,当我用了gitlab的CICD的时候,我觉得大致功能都涵盖了,但是Jenkins包含的插件比较多,需要自己动手的地方比较少
-
对于k8s以及Jenkins搭建对服务器的要求比较高,自用服务器也许跑一个就跑满了
-
gitlab成本更低(我的服务器是4c4g8m而且跑了4个mysql,好多个docker项目,以及nginx、redis等)
基础必备
用白薅来的gitlab自带的gitlab-runner部署一个vue项目
大家可以先看上面的,其中之前用gitlab-runner跑了一个vue项目
boot项目环境总结
这里我只考虑部署的时候需要用到什么环境,别的可以忽略,还有这里仅仅是我用的环境,其实对于java8还是更高都是通用的
- jdk11
- maven3.6(3版本都行)
使用本机环境
这里我没有用到本机,因为感觉本机没什么挑战(开个玩笑~~~~~~)
本机的话就是乖乖的搭建maven,搭建java11环境即可,即使你存在java8,也是可以搭建的
使用docker
没错,我用的就是这种方法,说白了就是懒,哈哈哈
第一步:拉取镜像
当然这一步可拉可不拉,因为在自动化部署的时候会自己拉取的,但是如果你想更快,那就先拉吧,反正早晚都得拉,嘻嘻嘻。
这里可能会遇到拉取失败超时的问题(当然不仅仅是这一个镜像有问题,是大部分,dockerhub的问题)
解决方法如下:
1、先编辑一个文件,不管你有没有,放心大胆的干就是了,输入vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
说白了就是换源而已~~~
2、执行以下命令
systemctl daemon-reload
systemctl restart docker
大功告成继续拉取
3、执行docker pull maven:3.8.6-openjdk-11
拉取maven环境
4、执行openjdk:11-jre-slim
拉取java11环境
至此镜像环境就已经拉取完成了
第二步:配置gitlab-runner
当然这里要看你自己了,如果已经有了就可以忽略,不过我还是会详细讲一下配置过程的
1、首先你要知道你的执行器是docker,而非shell了
2、配置过程看:服务器部署服务器部署gitlab-runner(非gitlab哈)
最后的结果在/etc/gitlab-runner/config.toml
下面你能看到两个执行器就行了
.gitlab-ci.yml编写
stages:
- build
- deploy
variables:
MAVEN_CLI_OPTS: "-s .m2/settings.xml"
DEPLOY_PATH: /home/flow-camunda
DOCKER_COMPOSE_FILE: docker-compose.yml
MAVEN_SETTINGS:
<settings>
<mirrors>
<mirror>
<id>aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Aliyun Maven Mirror</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
</settings>
#before_script:
# - export MAVEN_HOME=/usr/share/maven
# - export PATH=$MAVEN_HOME/bin:$PATH
build:
stage: build
image: maven:3.8.6-openjdk-11 # 使用 镜像
# 这里是执行前,主要是把镜像源换为阿里的,这样比较快
before_script:
- echo "$MAVEN_SETTINGS" > ~/.m2/settings.xml
script:
# 好像和mvn clean package没什么太大区别
- mvn clean package -pl flow-web -am -DskipTests -T 4C
artifacts:
paths:
- ./flow-web-1.0.0.jar
# 一个模块的boot项目用不到
#- ./flow-config/target/flow-config-1.0.0.jar
#- ./flow-common/target/flow-common-1.0.0.jar
#- ./flow-service/target/flow-service-1.0.0.jar
only:
- master
- develop
tags:
- acowbo-docker
deploy:
stage: deploy
script:
# 将build中的产物复制到相应文件夹
- cp ./flow-web-1.0.0.jar $DEPLOY_PATH
# 如果你仅仅是简单的boot项目,这个用不到
#- cp ./flow-config/target/flow-config-1.0.0.jar $DEPLOY_PATH/lib
#- cp ./flow-common/target/flow-common-1.0.0.jar $DEPLOY_PATH/lib
#- cp ./flow-service/target/flow-service-1.0.0.jar $DEPLOY_PATH/lib
- cd $DEPLOY_PATH
# 清楚之前的
- docker-compose down
# 这个命令可以直接写为docker-compose up -d
- docker-compose -f $DOCKER_COMPOSE_FILE up -d
only:
- master
- develop
tags:
- acowbo
build讲解
当你看了基础必备的时候,其实好多东西就不需要讲解了,重点强调一下,build是基于docker的(不一定哦,如果你在上面没有用gitlab-runner中的docker执行器,而是本地搭建的java11和maven,那就是shell执行器,下同)
这里我仅仅说明一下 artifacts-paths:
,下面是我的目录截图
针对截图可以看到,打包的时候bo-camunda-flow就是根路径,只不过我在pom打包过程中修改了jar的生成路径了
剩余不懂的,可以直接看上面的yml,不过我相信大家都很强,一下就能懂
deploy
重点强调一下,deploy是基于shell的
我使用的是docker-compose部署springboot项目,也就是产物中的jar,如果大家不想这么麻烦,那么可以直接用以下命令替代,前提是你服务器有java11环境。
nohup java -jar flow-web-1.0.0.jar >consoleMsg.log 2>&1 &
deploy之docker-compose(推荐)
docker-compose需要一个docker-compose.yml即可,下面分享一下我自己的
version: '3.8'
services:
web:
image: openjdk:11-jre-slim
container_name: flow-camunda
volumes:
- ./lib:/app/lib # 将本地的lib目录挂载到容器内的/app/lib路径
- ./flow-web-1.0.0.jar:/app/flow-web.jar # 将本地的lib目录挂载到容器内的/app/lib路径
- ./log:/log # 挂载日志
command: java -Dloader.path="/app/lib" -jar /app/flow-web.jar # 添加-Dloader.path参数
ports:
- "19011:19011"
deploy之docker
这里其实都大差不差的,命令启动或者dockerfile启动都是可以的
你可以创建一个自定义的 Dockerfile,将设置时区和应用程序的启动指令结合在一起。以下是一个示例 Dockerfile,根据你的需求定制。
# 使用基础镜像
FROM openjdk:11-jre-slim
# 设置时区为中国上海
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 创建应用程序目录
WORKDIR /app
# 将本地lib目录复制到容器内的/app/lib路径
COPY ./lib /app/lib
# 将flow-web.jar复制到容器的/app目录
COPY ./flow-web-1.0.0.jar /app/flow-web.jar
# 创建日志目录并挂载卷(如果需要)
VOLUME /app/log
# 暴露端口
EXPOSE 19011
# 启动应用程序,指定loader.path
CMD ["java", "-Dloader.path=/app/lib", "-jar", "/app/flow-web.jar"]
构建镜像
在包含 Dockerfile 的目录中执行以下命令来构建 Docker 镜像:
docker build -t my-springboot-image:latest .
启动容器
使用以下命令启动容器:
docker run -d --name flow-camunda \
-v ./log:/app/log \ # 挂载日志目录
-p 19011:19011 \
my-springboot-image:latest
解释
-
时区设置:通过
ENV TZ=Asia/Shanghai
设置容器的时区为上海,并使用ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
命令将时区信息应用到容器中。 -
目录和文件复制:
COPY
指令将本地的lib
目录和flow-web.jar
文件复制到容器的/app
目录中。 -
日志挂载:使用
VOLUME /app/log
指定日志目录为一个卷,方便在启动容器时挂载本地日志目录。 -
启动命令:通过
CMD
指令指定应用程序的启动命令,包含-Dloader.path=/app/lib
参数。
欣赏成果
提交代码后gitlab的构建
服务器中执行
这里因为是线上项目,所以我默认控制台不输出内容,只放到相应的日志文件中了
彩蛋之优化打包
大家如果尝试过了就会觉得上面的build构建很慢,因为每次都需要拉取线上的maven,而不能拉取本地仓库中的
这里有自己想法推荐给大家
1、我们可以在本地中将maven本地地址修改,然后先拉取一遍
2、将拉取到的jar,比如springboot之类的这些不会变的,传到服务器
3、基于之前的maven-jdk11构建一个新的镜像,可以参考上面的dockerfile,简单说一下,就是将刚拉取到的jar作为你信的镜像中的一部分,并且修改配置文件中本地镜像地址,这样就不需要每次都从远程拉取了。
4、这个比较重要,你需要将你新创建的镜像发布,这里你可以发布到dockerhub中,或者自建dockerhub,再或者别的地点,仅放在本地是不能用的
彩蛋之优化jar打包
重要的事情说三遍,这个和上面的不一样*3,这样做的好处是jar可以非常小,比如我的这个
仅仅324k,然后需要的依赖其实就在lib文件夹下了。
要注意一点,就是flow开头的jar,这个是你的模块(如果你是多模块),所以他是会变的
- 点赞
- 收藏
- 关注作者
评论(0)