在现在流行的docker环境下,我们应用到部署环境时间比较晚,还有很多优化的工作需要去做,在自己的服务器做了一个harbor仓库,方便推送和下载docker镜像
在做这个jobs之前需要安装docker和部署harbor服务器,在以上博文我有详细介绍,可以去参考
一、针对代码部分的修改
1、修改mvn的settings.xml文件,ID会被代码下的pom.xml调用
vim /usr/share/maven/conf/settings.xml
<server>
<id>docker-harbor</id>
<username>admin</username>
<password>Song2022</password>
</server>
2、pom.xml文件添加maven插件
vim pom.xml ####代码当前目录下pom
<build>
<finalName>envirment</finalName>
<!--设置打包名称用于便于部署-->
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>192.168.2.252/song/${artifactId}</imageName>
<!--这里是harbor仓库里的具体位置-->
<imageTags>
<tag>211111</tag> <!--指定镜像的版本,这个可以在这里手动编写,也可以在打包的时候指定,我选择在打包时指定git版本号。-->
</imageTags>
<baseImage>java</baseImage>
<entryPoint>["java","-jar","environmen-0.0.1-SNAPSHOT.jar"]</entryPoint> <!--这里指定jar运行的命令参数,也可以编写一个Dockerfile文件写明-->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>environmen-0.0.1-SNAPSHOT.jar</include>
</resource>
</resources>
<serverId>docker-harbor</serverId> <!--在上面setting.xml中设置的id-->
<forceTags>true</forceTags> <!--重复构建相同镜像则覆盖镜像-->
</configuration>
</plugin>
</plugins>
</build>
二、Jenkins配置信息
1、 buile界面,可以配置发布、回滚、重启,选择分支,
这里的回滚是git版本号,到harbor仓库自动拉取
2、配置参数化构建过程
3、代码库地址
4、环境变量配置,方便调用
IMAGE_NAME:song 平台项目分类 envirment以具体项目名区分(容器名)
5、shell构建
分为两部分:
第一部分:如果build为deploy发版则先判断git版本号是否变化,如没变化则没有发版必要,停止
第二部分:打包jar包推送到harbor
#操作校验
if [ ${deploy_env} = "deploy" ];then
echo -e "\033[34mstart ${deploy_env}\033[0m"
echo ${GIT_PREVIOUS_SUCCESSFUL_COMMIT}
echo ${GIT_COMMIT}
[ ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} != ${GIT_COMMIT} ] && echo -e "\033[34mstart maven package\033[0m" || {
#版本未更新,停止发版
echo -e "\033[31m代码没有更新,停止发版\033[0m"
exit 1
}
#######打包镜像并推送到本地仓库
mvn clean package docker:build -DdockerImageTags=${GIT_COMMIT} -DpushImageTag
[ $? -eq 0 ] && echo -e "\033[32mmaven打包成功033[0m" || {
echo -e "\033[31mmaven 打包失败\033[0m"
exit 1
}
fi
6、远程服务器进行docker部署
#!/bin/bash
CONTAINER_NAME=`echo ${IMAGE_NAME} | awk -F / '{print $2}'`
#启动容器
START() {
echo -e "\033[34mstart ${CONTAINER_NAME}\033[0m"
docker start ${CONTAINER_NAME}
[ $? -eq 0 ] && echo -e "\033[32m启动 ${CONTAINER_NAME} 成功 \033[0m" || {
echo -e "\033[31m启动 ${CONTAINER_NAME} 失败\033[0m"
exit 1
}
}
#停止容器
STOP() {
echo -e "\033[34m停止 ${CONTAINER_NAME}\033[0m"
docker stop ${CONTAINER_NAME}
[ $? -eq 0 ] && echo -e "\033[32m停止 ${CONTAINER_NAME} 成功 \033[0m" || {
echo -e "\033[31m停止 ${CONTAINER_NAME} 失败\033[0m"
exit 1
}
}
#删除容器
DEL_CONTAINER() {
echo -e "\033[34mrm container ${CONTAINER_NAME}\033[0m"
docker rm ${CONTAINER_NAME} -v
[ $? -eq 0 ] && echo -e "\033[32m删除 ${CONTAINER_NAME} 成功\033[0m" || {
echo -e "\033[31m删除 ${CONTAINER_NAME} 失败\033[0m"
exit 1
}
}
#删除镜像
DEL_IMAGE() {
echo -e "\033[34mrm image ${IMAGE_NAME}\033[0m"
docker image rm `docker image ls 192.168.2.252/${IMAGE_NAME} -q` --no-prune
[ $? -eq 0 ] && echo -e "\033[32m删除 ${IMAGE_NAME} 成功\033[0m" || {
echo -e "\033[31m删除 ${IMAGE_NAME} 失败\033[0m"
exit 1
}
}
#登录harbor
LOGIN_HARBOR() {
echo -e "\033[34m登录harbor\033[0m"
docker login 192.168.2.252
[ $? -eq 0 ] && echo -e "\033[32m登录harbor成功\033[0m" || {
echo -e "\033[31m登录harbor失败\033[0m"
exit 1
}
}
#拉取镜像
PULL() {
docker pull 192.168.2.252/${IMAGE_NAME}:$1
[ $? -eq 0 ] && echo -e "\033[32m拉取镜像成功\033[0m" || {
echo -e "\033[31m拉取镜像失败\033[0m"
exit 1
}
}
#运行容器
RUN() {
docker run -id -p 8098:8098 --name=${CONTAINER_NAME} 192.168.2.252/${IMAGE_NAME}:$1
[ $? -eq 0 ] && echo -e "\033[32m运行${CONTAINER_NAME} success\033[0m" || {
echo -e "\033[31m运行${CONTAINER_NAME} fail\033[0m"
exit 1
}
}
case ${deploy_env} in
deploy)
echo -e "\033[34mstart docker steps\033[0m"
LOGIN_HARBOR
STOP
DEL_CONTAINER
PULL ${GIT_COMMIT}
RUN ${GIT_COMMIT}
;;
rollback)
LOGIN_HARBOR
STOP
DEL_CONTAINER
DEL_IMAGE
PULL $version
RUN $version
;;
restart)
STOP
START
;;
*)
exit 1
;;
esac
发版步骤:
1、登录harbor仓库
2、停止容器(若是首次部署,需要注释掉)
3、删除容器(若是首次部署,需要注释掉)
4、下载项目镜像
5、运行容器
回滚步骤:
1、登录harbor仓库
2、停止容器
3、删除容器
4、删除镜像
5、下载项目镜像
6、运行容器
回滚步骤:
1、重启容器