devops学习笔记-jenkins实现基础CI/CD操作

时间:2022-09-30 11:14:55

在之前的devops工具链中完成了jenkins以及gitlab配置之后,可以实现基础的CI/CD操作。

操作流程

整体的操作的流程如下所示:

devops学习笔记-jenkins实现基础CI/CD操作

在开发环境配置好代码之后,将代码上传到gitlab,jenkins拉取gitlab的代码,由maven插件build,打包好后,构建 docker镜像,上传到目标服务器中运行,可以通过tag选择版本代码。

本地编写代码

使用idea编写一个基础的springboot web项目,代码如下所示:

devops学习笔记-jenkins实现基础CI/CD操作

/*
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";

}
}

运行,确定在本地运行没有问题。

devops学习笔记-jenkins实现基础CI/CD操作

devops学习笔记-jenkins实现基础CI/CD操作


编写docker文件

在本地开发环境,在项目目录下新增docker目录,编写docerfile生成镜像,配置docker-compose文件,编排运行镜像。

devops学习笔记-jenkins实现基础CI/CD操作

dockerfile如下编写。

devops学习笔记-jenkins实现基础CI/CD操作

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的文件如下:

devops学习笔记-jenkins实现基础CI/CD操作


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 #查看运行的容器

devops学习笔记-jenkins实现基础CI/CD操作

devops学习笔记-jenkins实现基础CI/CD操作

devops学习笔记-jenkins实现基础CI/CD操作

此时代表本地运行容器没有问题,可以上传到jenkins了

加速镜像下载

在目标服务器上,可以配置国内代理的docker仓库地址,加快镜像的下载。

#vim /etc/docker/daemon.json  按照如下添加,国内仓库地址可以随便找
"registry-mirrors":["http://hub-mirror.c.163.com"]
systemctl restart docker # 重启docker
docker info # 确认配置是否生效

devops学习笔记-jenkins实现基础CI/CD操作

devops学习笔记-jenkins实现基础CI/CD操作


上传代码到gitlab

在gitlab中,新建一个项目。

devops学习笔记-jenkins实现基础CI/CD操作

devops学习笔记-jenkins实现基础CI/CD操作

devops学习笔记-jenkins实现基础CI/CD操作

项目名称为mytest,project url为root,visblity level 为public公共,任何人都能拉取。

devops学习笔记-jenkins实现基础CI/CD操作

在gitlab 中,确认仓库地址url

devops学习笔记-jenkins实现基础CI/CD操作

本次为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 "admin@example.com"

配置完成后,由 idea 的vcs工具上传代码到gitlab,在完成commit操作之后,会要求输入gitlab仓库的地址和用户名密码。

devops学习笔记-jenkins实现基础CI/CD操作


在上传之前,在target目录中的pom.xml,在<build>标签下增加<finalName>mytest</finalName>,意思是说通过 maven打包的jar包的名称为mytest,如下所示:

devops学习笔记-jenkins实现基础CI/CD操作

完成后,就能通过idea push代码到gitlab。gitlab上能够确认到上传的代码。

devops学习笔记-jenkins实现基础CI/CD操作


配置 jenkins的ITEM

本地测试完成后的代码上传到gitlab之后,需要配置 jenkins能够从gitlab拉取代码,同时构建打包,并使用docker的方式发送到目标服务器执行。

配置目标服务

在安装了publisher over ssh 插件后,jenkins就能连接到目标服务器并上传文件。

devops学习笔记-jenkins实现基础CI/CD操作

找到SSH server,按照如下填写

devops学习笔记-jenkins实现基础CI/CD操作

注意,远程路径必须先在目标服务器上建好,不然会推送失败。

配置port端口,一般是22,完成后点击Test进行连接测试,success就测试通过。完成后应用保存。

devops学习笔记-jenkins实现基础CI/CD操作

jenkins新建任务

点击新建ITEM,新建任务

devops学习笔记-jenkins实现基础CI/CD操作

使用freestyle project新建一个基础任务

devops学习笔记-jenkins实现基础CI/CD操作

 

源码管理

点击git,配置源码管理,仓库地址http://192.168.85.6/root/mytest.git。

devops学习笔记-jenkins实现基础CI/CD操作

由于本次仓库为公有仓库,所以任何人都能拉取,所以无需填写。如果上传的仓库为私有仓库的话,则需要填写相关信息。通过这个方式,就能让jenkins从gitlab拉取到代码。

配置maven

在jenkins上,能够对拉取到的代码执行打包,生成jar包。在build Steps中,选择maven,增加新增步骤为"Invke top-level Maven targets",目标中按照如下填写:

clean package -DskipTest     #mvn命令,maven在构建的时候清理原来的包并
#跳过测试,这样能加快构建速度。

devops学习笔记-jenkins实现基础CI/CD操作



配置上传打包文件到目标服务器

需要在jenkins添加构建后操作,将生成的jar包上传到目标服务。一般默认的jenkins上,会将由maven生成的target文件保存到jenkins指定目录,为/root/.jenkins/workspace/下,其中的mytest就是本次构建的项目名称

devops学习笔记-jenkins实现基础CI/CD操作

此时,我们需要在jenkins上使用publish over ssh 插件,将这些文件上传到目标服务器。选择“ send build artifacts over ssh"

devops学习笔记-jenkins实现基础CI/CD操作

在SSH Server中,选择之前配置好的服务器”localhost"。Transfer Set中,填写要从jenkins上传的文件。

target/* jar docker /* #将jenkins的target目录生成的jar包和docker目录下文件传送给到目标服务器。

devops学习笔记-jenkins实现基础CI/CD操作

添加构建后执行命令。在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 #清理目标服务器上没有使用的镜像。

devops学习笔记-jenkins实现基础CI/CD操作

配置tag标签

在安装了git Parameter插件后,此时就能通过tag标签发布不同版本。

devops学习笔记-jenkins实现基础CI/CD操作

名称填写tag,参数类型为"标签“,默认值为”origin/master",应用保存。

gitlab为代码添加tag标签

在gitlab上为项目增加标签,注意选择master分支。


devops学习笔记-jenkins实现基础CI/CD操作

按照如下填写标签内容,保存应用。

devops学习笔记-jenkins实现基础CI/CD操作

jenkins添加构建后标签操作

为了让jenkins能够选择不同的tag标签构建镜像,需要增加git checkout 操作。在build steps中增加构建后操作,类型为"Excute shell"


devops学习笔记-jenkins实现基础CI/CD操作

按照如下填写

git checkout $tag   # 此处的tag变量代表之前的构建后添加tag的动作的值

devops学习笔记-jenkins实现基础CI/CD操作


注意,一定要将该动作通过鼠标拖拽的方式,移到最前面。

devops学习笔记-jenkins实现基础CI/CD操作


至此,完成了jenkins的ITEM的配置,点击应用保存。

jenkins构建操作

完成了ITEM的配置,接下来就是可以进行构建任务。在jenkins上完成了git parameters插件配置后,也在gitlab上增加的tag标签后,那么在jenkins上构建的时候就能选择不同的 tag首先发布不同的版本。


devops学习笔记-jenkins实现基础CI/CD操作


devops学习笔记-jenkins实现基础CI/CD操作

选择v1.0.0开始构建,在构建的时候,选择控制台输出,就能看到构建时的日志信息。

devops学习笔记-jenkins实现基础CI/CD操作


devops学习笔记-jenkins实现基础CI/CD操作

日志显示success代表构建成功,如果不是,则构建失败,需要排查问题。

devops学习笔记-jenkins实现基础CI/CD操作

在目标服务器上查看镜像版本和登录应用。

devops学习笔记-jenkins实现基础CI/CD操作

devops学习笔记-jenkins实现基础CI/CD操作

此时可以看到目标服务器能够运行应用,而且容器正常启动。

构建其他版本

在构建的时候,选择"v2.0.0",进行发布构建。此时按照我们的步骤,jenkins会重新拿取v2.0.0版本的代码生成jar包,在目标服务上生成v2.0.0版本的镜像并运行。

devops学习笔记-jenkins实现基础CI/CD操作

开始构建

devops学习笔记-jenkins实现基础CI/CD操作


devops学习笔记-jenkins实现基础CI/CD操作

结果表明切换版本成功。通过jenkins与docker,我们就能在几秒内完成一个应用的集成发布。

总结

整套jenkins CI/CD流程下来,体验如下:

  1. jenkins必须依靠不同的插件来实现不同功能
  2. jenkins擅长CI持续集成,CD持续交付方面,要对接k8s
  3. 整个CI/CD流程,使用jenkins方式,较为复杂。