• 使用 Docker 搭建 Jenkins CI/CD 环境


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

    前言

    在开始之前,我们先来了解一下 Jenkins 进行持续集成和部署的原理,如下图所示:
    在这里插入图片描述
    大概讲述一下流程:在安装完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
    
    • 1
    • 2

    安装 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    项目构建环境的安装

    因为本文是对 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    安装 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    安装 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    用 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    安装 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 # 日志挂载
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    安装 Redis

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

    安装 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
    
    • 1
    • 2
    • 3
    • 4

    Jenkins 相关配置

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

    在这里插入图片描述

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

    在这里插入图片描述

    在这里插入图片描述

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

    在这里插入图片描述

    • 配置 JDKMavenNodeJS 等环境变量
      在这里插入图片描述
    • 服务器连接信息配置
      在这里插入图片描述

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

    • 新建流水线项目
      在这里插入图片描述
    • 选择参数化构建,因为多个服务的构建流程基本上都是一致的,所以选择参数化构建。
      在这里插入图片描述
    • 配置代码仓库:SVN 或者 Git 代码仓库地址
      在这里插入图片描述
    • 在项目中创建流水线执行脚本:JenkinsFile

    在这里插入图片描述

    • 示例脚本如下:
    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}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    最后

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

    个人博客:https://www.kangpeiqin.cn/#/index
    欢迎与我交流,关注公众号(sunny的技术小屋),获取更多技术相关知识

  • 相关阅读:
    基于路网层次收缩的快速分布式地图匹配算法
    图片编辑器tui-image-editor
    C++初阶 List的介绍和使用
    QA新人入职任务
    Python 程序员过中秋Python+pygame 制作拼图小游戏(附源码:5源码)
    Android 格式化存储之Formatter
    基于微信小程序的医院门诊体检预约管理系统设计与实现(源码+lw+部署文档+讲解等)
    ssm+java+vue面向企事业单位的项目申报小程序#毕业设计
    微信小程序开发(四) - 页面配置 - json 文件
    【Rust日报】2022-07-23 ​用 Rust 编写的强类型 Elasticsearch DSL
  • 原文地址:https://blog.csdn.net/qq_38454776/article/details/126796582