相信很多开发这对 CI/CD
都很熟悉,CI/CD
即:持续集成/持续部署,我们将本地写好的代码推送到远程仓库,然后使用编写好的脚本进行自动化部署,省去了每次手动部署的麻烦。下面讲述一下在 Linux
系统中如何使用 Docker
搭建 Jenkins CI/CD
环境。
在开始之前,我们先来了解一下 Jenkins
进行持续集成和部署的原理,如下图所示:
大概讲述一下流程:在安装完Jenkins
后,我们会在Jenkins
当中创建一些任务:即要自动化部署哪些项目的任务,并进行配置,以及写好一些相对应的脚本,一般情况下包括下面这些配置:
Jenkins
就知道从哪里去拉取代码。Jenkins
就会去执行这些脚本,帮我们自动对项目进行编译、打包和构建。SshPublish
模块,将构建好的包发送到指定的服务器的某个目录底下,然后执行事先配置好的部署脚本。总结一下,其实 Jenkins
就帮我做了以下几件事情:自动从代码仓库拉取代码、自动使用脚本对拉取到的代码进行编译构建、编译构建后,使用脚本上传到指定的服务器当中,执行部署脚本,进行部署。
如何安装 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
以及前端项目自动化部署的讲解,所以,讲述一下安装 JDK
和 Maven
环境、以及 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
安装
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.."
安装
Portainer
,Docker
可视化管理和操作界面
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
安装一些常用的插件:包括: Publish Over SSH 、 Docker Plugin 、 NodeJS Plugin 、Maven Integration plugin 、 Blue Ocean 等。
密钥管理配置,包括
Git
、SVN
、Linux 服务器
登录凭证配置,Jenkin
会使用这些凭证从代码仓库拉取代码,或者在某台服务器执行上传文件、执行脚本等操作。
配置环境变量和远程服务器信息
Java
后端微服务自动化部署配置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}
}
}
有其他问题欢迎向我留言一起探讨解决。