gitllab+jenkins+docker--idea push后自动部署

原创 gitlab集成jira-相关配置

原创 jenkins集成gitlab-push后自动build

已前两节为基础,没看的可以返回查看

本文基于spring boot项目

一、安装docker插件

1、首先在操作系统内安装docker,可参考第一篇文章

2、在jenkins安装docker-build-step插件

3、Jenkins配置Docker:Manager Jenkins-->Global Tool Configuration-->Docker

gitllab+jenkins+docker--idea push后自动部署_第1张图片

二、Jenkins项目配置

点击要配置的项目-->配置-->构建-->添加构建步骤-->执行shell

gitllab+jenkins+docker--idea push后自动部署_第2张图片

填入一下命令

#操作/项目路径(Dockerfile存放的路劲)
BASE_PATH=/work/project
# 源项目工作空间  
SOURCE_PATH=/root/.jenkins/workspace  
#docker 镜像/容器/项目名字或者jar名字数组 这里都使用项目名命名
PROJECT_NAMES=("jenkins-demo-1")
#项目版本号/docker 容器tag,使用项目版本号来做tag,版本号要与项目数组PROJECT_NAMES一一对应
PROJECT_VERSIONS=("0.0.1-SNAPSHOT")
#docker容器暴露的端口,端口号要与项目数组PROJECT_NAMES一一对应,这里为了简化,docker容器端口与宿主机端口配置成一样的。
EXPOSE_PORTS=("8084")

##############以下内容不用修改

DATE=`date +%Y%m%d%H%M`

#创建项目环境目录
function projectDir(){
	for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ ))
	do
	  if [ ! -e $BASE_PATH/${PROJECT_NAMES[$i]} ] && [ ! -d $BASE_PATH/${PROJECT_NAMES[$i]} ]; 
		then
		    mkdir -p $BASE_PATH/${PROJECT_NAMES[$i]}
		    echo "Create Dir: $BASE_PATH/${PROJECT_NAMES[$i]}"
		fi
	done

}

# 备份
function bakup(){
		for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ ))
		do
			if [ -f "$BASE_PATH/${PROJECT_NAMES[$i]}-${PROJECT_VERSIONS[$i]}.jar" ]; then
    		echo "${PROJECT_NAMES[$i]}-${PROJECT_VERSIONS[$i]}.jar 备份..."
        cp $BASE_PATH/${PROJECT_NAMES[$i]}/${PROJECT_NAMES[$i]}-${PROJECT_VERSIONS[$i]}.jar $BASE_PATH/${PROJECT_NAMES[$i]}/backup/${PROJECT_NAMES[$i]}-${PROJECT_VERSIONS[$i]}-$DATE.jar
        cp $BASE_PATH/${PROJECT_NAMES[$i]}/Dockerfile $BASE_PATH/${PROJECT_NAMES[$i]}/backup/Dockerfile-$DATE.jar
        echo "备份 ${PROJECT_NAMES[$i]}-${PROJECT_VERSIONS[$i]}.jar 完成"
	    else
	    	echo "$BASE_PATH/${PROJECT_NAMES[$i]}-${PROJECT_VERSIONS[$i]}.jar不存在,跳过备份"
    	fi
		
		done
	
}
 
# 最新构建代码 移动到项目环境
function transfer(){
	
		for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ ))
		do
			echo "最新构建代码 $SOURCE_PATH/${PROJECT_NAMES[$i]}/target/${PROJECT_NAMES[$i]}-${PROJECT_VERSIONS[$i]}.jar 迁移至 $BASE_PATH ...."
      cp $SOURCE_PATH/${PROJECT_NAMES[$i]}/target/${PROJECT_NAMES[$i]}-${PROJECT_VERSIONS[$i]}.jar $BASE_PATH/${PROJECT_NAMES[$i]}
      cp $SOURCE_PATH/${PROJECT_NAMES[$i]}/Dockerfile $BASE_PATH/${PROJECT_NAMES[$i]}
    	echo "迁移完成"
		done
}
 
# 构建docker镜像
function build(){
	
	for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ ))
	do
		#镜像id
		IID=$(docker images | grep "${PROJECT_NAMES[$i]}" | awk '{print $3}')
		if [ -n "$IID" ]; then
			echo "存在${PROJECT_NAMES[$i]}镜像,IID=$IID"
			#容器id
			CID=$(docker ps -a | grep "${PROJECT_NAMES[$i]}" | awk '{print $1}')
			if [ -n "$CID" ]; then
				echo "存在${PROJECT_NAMES[$i]}容器,CID=$CID,删除docker容器 ..."
                docker stop $CID
				docker rm $CID
				echo "${PROJECT_NAMES[$i]}容器删除完成$CID"
			fi
			docker rmi $IID
			echo "${PROJECT_NAMES[$i]}镜像删除完成$IID"
		fi
        echo "不存在${PROJECT_NAMES[$i]}镜像,开始构建镜像"
		cd $BASE_PATH/${PROJECT_NAMES[$i]}
		docker build -t ${PROJECT_NAMES[$i]} .
	done
	
	
}

function runContainer(){
	
	for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ ))
	do
		#容器id
		CID=$(docker ps -a | grep "${PROJECT_NAMES[$i]}" | awk '{print $1}')
		if [ -n "$CID" ]; then
			echo "存在${PROJECT_NAMES[$i]}容器,CID=$CID,重启docker容器 ..."
			#docker restart ${PROJECT_NAMES[$i]}
			#echo "${PROJECT_NAMES[$i]}容器重启完成"
			docker rm $CID
			echo "${PROJECT_NAMES[$i]}容器删除完成$CID"
		fi
		echo "不存在${PROJECT_NAMES[$i]}容器,docker run创建容器..."
		docker run --name ${PROJECT_NAMES[$i]} -v $BASE_PATH/${PROJECT_NAMES[$i]}:$BASE_PATH/${PROJECT_NAMES[$i]} -d -p ${EXPOSE_PORTS[$i]}:${EXPOSE_PORTS[$i]} ${PROJECT_NAMES[$i]}
		echo "${PROJECT_NAMES[$i]}容器创建完成"
		
	done
	
}
 
# 运行docker容器
function run(){
	projectDir
	bakup
	transfer
	build
	
	runContainer
	#启动容器,我们采用docker compose来编排docker容器,解决docker容器之间网络访问的问题
	#先编写docker-compose.yml文件后,放入项目路径下
	#cd  $BASE_PATH
	#docker-compose up -d
	
}
 
#入口
run 

稍微了解一下docker命令的一看就懂

着重看一下bakup函数里有个Dockerfile的拷贝,注意要将自己的Dokerfile放入源项目工作空对应的项目下

本文对应目录:/root/.jenkins/workspace/jenkins-demo-1

三、编写Dockerfile

#基于java:8
FROM java:8
VOLUME /tmp
ADD jenkins-demo-1-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8084
CMD java -jar app.jar

四、测试

  1. 在idea修改代码,push到gitlab
  2. gitlab触发Webhooks,触发配置的jenkins
  3. jenkins项目触发构建
  4. 生成镜像-->生成容器-->启动项目
  5. 完成

公众号主要记录各种源码、面试题、微服务技术栈,帮忙关注一波,非常感谢

你可能感兴趣的:(持续交付流水线)