• 使用Docker+Jenkins+Gitee自动化部署SpringBoot项目


    搭建基础环境

    1、使用Docker-Compose搭建基础环境

    在linux中创建mydata文件夹。在该文件夹下写入以下代码脚本。
    使用sed -i 's/\r//' start.sh将windows复制的文本转换成linux的文本。否则直接复制使用的话会提示commond not found。
    在这里插入图片描述
    其中start.sh中涉及到的相关配置文件、文件夹需要自己准备。当然你也可以手动删除该相关配置,在搭建自动化部署的过程中,并未用到。因为想单独配置自己的git以及maven进行自动化,但是失败了,后期再考虑如何配置,保留相关环境。
    如下为我自己的配置:
    搭建mysql时自动初始化配置文件的pro.sql。cp /sql/pro.sql /mydata/mysql/init
    复制maven配置文件:cp /sql/settings.xml ./
    复制git安装包:cp /sql/git-2.38.1.tar.gz ./

    echo -e "\e[1;31m安装本地maven环境\e[0m"
    mkdir -p /mydata/maven
    cd /mydata/maven
    wget --no-check-certificate https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz
    tar -zxvf apache-maven-3.8.6-bin.tar.gz
    cd /mydata/maven/apache-maven-3.8.6/conf/
    mkdir -p /m2/repository
    rm -rf settings.xml
    cp /sql/settings.xml ./
    echo -e "\e[1;31m配置maven环境变量\e[0m"
    cat >> /etc/profile </mydata/maven/apache-maven-3.8.6
    PATH=\$MAVEN_HOME/bin:\$PATH
    export MAVEN_HOME PATH
    EOF
    echo -e "\e[1;31m安装本地git环境\e[0m"
    mkdir -p /mydata/git
    cd /mydata/git
    cp /sql/git-2.38.1.tar.gz ./
    tar -zxvf git-2.38.1.tar.gz
    mv git-2.38.1 /usr/local/
    cd /usr/local/git-2.38.1/
    yum -y install autoconf-2.69-11.el7.noarch
    yum -y install automake-1.13.4-3.el7.noarch
    make configure
    ./configure --prefix=/usr/local/git
    make profix=/usr/local/git
    make install
    cd /etc/profile.d/
    echo export PATH=\$PATH:/usr/local/git/bin > git.sh
    chmod +x /etc/profile.d/git.sh
    source /etc/profile.d/git.sh
    echo -e "\e[1;31m重新加载配置文件\e[0m"
    source /etc/profile
    echo -e "\e[1;31m创建mysql相关目录....\e[0m"
    mkdir -p /mydata/mysql/data
    mkdir -p /mydata/mysql/conf
    mkdir -p /mydata/mysql/init
    chmod -R 777 /mydata/mysql
    rm -rf /mydata/mysql/data/*
    cp /sql/pro.sql /mydata/mysql/init
    echo -e "\e[1;31m写入mysql配置文件....\e[0m"
    cat > /mydata/mysql/conf/my.cnf << EOF
    [mysqld]
    user=mysql
    default-storage-engine=INNODB
    character-set-server=utf8mb4
    collation-server = utf8mb4_general_ci
    [client]
    default-character-set=utf8mb4
    [mysql]
    default-character-set=utf8mb4
    EOF
    echo -e "\e[1;31m创建redis相关目录....\e[0m"
    mkdir -p /mydata/redis/data
    mkdir -p /mydata/redis/conf
    chmod -R 777 /mydata/redis
    rm -rf /mydata/redis/data/*rm -rf /mydata/redis/conf/*
    echo -e "\e[1;31m写入redis相关配置文件....\e[0m"
    cat > /mydata/redis/conf/redis.conf << EOF
    appendonly yes
    EOF
    chmod 777 /mydata/redis/conf/redis.conf
    echo -e "\e[1;31m创建rabbitmq相关配置文件\e[0m"
    mkdir -p /mydata/rabbitmq/data
    chmod -R 777 /mydata/rabbitmq
    rm -rf /mydata/rabbitmq/data/*
    echo -e "\e[1;31m创建Nginx相关配置文件\e[0m"
    mkdir -p /mydata/nginx/html /mydata/nginx/conf /mydata/nginx/conf.d /mydata/nginx/logs
    rm -rf /mydata/nginx/html/*
    rm -rf /mydata/nginx/conf/*
    rm -rf /mydata/nginx/conf.d/*
    rm -rf /mydata/nginx/logs/*
    chmod -R 777 /mydata/nginx
    echo -e "\e[1;31m写入nginx相关配置文件\e[0m"
    cat > /mydata/nginx/conf/nginx.conf << EOF
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        sendfile        on;
    
        keepalive_timeout  300;
        server {
            listen       80;
            server_name  192.168.56.103;
          
            location / {
                root   /usr/share/nginx/html;
                index  index.html index.htm;
            }
          
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    }
    EOF
    echo -e "\e[1;31m创建jenkins相关配置文件\e[0m"
    mkdir -p /mydata/jenkins/home
    chmod -R 777 /mydata/jenkins
    echo -e "\e[1;31m写入nginx默认首页\e[0m"
    cat > /mydata/nginx/html/index.html << EOF
    

    welcome to Nginx!</h3> EOF echo -e "\e[1;31m创建Tomcat文件夹\e[0m" mkdir -p /mydata/tomcat chmod -R 777 /mydata/tomcat echo -e "\e[1;31m清除docker-compose.yaml文件\e[0m" rm -rf /mydata/docker-compose.yaml echo -e "\e[1;31m写入docker-compose.yaml文件....\e[0m" cat > /mydata/docker-compose.yaml << EOF version: '3.3' services: mysql: image: mysql:5.7 container_name: mysql restart: always environment: MYSQL_ROOT_PASSWORD: 123456 TZ: Asia/Shanghai MYSQL_DATABASE: pro command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --explicit_defaults_for_timestamp=true --lower_case_table_names=1 ports: - 3306:3306 volumes: - /mydata/mysql/data:/var/lib/mysql - /mydata/mysql/conf:/etc/mysql/conf.d - /mydata/mysql/init:/docker-entrypoint-initdb.d/ redis: image: redis:5.0.14-alpine3.15 container_name: redis restart: always command: ["redis-server","/etc/redis/redis.conf"] ports: - 6379:6379 volumes: - /mydata/redis/data:/data - /mydata/redis/conf/redis.conf:/etc/redis/redis.conf rabbitmq: image: rabbitmq:3.8.3-management container_name: rabbitmq restart: always ports: - 15672:15672 - 5672:5672 volumes: - /mydata/rabbitmq/data:/var/lib/rabbitmq environment: - RABBITMQ_DEFAULT_USER=root - RABBITMQ_DEFAULT_PASS=root nginx: image: nginx:stable-alpine-perl container_name: nginx restart: always ports: - 80:80 volumes: - /mydata/nginx/html:/usr/share/nginx/html - /mydata/nginx/logs:/var/log/nginx - /mydata/nginx/conf.d:/etc/nginx/conf.d - /mydata/nginx/conf/nginx.conf:/etc/nginx/nginx.conf tomcat: restart: always image: tomcat:9.0 container_name: tomcat privileged: true ports: - 8080:8080 volumes: - /mydata/tomcat/webapps:/usr/local/tomcat/webapps - /mydata/tomcat/conf:/usr/local/tomcat/conf - /mydata/tomcat/logs:/usr/local/tomcat/logs environment: TZ: Asia/Shanghai jenkins: restart: always image: jenkins/jenkins:lts-jdk8 container_name: jenkins ports: - 10240:8080 - 10241:50000 volumes: - /mydata/jenkins/home:/var/jenkins_home - $(which docker):/usr/bin/docker - /var/run/docker.sock:/var/run/docker.sock EOF echo -e "\e[1;31m创建临时tomcat并获取配置文件....\e[0m" docker run --name tomcat -d -p 8080:8080 tomcat:9.0 echo -e "\e[1;31m进行文件复制....\e[0m" docker cp tomcat:/usr/local/tomcat/conf /mydata/tomcat docker cp tomcat:/usr/local/tomcat/logs /mydata/tomcat docker cp tomcat:/usr/local/tomcat/webapps /mydata/tomcat echo -e "\e[1;31m停止tomcat并删除临时容器....\e[0m" docker stop tomcat docker rm tomcat echo -e "\e[1;31m启动所有基础环境中....\e[0m" cd /mydata/ docker-compose up -d echo -e "\e[1;31m请核对docker进程的状态\e[0m" docker ps -a echo -e "\e[1;31m授权docker.sock配置文件\e[0m" chmod -R 777 /var/run/docker.sock echo -e "\e[1;31m重启jenkins\e[0m" docker restart jenkins echo -e "\e[1;31m请核对maven环境\e[0m" mvn -version echo -e "\e[1;31m请核对git环境\e[0m" git --version
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220

    其中,在搭建jenkins环境以便于进行自动化部署时,参考了很多的文章始终得不到解决,无一例外在构建步骤,提示docker: command not found。网上很多参考方案说的是jenkins没有进行容器卷挂载,使用外部的Docker指令。需要在运行jenkins时挂载/var/run/docker.sock:/var/run/docker.sock。但事实证明是不够的的,还需要挂载如下指令:$(which docker):/usr/bin/docker。同时,需要确保挂载成功后,需要给docker.sock授予权限。

    当出现以下面板时,基础环境搭建成功。
    在这里插入图片描述
    在这里插入图片描述

    2、搭建项目仓库环境,创建Dockerfile文件(2022-12-15更新)

    在IDEA根目录下,创建Dockerfile文件,连同Dockerfile文件一起上传至gitee/git。
    在这里插入图片描述

    FROM java:8
    
    VOLUME /tmp
    
    COPY ./target/JavaSpirder-1.0-SNAPSHOT.jar JavaSpirder-1.0-SNAPSHOT.jar
    
    EXPOSE 8088
    
    ENTRYPOINT ["java", "-jar", "/JavaSpirder-1.0-SNAPSHOT.jar", "&"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    其中,FROM java:8指的基础镜像是java镜像。COPY指的是将当前目录-target下的jar包一同拷贝到镜像里面,暴露端口为8088。当容器运行时执行java -jar JavaSpirder-1.0-SNAPSHOT.jar指令。target目录下的jar包名字需要自己在控制台输入mvn package执行打包命令。待打包完成过后查看。Volume用于创建一个挂载目录。
    关于VOLUME的说明,可以参考这篇文章一文说清楚Dockerfile 中VOLUME到底有什么用?

    同时,修改项目中yml的配置文件,将相关中间件的地址修改为基础环境中的地址。如:

    spring:
      application:
        name: java-spider
      main:
        allow-bean-definition-overriding: true
      jackson:
        date-format: yyyy-MM-dd HH:mm:ss
        time-zone: GMT+8
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://yourip:port/database?useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&allowMutiQueries=true
        username: yourusername # username
        password: yourpassword #password
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    一切完成后,上传至gitee/git。
    在这里插入图片描述

    • 2022-12-15更新
      dockerfile配置文件修改如下,修改了JDK镜像里的默认时间,确保容器运行时间与服务器时间同步。
    FROM java:8
    
    VOLUME /tmp
    
    COPY ./target/springboot-wxcloudrun-1.0.jar springboot-wxcloudrun-1.0.jar
    
    #修改jdk镜像里的默认时间
    RUN echo "Asia/Shanghai" > /etc/timezone
    
    EXPOSE 80
    
    ENTRYPOINT ["java", "-jar", "/springboot-wxcloudrun-1.0.jar", "&"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3、配置Jenkins

    3.1、初始化Jenkins

    当步骤1完成后,可以开始配置Jenkins。在浏览器中输入你的服务ip+端口,访问Jenkins。由于已经挂载了目录,因此可以前往/mydata/jenkins/home/secrets/initialAdminPassword中查看密码。也可以进入到容器内部docker exec -it jenkins /bin/bash后进行查询。
    在这里插入图片描述
    登陆成功后,根据自己的需要选择,可以安装推荐的插件,也可以选择插件来安装。安装推荐的插件里,只有一个git是我们需要的,我们后续还要安装插件。如果不安装推荐的插件,则需要搜索如下三个插件进行安装。

    • Maven Integration:Maven工具,此处不是maven仓库
    • Publish Over SSH:远程连接工具
    • Gitee:gitee仓库的一些辅助工具
      在这里插入图片描述
      在这里我选的是安装推荐的插件,但由于源的问题,以及版本的问题,安装推荐插件并不是总是成功的,但这并不影响我们的自动化部署。我们只需要继续就好。
      在这里插入图片描述
      此处可以自己创建新的账户,或者继续使用admin账户。
      在这里插入图片描述
      随后保存并完成即可。

    3.2、安装核心插件

    左侧面板点击“Manage Jenkins”。随后下拉页面。
    在这里插入图片描述
    点击Manage Plugins
    在这里插入图片描述
    选择可选插件,并安装如下插件。

    • Maven Integration:Maven工具,此处不是maven仓库
    • Publish Over SSH:远程连接工具
    • Gitee:gitee仓库的一些辅助工具
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    当然,由于Jenkins的优化,大部分版本只支持JDK11,因此并不是所有的插件下载都是一帆风顺的,例如我就全部下载失败。问题就在于镜像,在Docker-Compose中我使用的是jenkins/jenkins:lts-centos7-jdk8这个镜像。因此,若小伙伴们下载失败,可以考虑换个镜像下载Jenkins,或通过下载war包的方式直接更新Jenkins。
    在这里插入图片描述

    安装完成后,可在linux中手动重启Jenkins。Docker restart jenkins
    或者在插件栏勾选“安装完成后重启Jenkins”。
    在这里插入图片描述

    3.3、全局工具配置

    系统管理-全局工具配置。
    在这里插入图片描述

    3.3.1、配置Git。
    • 默认配置

    由于我们在安装推荐插件时,已经安装了git插件,因此我们的Jenkins里是存在Git的了,此处配置无需改动,使用默认配置即可。
    在这里插入图片描述

    • 自定义本地环境Git

    在步骤1搭建基础环境时,我的本地虚拟机环境也安装了Git,但是无论我怎么配置都配置失败。此处先占一个坑,后面有空的时候再研究一下。

    3.3.2、配置Maven
    • 默认配置

    由Jenkins帮我们下载Maven并使用。点击新增Maven。
    在这里插入图片描述
    填写Name,然后勾选自动安装即可。这样Jenkins在使用Maven时便会自动帮我们安装。
    在这里插入图片描述

    • 自定义本地环境Maven
      同样,在步骤1的时候,我在本地虚拟机已搭建成功git环境,但是在配置的时候总是配置失败,占坑,等下次更新时补充完整。
    3.3.3、配置JDK

    由于Jenkins自带了JDK,因此此处无需再额外配置。

    3.4、配置Git凭证

    点击“Manage Credentials”。
    在这里插入图片描述
    点击“全局-添加凭证”。
    在这里插入图片描述
    填写Git的用户名密码。
    在这里插入图片描述

    3.5、构建项目

    在菜单栏选中“新建项目”,选中构建一个Maven项目,输入你的项目名称。
    在这里插入图片描述

    3.5.1、配置源码管理

    勾选中“源码管理”。在此处配置你的Git仓库。若凭证(即3.4中配置的Git凭证)错误或者未填写,则会出现以下错误。
    在这里插入图片描述
    若你的凭证正确,则没有任何提示。
    在这里插入图片描述
    同时需要注意构建的分支,根据自己代码的分支情况选择构建时拉取的分支。*/master的意思是构建的分支为master分支。

    3.5.2、构建触发器(2022-12-15更新)

    Gitee webhook 提供了灵活的选择,可以指定为推送到仓库时自动拉取并构建项目。但若需要启用webhook功能,需要有一个公网的IP服务器地址才行。

    • 第一步:在jenkins配置webhooks
      在这里插入图片描述在这里插入图片描述
      其中在“允许触发构建的分支”中可以根据自己的需要制定构建分支。若只有一个分支,可以考虑所有分支选项。

    • 第二步:打开gitee仓库,在“管理-webhooks”中配置webhook
      在这里插入图片描述

    • 第三步:测试配置是否成功在这里插入图片描述
      保存webhook配置后,点击按钮“测试”。查看结果,若有响应结果,且在jenkins上能够查看到构建记录,则表明配置成功。

      若出现如下结果,提示响应超时,请记得查看自己服务器的防火墙是否有打开jenkins的防火墙接口,以及对应的入口ip是否有限制。
      在这里插入图片描述

    3.5.3、构建环境(可选)

    此处我只选择了Add timestamps to the console output。作用是在构建的时候,将输出到控制台的内容加上时间戳。
    在这里插入图片描述

    3.5.4、Build

    Goals and Optains中输入:clean install -Dmaven.test.skip=true
    clean为清空jar包。
    install为打jar包,打好的jar包在项目的target下面。
    -Dmaven.test.skip=true为不执行测试用例,也不编译测试用例类,跳过此类的打包。
    此处Build的意思是调用Maven对项目进行编译打包,在对应的Target目录下生成jar包的意思。相当于直接在IDEA中,执行打包命令生成jar。方便在3.5.5、Post Steps步骤中,执行shell时,将项目jar包复制到镜像容器内。
    在这里插入图片描述

    3.5.5、Post Steps

    选择执行shell。
    在这里插入图片描述

    填写shell语句。

    在这里插入图片描述
    cd /var/jenkins_home/workspace/Jenkins-Docker-Spider。这句话的意思是进入Jenkins容器内部工作目录。Jenkins-Docker-Spider是你自己在3.5构建项目中你自己输入的项目名称。

    docker stop java-spider || true。这句话的意思是,如果存在已经运行的容器,则暂停容器,否则默认为true,不做任何处理。

    docker rm java-spider || true。这句话的意思是,如果存在已经暂停了的容器,则移除该容器,否则默认为true,不做任何处理。

    docker rmi java-spider || true。这句话的意思是,如果已经移除了容器,则删除该容器对应的镜像,否则默认为true,不做任何处理。

    docker build -t java-spider .。这句话的意思是,根据目录下的 Dockerfile 文件构建镜像,-t 后面指定该镜像名称。注意后面还有一个“点”。这个点的意思就是表示当前目录,即Dockerfile所在目录。该Dockerfile即为我们在IDEA根目录下的文件。

    docker run -d -p 8088:8088 --name java-spider java-spider:latest。这句话的意思就是在后台运行该镜像生成容器,容器名为java-spider。

    cd /var/jenkins_home/workspace/Jenkins-Docker-Spider
    docker stop java-spider || true
    docker rm java-spider || true
    docker rmi java-spider || true
    docker build -t java-spider .
    docker run -d -p 8088:8088 --name java-spider java-spider:latest
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    3.5.6、立即构建

    当以上步骤完成后,点击保存。即可开始进行构建。
    在这里插入图片描述

    在构建任务出,查看控制台输出,观察构建过程。

    在这里插入图片描述

    在这里插入图片描述

    此处可以看到我构建失败了,原因是因为Jenkins内部无法执行Shell命令。虽然我在步骤1搭建基础环境时,我是将Jenkins内部使用的Docker指令和外部Docker进行挂载(- /var/run/docker.sock:/var/run/docker.sock)。但此时我并没有授权。因此只需要授权即可。在对应Linux终端输入[root@localhost ~]# chmod -R 777 /var/run/docker.sock即可。此时就可以正常的进行构建啦。

    在这里插入图片描述
    构建成功

    在这里插入图片描述

    此时查看我的Jenkins目录。可以看到Build步骤成功将jar包打包,在工作空间目标目录中,生成了我项目的jar包。

    在这里插入图片描述

    查看容器运行状态。可以发现我自己的镜像服务已经启动。

    在这里插入图片描述

    此时通过Postman访问我自己的服务,也可以成功将数据保存到我的虚拟机mysql中。

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    Find My资讯|美国警察通过Find My找回失窃车,苹果Find My为防盗窃起大作用
    《Linux运维总结:使用elasticdump工具迁移单节点elasticsearch数据(方案一)》
    【专栏】核心篇07| Redis “jio”美的集群模式
    前端vue经典面试题78道(重点详细简洁)
    神经网络滤镜安装教程图,ps神经网络滤镜安装包
    刷题笔记18——数组查缺补漏、二分搜索变体
    NestJS学习:搭建项目、依赖注入、常用命令、RESTful 风格设计
    Multilevel Cooperative Coevolution for Large Scale Optimization
    阿里云oss存储文件上传功能实现(保姆级教程)
    PC博物馆(番外01)-城会玩,初中生开发实体尺规大航海游戏
  • 原文地址:https://blog.csdn.net/ptGrapes/article/details/127964089