一、持续构建
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/
- 1) 通过 /v2/<镜像名称>/manifests/的方式获取镜像的digest
-
删除错误说明:
这种情况是私有仓库不支持删除操作,需要在配置文件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) 后面过程就略了…