springboot项目基于Docker的gitlab-runner的CI/CD实践,实操问题记录并解决办法

2022-06-16 14:05:53

1. 项目以容器方式构建

1.1. 在项目中添加dockerFile【springboot项目的根目录下】

FROM mcr.microsoft.com/java/jdk:11-zulu-alpine
RUN adduser --disabled-password --gecos '' xxx
USER xxx
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} /main/program/hxl-test/test.jar
ENTRYPOINT ["java","-jar","/main/program/hxl-test/test.jar"]

1.2. maven中集成docker镜像构建: 添加spotify的dockerFile maven 插件

【踩坑:原来的spring-boot-maven-plugin不要移除,否则会启动找不到main文件】

 <!-- 使用Maven插件直接将应用打包为一个Docker镜像 -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.4.13</version>
                <executions>
                    <execution>
                        <id>build</id>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>tag-latest</id>
                        <goals>
                            <goal>tag</goal>
                        </goals>
                        <configuration>
                            <tag>latest</tag>
                        </configuration>
                    </execution>
                </executions>
                <configuration>
                    <repository>${docker.image.prefix}/${project.name}</repository> //设置镜像名
                    <tag>${project.version}</tag> //设置tag号
                    <dockerfile>${project.basedir}/Dockerfile</dockerfile> //指定Dockerfile路径,根据Dockerfile创建镜像
                    <retryCount>${docker.build.retry.count}</retryCount>
                </configuration>
            </plugin>

1.3. 使用docker-compose在开发和测试环境中编排容器

在项目根目录创建docker-compose文件夹,并创建编写docker-compose.yml

version: '1.0'
services:
  redis:
    image: redis:alpine
    container_name: hxl_redis
    ports:
      - "12300:12300"
    restart: always
    command: redis-server --port 12300 --requirepass yourPwd #创建一个包含密码的redis容器

  hxl-test:
    image: hxl-test/testci:1.0.0
    restart: always
    entrypoint:
      - java
      - -XX:+UseShenandoahGC
      - -Xms256m
      - -XX:+UnlockExperimentalVMOptions
      - -XX:ShenandoahUncommitDelay=1000
      - -XX:ShenandoahGuaranteedGCInterval=10000
      - -jar
      - /main/program/hxl-test/test.jar
    ports:
      - "12400:12200" #前面的是对外开放的端口,后面的容器启动端口
    volumes:
      - /main/program/hxl-test/logs2:/main/program/hxl-test/logs #前面的是宿主机目录,后面的容器中的目录
    depends_on:
      - redis

1.4. 添加 gitlab-runner 流水线

这里的安装,均可参照docker官网以及gitlab-runner的官方文档:

docker:https://docs.docker.com/engine/install/centos/
docker-compose:https://docs.docker.com/compose/install/
gitlab-runner:https://docs.gitlab.com/runner/install/linux-manually.html

1.4.1. 安装Docker Engine - Community
检查docker是否安装以及版本

$ sudo docker version

1.4.2. 安装docker-compose

1.4.3. 安装Gitlab-runner
安装git maven

sudo yum install git maven

修改启动用户,文件:/etc/systemd/system/gitlab-runner.service。

1.4.4. 注册runner并编写.gitlab-ci.yml
【这里gitlab-runner方式选的shell方式即可】

1.4.5. 在项目根目录下创建编写 .gitlab-ci.yml

stages:
  - build
  - deploy-dev

build:
  stage: build
  tags:
    - master
  only:
    refs:
      - master
  script:
    - mvn clean package -Dmaven.test.skip=true

deploy-dev:
  stage: deploy-dev
  tags:
    - master
  only:
    refs:
      - master
  script:
    - sudo -u xxx whoami
    - sudo -u xxx mkdir -p /main/program/hxl-test
    - sudo -u xxx cp -r ./docker-compose/. /main/program/hxl-test #复制当前项目的docker-compose下的文件到/main/program/hxl-test目录,即docker-compose.yml文件
    - cd /main/program/hxl-test
    - sudo -u xxx sudo docker-compose up -d #启动容器
  needs:
    - job: build

2.操作过程中遇到的错误及解决办法

1.管道第一步跑失败:

百度说是git版本过低,但是同一个环境中另一个项目可成功运行,所以排除,最后发现修改项目的如下配置即可:
在这里插入图片描述

解决办法:在项目的设置中,找到流水线通用设置,从git fetch----》 git clone
在这里插入图片描述

2.部署到服务器时,docker-compose启动找不到对应的镜像

在这里插入图片描述

解决办法
镜像的tag没有对应上,项目中的docker-compose.yml中的镜像名为:
在这里插入图片描述

但是由于我在.gitlab-ci.yml中配置了这个命令,将会覆盖我在pom中设置的tag,采用maven自己创建的tag号,取消这行代码,再次上传,管道即可通过
在这里插入图片描述

3.日志没有按照预想中的打印在某个文件夹下

解决办法
查看容器的日志挂载信息:

 docker inspect -f "{{.Mounts}}" 33ddaa88da36
[{bind  /main/program/hxl-test/logs /main/program/hxl-test/logs  rw true rprivate}]

//或者使用命令:

 docker inspect hxl-test_hxl-test_1 | grep Mounts -A 10
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/main/program/hxl-test/logs",
                "Destination": "/main/program/hxl-test/logs",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        "Config": {

具体解决办法
修改配置,日志输出文件为:

logging.file.name=/main/program/hxl-test/logs/hxl-test.log

修改挂载信息:

volumes:前面的是宿主机的路径,后面的是容器中的目录
ports:前面的是对外开放的端口,后面的是容器中的端口

volumes:
  - /main/program/hxl-test/logs:/main/program/hxl-test/logs

最后重新运行,查看指定挂载目录的日志文件映射成功:

  • 作者:urban_37
  • 原文链接:https://xiaosanqi.blog.csdn.net/article/details/121292326
    更新时间:2022-06-16 14:05:53