K8s?Jenkins?NO!只用gitlab就可以实现springboot(多模块)的自动化部署(全过程+踩坑)

举报
一只牛博 发表于 2024/10/22 12:31:12 2024/10/22
【摘要】 K8s?Jenkins?NO!只用gitlab就可以实现springboot(多模块)的自动化部署(全过程+踩坑)

为什么用

  1. 首先对于k8s以及Jenkins其实我也都使用过,k8s的功能是很强大,但是成本比较高(学习成本,部署成本,以及问题修复成本,当然这可能仅仅是对于我这种小菜鸡而言),至于Jenkins,当我用了gitlab的CICD的时候,我觉得大致功能都涵盖了,但是Jenkins包含的插件比较多,需要自己动手的地方比较少

  2. 对于k8s以及Jenkins搭建对服务器的要求比较高,自用服务器也许跑一个就跑满了

  3. gitlab成本更低(我的服务器是4c4g8m而且跑了4个mysql,好多个docker项目,以及nginx、redis等)

基础必备

服务器部署gitlab-runner(非gitlab哈)

.gitlab-ci.yml文件的完整指南

用白薅来的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

解释

  1. 时区设置:通过 ENV TZ=Asia/Shanghai 设置容器的时区为上海,并使用 ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone 命令将时区信息应用到容器中。

  2. 目录和文件复制COPY 指令将本地的 lib 目录和 flow-web.jar 文件复制到容器的 /app 目录中。

  3. 日志挂载:使用 VOLUME /app/log 指定日志目录为一个卷,方便在启动容器时挂载本地日志目录。

  4. 启动命令:通过 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,这个是你的模块(如果你是多模块),所以他是会变的

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。