使用 Docker 搭建 Jenkins CI/CD 环境

相信很多开发这对 CI/CD 都很熟悉,CI/CD 即:持续集成/持续部署,我们将本地写好的代码推送到远程仓库,然后使用编写好的脚本进行自动化部署,省去了每次手动部署的麻烦。下面讲述一下在 Linux 系统中如何使用 Docker 搭建 Jenkins CI/CD 环境。

前言

在开始之前,我们先来了解一下 Jenkins 进行持续集成和部署的原理,如下图所示:
使用 Docker 搭建 Jenkins CI/CD 环境_第1张图片
大概讲述一下流程:在安装完Jenkins后,我们会在Jenkins当中创建一些任务:即要自动化部署哪些项目的任务,并进行配置,以及写好一些相对应的脚本,一般情况下包括下面这些配置:

  • 配置代码仓库,这样配置以后,Jenkins 就知道从哪里去拉取代码。
  • 配置好项目编译构建、打包的脚本,这样拉取到代码之后,Jenkins 就会去执行这些脚本,帮我们自动对项目进行编译、打包和构建。
  • 最后,可以利用 SshPublish 模块,将构建好的包发送到指定的服务器的某个目录底下,然后执行事先配置好的部署脚本。

总结一下,其实 Jenkins 就帮我做了以下几件事情:自动从代码仓库拉取代码、自动使用脚本对拉取到的代码进行编译构建、编译构建后,使用脚本上传到指定的服务器当中,执行部署脚本,进行部署。

Docker 环境的安装

如何安装 Docker 环境,可以参考以下的文档:Docker 从入门到实践,已经写的很完善了。这里还是简单写一如何使用脚本自动安装 Docker

curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

安装 Docker Compose,实现对 Docker 容器集群的快速编排,方便对容器进行统一维护和管理

DOCKER_CONFIG=/usr/local/lib/docker/cli-plugins
sudo mkdir -p $DOCKER_CONFIG/cli-plugins
sudo curl -SL
https://download.fastgit.org/docker/compose/releases/download/v2.6.1/dockercompose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
sudo chmod +x $DOCKER_CONFIG/cli-plugins
docker compose versio

项目构建环境的安装

因为本文是对 JavaWeb 以及前端项目自动化部署的讲解,所以,讲述一下安装 JDKMaven 环境、以及 NodeJS

安装 JDK,并配置环境变量

cd /data/jdk
#上传 JDK 压缩包并解压到指定目录
#set java environment
JAVA_HOME=/data/jdk/jdk1.8.0_161
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH

安装 Maven

cd /data/maven
wget https://mirrors.aliyun.com/apache/maven/maven-3/3.6.3/binaries/apache-maven3.6.3-bin.tar.gz
# 解压缩
tar -xzvf apache-maven-3.6.3-bin.tar.gz
# 环境变量配置:添加环境变量
vim /etc/profile
export M2_HOME=/data/maven/apache-maven-3.6.3
export PATH=$PATH:${M2_HOME}/bin
# 刷新配置
source /etc/profile
# Settings.xml 文件配置修改
-- 本地仓库地址配置
<localRepository>/data/repo</localRepository>
-- 阿里云镜像仓库配置
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

安装 NodeJS,用于对前端工程的打包

cd /data/nodejs
wget https://npm.taobao.org/mirrors/node/v14.16.1/node-v14.16.1-linux-x64.tar.xz
xz -d node-v14.16.0-linux-x64.tar.xz
tar -xzvf node-v14.16.0-linux-x64.tar
# 配置环境变量
export NODE_HOME=/data/nodejs/node-v14.16.1-linux-x64
export PATH=$NODE_HOME/bin:$PATH
# 检测是否安装成功
node -v

用 Docker 安装常用软件

安装 Jenkins,并对指定的数据目录进行挂载,以防止重启后数据丢失。

docker run -d -p 8060:8080 -p 50000:50000 \
--user=root \
--name jenkins --privileged=true \
--restart=always \
-v /data/jenkins/jenkins_home:/var/jenkins_home \ #Jenkins 目录挂载
-v /data/maven/apache-maven-3.6.3:/usr/local/maven \
-v /data/jdk/jdk1.8.0_161:/usr/local/java \
-v /var/run/docker.sock:/var/run/docker.sock \ #Docker 相关目录挂载
-v /usr/bin/docker:/usr/bin/docker \
-v /data/node/node-v14.16.1-linux-x64:/usr/local/nodejs \ #NodeJS 目录挂载
jenkins/jenkins

安装 Nginx,静态资源服务器,用于托管前端静态资源。

# 从容器当中复制配置文件到指定目录
docker run -p 80:80 --name nginx
docker cp nginx:/etc/nginx/nginx.conf /data/nginx
docker cp nginx:/etc/nginx/conf.d/ /data/nginx
docker stop nginx
docker rm nginx
# 生成容器并挂载目录
docker run -p 80:80 --name nginx --restart always \
--net host \
-v /data/nginx/html:/usr/share/nginx/html \
-v /data/nginx/nginx.conf:/etc/nginx/nginx.conf \ # 主配置文件挂载
-v /data/nginx/conf.d:/etc/nginx/conf.d \
-v /data/nginx/logs:/var/log/nginx -d nginx # 日志挂载

安装 Redis

docker run -d --name redis --restart always -p 6379:6379 -v /data/redis:/data
redis --appendonly yes --requirepass "2022@abc123.."

安装 PortainerDocker 可视化管理和操作界面

docker run -d -p 9000:9000 \
--name=portainer --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/portainer:/data portainer/portainer

Jenkins 相关配置

安装一些常用的插件:包括: Publish Over SSH 、 Docker Plugin 、 NodeJS Plugin 、Maven Integration plugin 、 Blue Ocean 等。

使用 Docker 搭建 Jenkins CI/CD 环境_第2张图片

密钥管理配置,包括 GitSVNLinux 服务器 登录凭证配置, Jenkin 会使用这些凭证从代码仓库拉取代码,或者在某台服务器执行上传文件、执行脚本等操作。

使用 Docker 搭建 Jenkins CI/CD 环境_第3张图片

使用 Docker 搭建 Jenkins CI/CD 环境_第4张图片

配置环境变量和远程服务器信息

使用 Docker 搭建 Jenkins CI/CD 环境_第5张图片

  • 配置 JDKMavenNodeJS 等环境变量
    使用 Docker 搭建 Jenkins CI/CD 环境_第6张图片
  • 服务器连接信息配置
    使用 Docker 搭建 Jenkins CI/CD 环境_第7张图片

Java 后端微服务自动化部署配置

  • 新建流水线项目
    使用 Docker 搭建 Jenkins CI/CD 环境_第8张图片
  • 选择参数化构建,因为多个服务的构建流程基本上都是一致的,所以选择参数化构建。
    使用 Docker 搭建 Jenkins CI/CD 环境_第9张图片
  • 配置代码仓库:SVN 或者 Git 代码仓库地址
    使用 Docker 搭建 Jenkins CI/CD 环境_第10张图片
  • 在项目中创建流水线执行脚本:JenkinsFile

使用 Docker 搭建 Jenkins CI/CD 环境_第11张图片

  • 示例脚本如下:
node {
	//从 Git 拉取代码,具体可以使用流水线脚本生成器进行生成
	stage('checkout') {
	}
	//编译指定模块
	stage('build'){
		sh "mvn --projects ${project_name} --also-make clean install"
	}
	//使用 Dockerfile 构建镜像,并生成容器运行
	stage('run') {
		sh '''
		#查询容器是否存在,存在则删除
		containerId=`docker ps -a | grep -w ${project_name} | awk '{print $1}'`
		if [ "$containerId" != "" ] ; then
		#停掉容器
			docker stop $containerId
			#删除容器
			docker rm $containerId
			echo "成功删除容器"
		fi
		#查询镜像是否存在,存在则删除
		imageId=`docker images | grep -w $project_name | awk '{print $3}'`
		if [ "$imageId" != "" ] ; then
		#删除镜像
			docker rmi -f $imageId
			echo "成功删除镜像"
		fi
		创建 docker-compose.yml 文件
		mkdir ./document/jenkins/${project_name}
		cp ./${project_name}/target/${project_name}-1.0-SNAPSHOT.jar
		./document/jenkins/${project_name}
		cp ./document/jenkins/Dockerfile ./document/jenkins/${project_name}
		cd ./document/jenkins/${project_name}
		# 替换 Dokcerfile 文件内容
		sed -i "s/MODULE/${project_name}/g" Dockerfile
		# 使用 Dockerfile 构建镜像
		docker build -t ${project_name} --build-arg
		PROJECT_NAME=${project_name} .
		cd ..
		rm -rf ${project_name}
		# 使用 Docker compose 部署服务
		/usr/local/bin/docker-compose up -d ${project_name}
	}
}

最后

有其他问题欢迎向我留言一起探讨解决。

你可能感兴趣的:(jenkins,docker,ci)