DevOps(二)初识 Jenkins

一、什么是 CI / CD

互联网软件的开发和发布,已经形成了一套标准流程,假如把开发工作流程分为以下几个阶段:

编码构建集成测试交付部署

img

如上图所示, 敏捷开发(Agile Development)持续集成(Continuous Integration)持续交付(Continuous Delivery)持续部署(Continuous Deployment)有着不同的软件自动化交付周期。

持续集成 CI

持续集成 指的是,频繁地(一天多次)将代码集成到主干。将软件个人研发的部分向软件整体部分交付,频繁进行集成以便更快地发现其中的错误。

它的好处主要有:

  • 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易 ;
  • 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。

持续集成并不能消除Bug,而是让它们非常容易发现和改正。持续集成的目表是快速确保开发人员新提交的变更是好的,并且适合在代码库中进一步使用。它的核心措施是,代码集成到主干之前,必须通过编译和自动化测试流的验证

持续交付 CD

持续交付(CD)实际上是 CI 的扩展,其中软件交付流程进一步自动化,以便随时轻松地部署到生成环境中。 成熟的持续交付方案也展示了一个始终可部署的代码库。使用 CD 后,软件发布将成为一个没有任何紧张感的例行事件。 开发团队可以在日常开发的任何时间进行产品级的发布,而不需要详细的发布方案或者特殊的后期测试。

持续部署 CD

持续部署 扩展了持续交付,以便软件构建在通过所有测试时自动部署。在这样的流程中, 不需要人为决定何时及如何投入生产环境。CI/CD 系统的最后一步将构建后的制品包通过流水线自动部署。 此类自动部署可以配置为快速向客户分发组件、功能模块或修复补丁,并准确说明当前提供的内容。采用持续部署的组织可以将新功能快速传递给用户,得到用户对于新版本的快速反馈,并且可以迅速处理任何明显的缺陷。 用户对无用或者误解需求的功能的快速反馈有助于团队规划投入,避免将精力集中于不容易产生回报的地方。

CI/CD 扩展: 什么是 DevOps

二、Jenkins

1. Jenkins 概述

官方文档: https://jenkins.io/doc/

Jenkins是一个开源的、可扩展的持续集成、交付、部署(软件/代码的编译、打包、部署)的基于web界面的平台。允许持续集成持续交付项目,无论用的是什么平台,可以处理任何类型的构建或持续集成。

Jenkins 特性:

  • 开源的java 语言开发持续集成工具,支持CICD

  • 易于安装部署配置:可通过yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理;

  • 消息通知及测试报告:集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知,生成JUnit/TestNG测试报告;

  • 分布式构建:支持Jenkins能够让多台计算机一起构建/测试;

  • 文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等;

  • 丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如gitsvnmavendocker 等。

2. Jenkins 安装

参考 Jenkins安装配置

3. 构建部署 Maven 项目

主要分为准备构建部署两个部分。

3.1 配置准备

  • 为了实现maven项目的构建需要先配置gitlabjdkmaven,具体步骤如下:
  1. 系统管理 — 全局工具配置,进入配置页面 ;
  2. 配置jdk,输入jenkins 所在机器的 jdk 的位置,即JAVA_HOME
    在这里插入图片描述
  3. 配置maven,自动安装一个maven;
    在这里插入图片描述
  4. 配置gitlab,参考 [Jenkins配置Gitlab]( Jenkins中使用GitLab的配置 - 星瑞 - 博客园 (cnblogs.com) ) 。
  • 为了部署,需要配置远程的server:
  1. 首先,安装一个插件:Publish over SSH,系统管理 — 插件管理 — 可选插件,搜索安装即可;

  2. 然后,配置一个远程server,系统管理 — 系统设置 - Publish over SSH

    • 首先使用以下命令生成一对公私钥(Jenkins不支持openssh高版本秘钥);
    1
    ssh-keygen -m PEM -t rsa -b 4096
    • 将公钥id_rsa.pub 的值拷贝到需要链接的目标server目录文件下:
      1
      vim ~/.ssh/authorized_keys
  3. 可以将私钥id_rsa的路径填在Path to key里面,也可以把私钥文件里面的内容拷贝到Key里面;

  4. 最后,配置远程server,注意这里的username 需要为拷贝公钥时登录服务器的用户,点击Test Configuration ,左下角出现 success 字样(如下图),表示配置成功。

1659427393101

3.2 创建 Job 进行构建部署

  1. 新建任务-构建一个自由风格的软件项目, 配置旧的构建的删除策略;

在这里插入图片描述

  1. 配置代码源,这里使用 Git 管理(若为 gitlab 项目,配置gitlab,参考 [Jenkins配置Gitlab]( Jenkins中使用GitLab的配置 - 星瑞 - 博客园 (cnblogs.com) ) );

在这里插入图片描述

  1. Maven 打包;

在这里插入图片描述

  1. 在server对应目录编写启动脚本start.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

export JAVA_HOME=/usr/local/java
export PATH=$PATH:/usr/local/java/bin

echo $JAVA_HOME

#先将已经运行的本项目进程结束,避免重复运行造成端口冲突
pid=`ps -aux|grep SpringbootDemo-0.0.1-SNAPSHOT.jar | awk '{print $2}'`
if [ -n "$pid" ]
then
kill -9 $pid
fi

cd /opt/jar
#运行启动本项目,BUILD_ID=dontKillMe命令避免后台运行jar包不生效
BUILD_ID=dontKillMe nohup java -jar SpringbootDemo-0.0.1-SNAPSHOT.jar >> systemOut.log 2>&1 &
  1. 将打好的jar包推到之前配置的server上面,配置如下:

1659531972471

  • Source files :以工作空间为根目录,填写工作空间中targetjar 包的位置

1659532090821

  • Remote directory :指定jar 上传的server目录
  • Exec command :构建后的需要执行的操作,这里需要启动jar包
  1. 回到任务面板,点击 立即构建 后,查看控制台输出:

1659532320698

  1. 控制台输出显示成功后,登录server查看jar包启动成功:

1659532518067

至此,服务器部署完成!

3.3 批量删除Jenkins历史构建记录

系统管理 — 脚本命令行,输入以下命令:

1
2
3
4
5
6
7
8
def jobName = "一个 Maven 项目的构建部署"   //删除的项目名称
def maxNumber = 32 // 保留的最小编号,意味着小于该编号的构建都将被删除

Jenkins.instance.getItemByFullName(jobName).builds.findAll {
it.number <= maxNumber
}.each {
it.delete()
}

点击运行,即可看到被删除的构建记录:

1659533030820

4. 构建部署 docker 镜像

创建项目,配置gitmaven 同前一节,区别在于任务配置中的构建后操作:

4.1 编写并上传 Dockerfile

构建镜像需要配置Dockerfile ,因此我们在项目根目录创建 Dockerfile

1659617197413

Dockerfile 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# centos7 + jdk1.8 的基础镜像(java版本和项目用的保持一致即可)
FROM xxlaila/centos7.6-jdk1.8:latest
MAINTAINER dunkingcurry

RUN mkdir -p "/opt/docker/app"

ADD SpringbootDemo-0.0.1-SNAPSHOT.jar /opt/docker/app/SpringbootDemo-0.0.1-SNAPSHOT.jar

WORKDIR /opt/docker/app/appconfig

#对外暴露端口
EXPOSE 8089

#启动jar包
CMD java -jar /opt/docker/app/SpringbootDemo-0.0.1-SNAPSHOT.jar

将代码提交后,jenkins 任务执行后的工作空间根目录就会有我们编写 Dockerfile

1659617468659

接下来通过构建后操作首先将它上传到服务器的指定目录;

1659617542463

4.2 上传 jar 包

然后上传 jar包至部署服务器的指定目录:

1659618011817

4.3 构建镜像并启动容器

参考 4.2 图中 Exec command 配置:

1
2
3
4
5
6
7
8
9
10
# 停止正在运行的 springboot 容器
docker stop springboot
# 删除 springboot 容器
docker rm springboot
# 删除 springboot 镜像
docker rmi springboot:v1
# 构建新的镜像
docker build -t springboot:v1 .
# 启动容器,这里使用了centos镜像,需要加 -it 保持容器不退出
docker run -d -it -p 8089:8089 --name springboot springboot:v1

保存配置后,回到任务面板,点击 立即构建 后,查看控制台输出成功后,查看容器状态,访问测试接口如下:

1659618377754

至此,收工!


DevOps(二)初识 Jenkins
http://dunkingcurry30.github.io/2022/08/01/Jenkins基础知识/
作者
Dunking Curry
发布于
2022年8月1日
许可协议