Jenkins 持续集成&部署(二)持续集成、持续部署

一、持续构建

1. 构建maven项目

点击新建,出现下图,名字随便起,选择构建一个maven项目

在这里插入图片描述

2. 构建配置

在这里插入图片描述

源码地址:
在这里插入图片描述

构建触发器:

在这里插入图片描述

3. 构建成功

在这里插入图片描述

在这里插入图片描述

可以在命令中添加脚本,这样打包后就可以直接运行
在这里插入图片描述

在这里插入图片描述
通过jar直接执行只适合一些小型项目,分布式项目要做成镜像,推送到镜像仓库,然后容器化方式部署

二、持续部署

1. 执行shell脚本

必须加 #!/bin/bash,否则会启动不起来,#!/bin/sh是指此脚本使用/bin/sh来解释执行

#!/bin/bash

#export BUILD_ID=dontKillMe这一句很重要,这样指定了,项目启动之后才不会被Jenkins杀掉。
export BUILD_ID=dontKillMe

#指定最后编译好的jar存放的位置
www_path=/var/codespace/test/

#Jenkins中编译好的jar位置(从git上下载下来的代码就放在该目录下)
jar_path=/root/.jenkins/workspace/test/supergo-eureka/target

#Jenkins中编译好的jar名称
jar_name=supergo-eureka-1.0-SNAPSHOT.jar

#获取运行编译好的进程ID,便于我们在重新部署项目的时候先杀掉以前的进程
pid=$(cat /var/codespace/test/test-web.pid)

#进入指定的编译好的jar的位置
cd  ${jar_path}

#将编译好的jar复制到最后指定的位置
cp  ${jar_path}/${jar_name} ${www_path}

#进入最后指定存放jar的位置
cd  ${www_path}

#杀掉以前可能启动的项目进程
kill -9 ${pid}

#启动jar,指定SpringBoot的profiles为test,后台启动
java -jar -Dspring.profiles.active=test ${jar_name} &

#将进程ID存入到shaw-web.pid文件中
echo $! > /var/codespace/test/test-web.pid

以上脚本执行完毕,就会自动启动相应的项目。配置位置如下:
在这里插入图片描述

注意:必须加上 #!/bin/bash,否则不能启动起来

在这里插入图片描述

2. 执行完毕

在这里插入图片描述

执行完毕后,我们发现项目可以访问了

三、Jenkins&Docker

利用jenkins将项目打包成镜像上传到docker私有仓库。这里Docker仓库用的Registry,也可以用Harbor。 上传到私有仓库后,可以直接通过docker命令或者利用K8S,运行镜像。

1. 搭建docker私有仓库

(1) 拉取私有仓库镜像

docker pull registry

(2) 启动私有仓库容器

docker run ‐di ‐‐name=registry ‐p 5000:5000 registry

(3) 打开浏览器

  • 输入地址:http://192.168.66.66:5000/v2/_catalog
  • 看到 {“repositories”:[]} 表示私有仓库搭建成功并且内容为空

(4) 修改宿主机的docker配置,让其可以远程访问,并信任私有仓库地址

vi /lib/systemd/system/docker.service

其中ExecStart=后添加配置 :

/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375 --insecure-registry 192.168.66.66:5000

修改后如下:

#修改daemon.json
#vi /etc/docker/daemon.json
#注意此种方式:也可以,但是某些版本无法识别,具体看情况,如果无法识别,使用第2种
{
    
    "insecure‐registries":["192.168.66.66:5000"]}


#较高版本的docker容器配置如下所示:
#命令: vi /lib/systemd/system/docker.service
#配置方式,此配置相当关键,配置完毕后可上传镜像了。
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375 --insecure-registry 192.168.66.66:5000

此步用于让 docker信任私有仓库地址。配置完毕结果如下所示:

在这里插入图片描述

(5) 重启docker 服务

#刷新docker.service配置
systemctl daemon-reload
#重新启动
systemctl restart docker

2. 测试上传镜像到私有仓库

1)标记此镜像为私有仓库的镜像

docker tag jdk1.8 192.168.66.66:5000/jdk1.8

2)上传标记的镜像

docker push 192.168.66.66:5000/jdk1.8

3)删除镜像

  • 简单的删除方法:

    #删除registry中镜像,可以发现删除成功
    docker exec registry rm -rf /var/lib/registry/docker/registry/v2/repositories/supergo-eureka
    #清除blob文件
    docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml
    
  • 复杂的删除方法(不一定删除成功)【只作为参考】
    查询Degist:

    #通过 /v2/<镜像名称>/manifests/<tag>的方式获取镜像的digest
    curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET  http://192.168.66.66:5000/v2/supergo-eureka/manifests/1.0-SNAPSHOT 2>&1 | grep Docker-Content-Digest | awk '{print ($3)}'
    

    执行以上命令输出SHA256加密的Digest:
    在这里插入图片描述

    删除镜像:

    #根据sha256结果删除镜像
    curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X DELETE http://192.168.66.66:5000/v2/supergo-eureka/manifests/sha256:549f7fc9167fc42ebbbd0aefbb674656c929e079b8c63b4546af4da80f02ef26
    

    删除镜像方法说明:

    • 1) 通过 /v2/<镜像名称>/manifests/的方式获取镜像的digest
      注意获取的请求头中需要加Accept: application/vnd.docker.distribution.manifest.v2+json
      否则获取不到正确的digest(虽然也能够获取到一个digest,但是之后的删除操作会失败)
      没加那个header值导致失败的返回值是:
      404{“errors”:[{“code”:“MANIFEST_UNKNOWN”,“message”:“manifest unknown”}
    • 2) 删除镜像
      DELETE /v2//manifests/
  • 删除错误说明:
    在这里插入图片描述

    这种情况是私有仓库不支持删除操作,需要在配置文件config.yml中增加delete:enabled:true字段

    #登录容器
    docker exec -it registry sh
    #配置文件
    vi /etc/docker/registry/config.yml
    

    配置结果如下所示:
    在这里插入图片描述

3. 自动部署

3.1 部署方法

微服务部署有两种方法:

  • 手动部署:首先基于源码打包生成jar包(或war包),将jar包(或war包)上传至虚拟机并拷贝至JDK容器。
  • 自动部署
    • DockerFile + shell脚本的方式
    • Docker Maven插件 + maven命令(本质就是Dockerfile,更方便)

对于数量众多的微服务,手动部署无疑是非常麻烦的做法,并且容易出错。
所以我们这里学习如何自动部署,这也是企业实际开发中经常使用的方法。

3.2 docker部署

Maven插件自动部署步骤:

  • (1) 工程pom.xml 增加配置

        <!-- 注意编码问题 -->
        <build>
            <finalName>eureka</finalName>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <version>0.4.13</version>
                    <configuration>
                        <imageName>192.168.66.66:5000/${project.artifactId}:${project.version}</imageName><!-- 生成的镜像名称 -->
                        <baseImage>java</baseImage><!-- 基础镜像,相当于Dockerfile里的FROM -->
                        <entryPoint>["java", "‐jar","/${project.build.finalName}.jar"]</entryPoint><!-- 入口点 -->
                        <resources>
                            <resource>                                                        
                                <targetPath>/</targetPath>
                                <directory>${project.build.directory}</directory><!-- 指定容器工作目录 -->
                                <include>${project.build.finalName}.jar</include><!-- 指定哪些文件上传到容器里 -->
                            </resource>
                        </resources>
                        <dockerHost>http://192.168.66.66:2375</dockerHost><!-- docker私服地址 -->
                    </configuration>
                </plugin>
            </plugins>
        </build>
    

    整个docker-maven-plugin配置相当于代替了dockerfile文件

  • (3) 在windows的命令提示符下,进入工程所在的目录,输入以下命令,进行打包和上传镜像

    mvn clean package docker:build  ‐DpushImage #此命令放入jenkins中,将会自动打包进入容器
    

    使用Jenkins上传镜像需要做如下配置:

    在这里插入图片描述

    执行后,会有如下输出,代码正在上传

    在这里插入图片描述

    浏览器访问 http://192.168.184.135:5000/v2/_catalog ,输出

    {
          
          "repositories":["项目名"]}
    
  • (4) 进入宿主机 , 查看镜像

    docker images
    
  • (5) 通过docker命令或者k8s运行镜像

也可以直接编写Dockerfile文件,在Jenkins里通过shell脚本构建镜像并上传到私服,启动

  • (1) 在工程的src/main目录下创建docker目录,目录下创建

    Dockerfile文件,内容如下:

    FROM jdk1.8
    VOLUME /tmp
    ADD app.jar app.jar
    ENTRYPOINT ["java","‐jar","/app.jar"]
    

    解释下这个配置文件:

    • VOLUME 指定了临时文件目录为 /tmp 。其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的 /tmp 。此步骤是可选的,如果涉及到文件系统的应用就很有必要了。 /tmp 目录用来持久化到 Docker 数据文件夹,因为 SpringBoot 使用的内嵌 Tomcat 容器默认使用 /tmp 作为工作目录

    • 项目的 jar 文件作为 “app.jar” 添加到容器的

    • ENTRYPOINT 执行项目 app.jar。

  • (2) 后面过程就略了…

猜你喜欢

转载自blog.csdn.net/weixin_41947378/article/details/111560612