在之前的devops工具链中完成了jenkins以及gitlab配置之后,可以实现基础的CI/CD操作。
操作流程
整体的操作的流程如下所示:
在开发环境配置好代码之后,将代码上传到gitlab,jenkins拉取gitlab的代码,由maven插件build,打包好后,构建 docker镜像,上传到目标服务器中运行,可以通过tag选择版本代码。
本地编写代码
使用idea编写一个基础的springboot web项目,代码如下所示:
/*
spring boot web
TestController.java
*/
package yangchao.demo1.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/*
*测试
*/
@RestController
public class TestController {
@GetMapping("/test")
public String test(){
// return "Hello Jenkins ---v2.0.0";
return "Hello Jenkins --v1.0.0";
}
}
运行,确定在本地运行没有问题。
编写docker文件
在本地开发环境,在项目目录下新增docker目录,编写docerfile生成镜像,配置docker-compose文件,编排运行镜像。
dockerfile如下编写。
FROM openjdk:11
COPY mytest.jar /usr/local/
WORKDIR /usr/local
CMD java -jar mytest.jar
说明:
- FROM: 基础镜像,本次使用openjdk:11,为jdk11版本,切记,docker中基础镜像的java版本最好与本地开发环境版本一致,不然maven构建后的jar包在docker环境中不能运行
- COPY :将生成的mytest.jar文件复制到容器的/usr/lcoal/目录下
- WORKDIR:指定工作目录为/usr/local
- CMD:容器运行的指令,java -jar mytest.jar
docker-compose的文件如下:
version: '3.1' #版本,可以随意指定
services:
mytest: #名称,可以随意指定
build:
context: ./ #上下文,即dockerfile所在的目录,为当前目录
dockerfile: Dockerfile # dockerfile的名称
image: mytest:v2.0.0 # doceker镜像版本,随意指定
container_name: mytest # 容器名称
ports: #暴露端口
- 8082:8080 #8082是宿主机端口,8080是容器运行的端口
#注意,不要与宿主机现在使用的端口冲突
本地运行镜像
为了保证生成的镜像能够正确的通过jenkins上传到目标服务器运行,首先在本地运行docker-compose,确保本地能够运行
#进入docker目录
docker-compose up -d # 运行docker-compose
docker image ls # 查看生成镜像
docker ps -a #查看运行的容器
此时代表本地运行容器没有问题,可以上传到jenkins了
加速镜像下载
在目标服务器上,可以配置国内代理的docker仓库地址,加快镜像的下载。
#vim /etc/docker/daemon.json 按照如下添加,国内仓库地址可以随便找
"registry-mirrors":["http://hub-mirror.c.163.com"]
systemctl restart docker # 重启docker
docker info # 确认配置是否生效
上传代码到gitlab
在gitlab中,新建一个项目。
项目名称为mytest,project url为root,visblity level 为public公共,任何人都能拉取。
在gitlab 中,确认仓库地址url
本次为http://192.168.85.6/root/mytest.git
在本机(开发环境),配置git全局信息,能够由开发环境push代码到gitlab
#进入本地代码项目目录
cd ${demo}
git init
git config --global user.name "Administrator"
git config --global user.email "[email protected]"
配置完成后,由 idea 的vcs工具上传代码到gitlab,在完成commit操作之后,会要求输入gitlab仓库的地址和用户名密码。
在上传之前,在target目录中的pom.xml,在<build>标签下增加<finalName>mytest</finalName>,意思是说通过 maven打包的jar包的名称为mytest,如下所示:
完成后,就能通过idea push代码到gitlab。gitlab上能够确认到上传的代码。
配置 jenkins的ITEM
本地测试完成后的代码上传到gitlab之后,需要配置 jenkins能够从gitlab拉取代码,同时构建打包,并使用docker的方式发送到目标服务器执行。
配置目标服务
在安装了publisher over ssh 插件后,jenkins就能连接到目标服务器并上传文件。
找到SSH server,按照如下填写
注意,远程路径必须先在目标服务器上建好,不然会推送失败。
配置port端口,一般是22,完成后点击Test进行连接测试,success就测试通过。完成后应用保存。
jenkins新建任务
点击新建ITEM,新建任务
使用freestyle project新建一个基础任务
源码管理
点击git,配置源码管理,仓库地址http://192.168.85.6/root/mytest.git。
由于本次仓库为公有仓库,所以任何人都能拉取,所以无需填写。如果上传的仓库为私有仓库的话,则需要填写相关信息。通过这个方式,就能让jenkins从gitlab拉取到代码。
配置maven
在jenkins上,能够对拉取到的代码执行打包,生成jar包。在build Steps中,选择maven,增加新增步骤为"Invke top-level Maven targets",目标中按照如下填写:
clean package -DskipTest #mvn命令,maven在构建的时候清理原来的包并
#跳过测试,这样能加快构建速度。
配置上传打包文件到目标服务器
需要在jenkins添加构建后操作,将生成的jar包上传到目标服务。一般默认的jenkins上,会将由maven生成的target文件保存到jenkins指定目录,为/root/.jenkins/workspace/下,其中的mytest就是本次构建的项目名称
此时,我们需要在jenkins上使用publish over ssh 插件,将这些文件上传到目标服务器。选择“ send build artifacts over ssh"
在SSH Server中,选择之前配置好的服务器”localhost"。Transfer Set中,填写要从jenkins上传的文件。
target/* jar docker /* #将jenkins的target目录生成的jar包和docker目录下文件传送给到目标服务器。
添加构建后执行命令。在jenkins构建后并传输文件后,执行docker命令,这样就能自动在目标服务器上运行容器。
cd /root/jenkins_test/docker #切换到目标服务器远程路径,在docker目录下,切记要使用绝对路径
mv ../target/*.jar ./ #将上层targer目录下的jar包移动到当前路径
docker-compose down #运行docker-compose之前先关闭之前的
docker-compose up -d --build # 运行
docker image prune -f #清理目标服务器上没有使用的镜像。
配置tag标签
在安装了git Parameter插件后,此时就能通过tag标签发布不同版本。
名称填写tag,参数类型为"标签“,默认值为”origin/master",应用保存。
gitlab为代码添加tag标签
在gitlab上为项目增加标签,注意选择master分支。
按照如下填写标签内容,保存应用。
jenkins添加构建后标签操作
为了让jenkins能够选择不同的tag标签构建镜像,需要增加git checkout 操作。在build steps中增加构建后操作,类型为"Excute shell"
按照如下填写
git checkout $tag # 此处的tag变量代表之前的构建后添加tag的动作的值
注意,一定要将该动作通过鼠标拖拽的方式,移到最前面。
至此,完成了jenkins的ITEM的配置,点击应用保存。
jenkins构建操作
完成了ITEM的配置,接下来就是可以进行构建任务。在jenkins上完成了git parameters插件配置后,也在gitlab上增加的tag标签后,那么在jenkins上构建的时候就能选择不同的 tag首先发布不同的版本。
选择v1.0.0开始构建,在构建的时候,选择控制台输出,就能看到构建时的日志信息。
日志显示success代表构建成功,如果不是,则构建失败,需要排查问题。
在目标服务器上查看镜像版本和登录应用。
此时可以看到目标服务器能够运行应用,而且容器正常启动。
构建其他版本
在构建的时候,选择"v2.0.0",进行发布构建。此时按照我们的步骤,jenkins会重新拿取v2.0.0版本的代码生成jar包,在目标服务上生成v2.0.0版本的镜像并运行。
开始构建
结果表明切换版本成功。通过jenkins与docker,我们就能在几秒内完成一个应用的集成发布。
总结
整套jenkins CI/CD流程下来,体验如下:
- jenkins必须依靠不同的插件来实现不同功能
- jenkins擅长CI持续集成,CD持续交付方面,要对接k8s
- 整个CI/CD流程,使用jenkins方式,较为复杂。