在Ubuntu22.04上使用Jenkins+Docker 持续集成springboot,完美支持多环境配置

第一部:准备2台虚拟机

服务器名 IP
jenkins 192.168.124.249
docker 192.168.124.248

第二部:在jenkins服务器上安装java,因为后续需要编译代码,所以直接安装jdk

  1. 安装jdk,目前Jenkins最低需要jdk11

    apt install openjdk-11-jdk
    

第三步:安装jenkins

  1. 由于Jenkins和Ubuntu版本更新,安装方式也可能会变.参考官方文档
    https://www.jenkins.io/doc/book/installing/linux/#debianubuntu

  2. 修改jenkins端口号

    vim /etc/init.d/jenkins
    vim /etc/default/jenkins
    vim /usr/lib/systemd/system/jenkins.service
    systemctl daemon-reload
    
  3. 启用 Jenkins(自动启动),并使用以下命令验证状态:

    systemctl enable jenkins
    systemctl start jenkins
    systemctl status jenkins
    
  4. 配置防火墙
    我把jenkin的端口号设置为了7777

    ufw allow 7777
    ufw allow OpenSSH
    ufw enable
    ufw status
    

第四步:在Docker服务器安装docker和docker-compose

  1. 安装docker

    curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
    
  2. 安装docker-compose

    apt-get install docker-compose
    
  3. 开启docker远程访问

    vim /usr/lib/systemd/system/docker.service
    
    ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock
    
  4. 重启docker

    systemctl daemon-reload
    systemctl restart docker
    

    通过浏览器验证远程访问是否成功: http://192.168.124.248:2375/images/json

第五步:编写shell脚本、docker-compose.yml和Dockerfile,放到docker服务器的/home/benchu

  1. demo-start.sh

    app_name='xxxx-java'
    echo '通过docker-compose关闭容器'
    docker-compose down
    echo '删除老镜像'
    #docker images -a|grep none|awk '{print $3}'|xargs docker rmi
    docker rmi xxxx-java
    echo '创建新的镜像'
    docker build -t xxxx-java .
    echo '通过docker-compose启动容器'
    docker-compose up -d
    
  2. demo-start.sh 添加执行权限

    chmod 777 emo-start.sh
    
  3. Dockerfile,最后一步 可以灵活配置多环境

    # 基础镜像
    FROM openjdk:8
    # author
    MAINTAINER Stud
    
    # 挂载目录
    VOLUME /home/benchu
    # 创建目录
    RUN mkdir -p /home/benchu
    # 指定路径
    WORKDIR /home/benchu
    # 复制jar文件到路径
    COPY benchu-admin.jar /home/benchu/benchu-admin.jar
    # 启动应用
    ENTRYPOINT ["java","-jar","benchu-admin.jar","--spring.profiles.active=test"]
    
  4. docker-compose.yml

    version: '3'
    services:
      benchu:
        container_name: 'xxxx-java'
        image: 'xxxx-java'
        restart: always
        environment:
          TZ: 'Asia/Shanghai'
        ports:
          - '8888:8888'
        volumes:
          - /home/jenkins/logs:/home/demo/logs
    

    路径映射volumes,左边是宿主机,右边是docker容器.目前只把logs映射到宿主机,根据实际情况修改

第六步:通过浏览器配置jenkins,并新建构建视图

前面的配置git,SSH,jdk,maven和新建item的前半段就不赘述了,非常简单,网上教程也很多.

jenkins–系统管理–系统配置–Publish over SSH
在Ubuntu22.04上使用Jenkins+Docker 持续集成springboot,完美支持多环境配置_第1张图片

从新建item的构建开始.

  1. 增加构建步骤 ==>> 调用顶层的maven目标
    在Ubuntu22.04上使用Jenkins+Docker 持续集成springboot,完美支持多环境配置_第2张图片

  2. 增加构建步骤 ==>> Send files or execute commands over SSH
    在Ubuntu22.04上使用Jenkins+Docker 持续集成springboot,完美支持多环境配置_第3张图片

  3. 增加构建步骤 ==>> Execute shell script on remote host using ssh (这些脚本理论上是可以放在上一步的,图片的cd目录写错了懒得改了)

    cd /home/benchu
    echo '当前所在路径'
    pwd
    sh demo-start.sh
    

在Ubuntu22.04上使用Jenkins+Docker 持续集成springboot,完美支持多环境配置_第4张图片

完结撒花

后续:分离lib

由于jenkins与docker服务器可能不是内网传输,带宽也不高,导致发包时间很长,下面基于以上配置,修改3个地方的文件
  1. 修改pom文件

    <plugin>
       <groupId>org.apache.maven.pluginsgroupId>
        <artifactId>maven-jar-pluginartifactId>
        <configuration>
            <outputDirectory>${project.build.directory}outputDirectory>
            <archive>
                <addMavenDescriptor>trueaddMavenDescriptor>
                <manifest>
                    <useUniqueVersions>falseuseUniqueVersions>
                    <addClasspath>trueaddClasspath>
                    <classpathPrefix>./libclasspathPrefix>
                    <mainClass>com.XXX.XXXXXXApplicationmainClass>
                manifest>
            archive>
        configuration>
    plugin>
    <plugin>
        <groupId>org.apache.maven.pluginsgroupId>
        <artifactId>maven-dependency-pluginartifactId>
        <executions>
            <execution>
                <id>copy-dependenciesid>
                <phase>packagephase>
                <goals>
                    <goal>copy-dependenciesgoal>
                goals>
                <configuration>
                    <outputDirectory>
                        ${project.build.directory}/lib
                    outputDirectory>
                configuration>
            execution>
        executions>
    plugin>
    
  2. 修改Dockerfile (修改了最后一句,启动服务时指定lib)

    ENTRYPOINT ["java","-jar","XXXX.jar","-Dloader.path=./lib","-Djava.ext.dirs=./lib","--spring.profiles.active=prod"]
    
  3. 修改docker-compose (把lib映射到docker)

    - /home/xxx/lib:/home/xxx/lib
    
  4. 修改jenkins配置,如果本地打包时会把一些其他模块的代码打成jar包的话,则把所有模块都拷贝到服务器的lib里
    在Ubuntu22.04上使用Jenkins+Docker 持续集成springboot,完美支持多环境配置_第5张图片

  5. 至此,每次打包后,会在target里生成lib,如果lib发生变化(上一部中包含的不算),需要把lib拷贝到服务器的/home/xxx/lib里.

你可能感兴趣的:(jenkins,docker,ci,持续集成)