Docker集成Jenkins实现CICD
说一下使用Jenkins实现CICD主要来做什么的:
- 1.先本地代码push代码至git仓库
- 2.Jenkins自动拉取git仓库中的代码,打成war包后扔到测试服务器,自动创建docker容器并运行容器
- 3.可按git仓库标签快速构建自动部署
开始想着一台本地虚拟机和一台云服务器搭建Jenkins,进行CI部分的测试。弄了半天ping对方的地址ping不通,一通百度之后,有让设置的,有说不行的。云服务器无法ping通本地的问题_wyffeige的博客-CSDN博客。最后看了看服务器厂商有咩有白嫖的果然有,所以最后使用了一台阿里云和一台腾讯云的服务器搭建了Jenkins。当然两台本地虚拟机同样可以搭建。
首先两台云服务器都安装了宝塔面板,可有可无,主要是方便查看修改文件,本地虚拟机使用SmarTTY或者MobaXterm连接同样可以方便的查看修改文件等。下面我就一云服务器的内容为主,本地虚拟机安装的同学,要是某一步骤不明确可以本页面留言。
给这两台云服务器取个名:
- 阿里云的那一台主要作为测试服务器,接收git上面修改的代码。就叫A
- 腾讯云的那一台作为Jenkins搭建运行的服务器,负责调度git与发送测试服务器。就叫B
- 两个服务器都是CentOS7、后台管理面板都是宝塔。
如何购买服务器,修改服务器密码,安装宝塔,开放安全组等一些小步骤我暂时都掠过,被这些步骤卡住的可以留言。
第一次登录宝塔的时候,会让你登录账号,然后二选一一个服务器环境,直接叉掉就可以,占用内存太多。
宝塔安装docker
软件商店 - 搜索docker管理器
- 安装。
安装完成,服务器就有docker了。B上必须安装、A上不需要安装。
之后我们需要使用容器编排工具docker-compose,如何安装?只要将docker-compose文件上传至环境目录下就可以使用命令了。
文件扔到了百度网盘如下,自行下载,密码 6666
将docker-compose文件扔到服务器上的cd ~
所在目录下,管理员的话就是在根目录下的root文件夹。
默认docker-compose文件没有执行权限,需要修改文件权限。chmod 777 docker-compose
服务器远程连接,命令行下输入:echo $PATH
。
[wppay]
(宝塔终端输入,终端第一次连接要用服务器密码,服务器密码第一次使用要在服务器厂商管理端进行重置)
可以看到上面显示了很多路径地址,以冒号分隔。随便将docker-compose文件扔到任意一个里面就可以。
这里我扔到了/usr/loacl/bin文件夹里面。mv docker-compose /usr/local/bin
返回用户目录 cd ~
,输入命令 docker-compose 当有提示你命令选择的时候成功。
使用宝塔的终端拉取Jenkins,注意拉取得版本,我们要拉取这个东西。docker pull jenkins/jenkins
默认拉取最新版本就可以
在B上搭建Jenkins
首先为Jenkins挑选一个好地方建个文件夹,因为我们要使用数据卷的映射,将容器的内容映射到宿主机,是双向映射,一方改变另一方发生相同改变。地方任意,看你心情。在文件夹里面放上docker-compose.yml文件。
准备docker-compose.yml文件
version: "3.1"
services:
jenkins:
image: jenkins/jenkins:latest
container_name: jenkins
ports:
- 8080:8080
- 50000:50000
volumes:
- ./data/:/var/jenkins_home/
可以看到这里我们使用了8080和50000端口,记得在服务器安全组和宝塔安全里面进行放行。
50000这个端口最好不要改变,8080宿主机端口映射可以改变,如改成8083,则替换成 - 8083:8080
直接启动Jenkins容器 docker-compose up -d
第一次启动失败,查看日志:
可以看到是因为写入日志没有权限。
还记得我们上面让你任意创建得文件夹吗?就是那个文件夹得权限不足导致得错误。给那个文件夹设置权限,进入那个文件夹所在目录下 chmod -R 777 文件夹名称
重启Jenkins容器 docker restart jenkins
由于进入和Jenkins后需要下载插件,所以我们先修改下源。那个源在hudson.model.UpdateCenter.xml中进行设置。这个文件就在你创建的文件夹中。
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
</site>
</sites>
主要是改以下链接地址为https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
重启Jenkins容器 docker restart jenkins
欧德k,现在打开浏览器我们将要进入Jenkins了。网址的形式为:公网IP:8080。
初始化Jenkins
这里让输入密码,密码存在与Jenkins运行日志里面,我们回到命令行,进入到jenkins的docker-compose.yml所在目录,运行docker-compose up -d
,如下图获取密码。
接下来是安装插件,选择手动安装插件:
- publish over SSH:为了让Jenkins可以将打好包的内容发布到其他服务器。
- Git Parameter:为了实现CD,可以根据tag拉取Git仓库版本。
- Persistent Parameter:无法在当前页面选择,必须在进入到Jenkins的首页后才可以选择。
之后进入安装,安装可能失败,多次尝试或者选择继续进入内部也可安装软件,建议把失败的插件全部安装成功后再进行操作。
之后创建管理员用户:
进入到首页,插件失败的继续安装插件:系统管理 - 插件管理。还是英文的是汉化插件下载不完全。
新建任务
配置publish over SSH
为了保证Jenkins所在服务器可以将内容发布到测试/生产服务器上,需要设置publish over SSH
系统管理 ----- 系统配置 ----- 拉动滚动条到最下面 ----- Publish over SSH
配置Git的SSH无密码连接
为了保证Jenkins可以从Git服务中拉取下来私有仓库内容,要么输入用户名和密码,要么实现无密码的SSH链接。
需要在Gitee仓库中找到设置公钥的位置,在具体服务器生成公钥和私钥,并且将公钥复制到Gitee仓库。
进入docker的Jenkins容器中docker exec -it jenkins bash
,通过ssh-keygen -t rsa -C "xxxxx@xxxxx.com"
生成公钥和私钥到.ssh
隐藏目录中(cd ~
, ls -a
就可以看到.ssh目录了 ),需要复制id_rsa.pub
内容到Gitee的公钥中(可以直接查看cat id_rsa.pub
,然后复制)。
还是进入docker的Jenkins容器内部docker exec -it jenkins bash
,这次进入到用户目录 cd ~
,通过Git目录拉取一次远程仓库代码,因为第一次拉取会询问你是否确认,需要输入yes。之后再去拉去就不要点yes了。
配置Jenkins的JDK&Maven
因为Jenkins会从Git仓库中拉取到项目的源代码,部署需要的是war包,需要在Jenkins内部将源码进行打包,需要Maven的package命令。必须在Jenkins内部安装好JDK和Maven。
在宿主机的数据卷目录下(就是你挑选的映射目录),安装JDK和Maven,并且给Maven配置阿里云私服以及JDK1.8编译插件。
很简单,下载JDK1.8与maven的linux版本上传到数据卷,使用宝塔图形化界面就可以。默认是上传的压缩包解压出来,名字会很长改的短一些,如jdk、maven。安装包安排,密码 6666:
然后再配置下maven镜像源,给下载加个速,进入到maven/conf/settings.xml文件中,看父标签塞对应的内容:
<mirrors>
<mirror>
<id>huaweicloud</id>
<mirrorOf>*</mirrorOf>
<url>https://repo.huaweicloud.com/repository/maven/</url>
</mirror>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<profiles>
<profile>
<id>jdk</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
<tomcatPath></tomcatPath>
</properties>
</profile>
</profiles>
<settings>
<activeProfiles>
<activeProfile>jdk</activeProfile>
</activeProfiles>
</settings>
通过Jenkins的全局配置,配置JDK和Maven
系统管理 ---- 全局工具配置 ---- 配置JDK和Maven
Maven的配置在页面的最下面:
实现CI操作
测试代码:GP7_4_jenkins: jenkins实现CICD (gitee.com)
最终实现:实现Jenkins拉取Gitee上的代码到Jenkins本地,并且打包。且将war包发布到测试环境中并运行,希望测试环境可以采用docker的形式运行war包。
在项目中添加了Dockerfile
和docker-compose.yml
文件
Dockerfile:
FROM tomcat:latest
WORKDIR /usr/local/tomcat/webapps
RUN mkdir ROOT
COPY jenkins-1.0-SNAPSHOT.war /usr/local/tomcat/webapps/ROOT/air.war
WORKDIR /usr/local/tomcat/webapps/ROOT
RUN jar -xvf air.war
docker-compose.yml
version: '3.1'
services:
jenkins:
build:
context: ./
dockerfile: Dockerfile
image: air:v1.0
container_name: air
ports:
- 8083:8080
为了让Jenkins完成CI操作,需要配置两个内容
1.构建(将项目打包)
进入你创建的任务,配置,构建
2.构建后操作(发布内容到测试环境,并运行项目)
cd /usr/local/test/cicd/docker
mv ../target/cicd-1.0-SNAPSHOT.war ./
dc down
dc up -d --build
docker image prune -f
到这里你本地编写代码提交到Git,Jenkins就会实现CI操作了。
配置Git的参数
为了让当前Jenkins的任务可以根据仓库中的标签进行发布指定版本的代码
配置Git Parameter
接下来就可以构建了。
实现CD操作
完成第上步的操作后,可以在构建项目时,选择仓库中的指定标签进行发布。
因为Jenkins的任务在默认情况下,只会拉取Git中最新提交点的代码,如果需要根据标签进行发布,需要将之前采用Maven构建项目的方式,修改为手动Shell命令的形式
Jenkins通过标签拉取代码并打包
在构建项目时,选择指定标签构建,即可看到效果。
[/wppay]