1.什么是(CI/CD)
1.1持续集成
定义:频繁地(一天多次)将代码集成到主干。将软件个人研发的部分向软件整体部分 交付,频繁进行集成以便更快地发现其中的错误。
每完成一点更新,就集成到主干, 可以快速发现错误,定位错误也比较容易,防止分支大幅偏离主干。如果不是经常集成,主干又在不 断更新,会导致以后集成的难度变大,甚至难以集成。
**作用:**持续集成的目的,就是让产品可以快速迭代, 同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成
1.2 持续交付(Continuous delivery)
**定义:**频繁地将软件的新版本,交付给质量团队或者用户,以供 评审。如果评审通过,代码就进入生产阶段。
持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。持续交付优先于整个产品生命周期的软件部署,建立在高水平自动化持续集成之上。
1.3 持续部署(continuous deployment)
**定义:**是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。
持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。持续部署的前提是能自动化完成测试、构建、部署等步骤
2.Jenkins介绍及docker部署
2.1 Jenkins介绍:
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成
2.2 docker部署
Docker是一个开源的容器化平台,可帮助开发者轻松地创建、部署和运行应用程序。Docker使开发人员能够在一个独立的容器中打包应用程序及其依赖项,这样他们就可以轻松地将应用程序移植到任何其他环境中。
部署环境:centos7云服务器
2.2.1 卸载系统之前安装的 docker(防止版本不一致,发生冲突)
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
2.2.2 安装 Docker-CE 基本环境
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2.2.3 更新本地镜像源
# 设置docker镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
2.2.4 安装 docker,以及 docker-cli
sudo yum install docker-ce docker-ce-cli containerd.io
这样就安装好docker和基本环境了,接下来就可以启动docker了
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙,但是公司生产环境不能这样做哦!
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
2.3 启动docker
#启动docker
sudo systemctl start docker
#查看docker服务状态 running 就是启动成功
sudo systemctl status docker
2.4 设置 docker 开机自启
sudo systemctl enable docker
2.5配置镜像加速
参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://g4ar166x.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
目前国内镜像源都停止服务了,所以我用的是https://docker.m.daocloud.io
最后重启下docker
sudo systemctl daemon-reload
sudo systemctl restart docker
3.创建jenkins的网络
docker network create jenkins
docker network ls #查看网络
4.下载并运行镜像
由于DockerHUB上面有很多版本的镜像,需要根据镜像的更新时间选择合适的版本,避免下载版本太旧的镜像:hub.docker.com/
在根目录创建目录dockerxxxx,在dockerxxxx内创建Dockerfile文件,编辑内容
FROM jenkins/jenkins:2.461-jdk11
USER root
RUN apt-get update && apt-get install -y lsb-release
RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.asc] https://download.docker.com/linux/debian $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
再根据刚刚编辑的Dockerfile拉取并创建自己的镜像
docker build -t jenkins-master:latest .
启动自己的jenkins镜像
docker run --name jenkins-master --restart=on-failure --detach
--network jenkins --env DOCKER_HOST=tcp://docker:2376
--env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1
--volume jenkins-data:/var/jenkins_home
--volume jenkins-docker-certs:/certs/client:ro
--publish 8080:8080 --publish 50000:50000 jenkins-master:latest
–publish 8080:8080:
第一个 8080 是主机(宿主机)的端口号。
第二个 8080 是容器内的端口号。
此处作用是将容器内的8080端口映射到宿主机的8080端口。因此,当你在宿主机上访问8080端口时,实际上是访问了容器内的8080端口。这样,你可以通过宿主机的IP地址和8080端口来访问容器内运行的服务。由于我主机8080端口有别的服务,所以我将容器的8080端口映射到主机的9090端口,修改为如下:
docker run --name jenkins-master --restart=on-failure --detach --network jenkins --env DOCKER_HOST=tcp://docker:2376 --env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 --volume jenkins-data:/var/jenkins_home --volume jenkins-docker-certs:/certs/client:ro --publish 9090:8080 --publish 50000:50000 jenkins-master:latest
可以看到此时镜像已经起来了
查看 Jenkins 容器日志
docker logs -f jenkins-master
复制日志中的这一段,保存起来,这个是解锁jenkins的密码
配置镜像加速
修改宿主机 Jenkins 工作目录下的hudson.model.UpdateCenter.xml文件。
vi /var/jenkins_home/hudson.model.UpdateCenter.xml
原始内容:
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://updates.jenkins.io/update-center.json</url>
</site>
</sites>
URL修改为国内清华大学的官方镜像地址,内容如下:
<?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>
重启容器
docker restart jenkins-master
#或者停止原来容器再启动:
docker stop myjenkins
docker run -d -u root -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime --restart=always --name myjenkins jenkins/jenkins:2.440.2-lts-jdk11
在浏览器访问http://ip:9090 ip要替换成你服务器的ip,需要等待大概10分钟的样子,才能进入到初始安装页面
点击保存并完成
5.安装需要的其他插件
点菜单系统管理–>插件管理,依次搜索下述插件并安装allure、Groovy、dingtalk
以allure为例
6.全局工具配置
配置git和allure
allure版本保持域本地使用的一致即可
在使用自动化时,我们都会在本地安装allure工具,安装pytest-allure包,这个其实就是和我们在本地安装的allure工具一样的
7.配置邮箱
以QQ邮箱为例,可以根据需要替换成自己公司的企业邮箱
-
先开启qq邮箱的smtp服务,打开 QQ 邮箱进入设置
-
开启 SMTP 服务
-
qq邮箱凭据配置
进入系统管理–>Manage Credentials
-
jenkins邮箱基础配置
如果是虚拟机的话,由于IP可能发生变化,所以上图中Jenkins URL也需要根据IP进行改动 -
测试邮件发送
测试成功后说明邮件发送正常 -
配置扩展邮箱
该配置将会作为我们jenkins任务执行完成后的邮件模板
找到系统配置-Extended E-mail Notification区域,做如下配置,注意点高级才能凭据选择
8. 配置GIT
进入系统管理–>Manage Credentials,注意这里是你在码云上的用户名和密码
9.钉钉通知基础配置
10.节点配置
如果所有任务都在myjenkins这个容器上面执行的话,压力会很大,所以采用jenkins分布式执行的策略,将不同的任务分配到不同的节点上去执行
上图中master指的是jenkins所在服务器,用来统筹管理各个任务及配置
slave指的是各个自动化任务执行的机器,也叫作节点
master通过管理节点,及任务中的节点配置将不同的任务分配到不同的设备上执行
我们希望在jenkins slave节点上执行,而不是在jenkins所在的master上执行,因此我们需要配置节点相关的内容
但是问题又来了。没有这么多的电脑咋办,我们的解决方法就是使用docker去部署节点环境,与jenkins主节点进行关联
- 打开jenkins的系统管理->全局安全配置页面,进行如下设置并保存
代理端口:默认就是指定端口50000
我们在前面起容器时映射端口50000就是为了这个
- 打开jenkins的系统管理->节点管理页面,点击左侧的新建节点
11.docker部署slave节点及连接
在根目录下创建目录docker_auto_interface1,在docker_auto_interface1目录下创建Dockerfile,写入
FROM jenkins/inbound-agent
USER root
WORKDIR /home/jenkins
Run sed -i 's/deb.debian.org/mirrors.tencent.com/' /etc/apt/sources.list
RUN apt-get update && apt-get install -y python3 && apt-get install -y python3-pip
然后在docker_slave1目录下执行下述命令,来创建镜像
docker build -t auto_interface1:latest .
如果执行报错,删掉Run sed -i ‘s/deb.debian.org/mirrors.tencent.com/’ /etc/apt/sources.list就好
镜像创建成功后,使用下述命令启动节点
docker run -itd --network jenkins --name slave1 auto_interface1 -url http://116.205.183.16:9090 f0d3245b7d9a0fc4a67892b3a8ce319e350489ba2acc949f77cc88b29c9bafea slave1
命令中–name slave1 auto_interface1,slave1是jenkins上节点名 ,auto_interface1是指我使用的镜像名
http://116.205.183.16:9090 指的是jenkins master的连接地址
f0d3245b7d9a0fc4a67892b3a8ce319e350489ba2acc949f77cc88b29c9bafea这是在节点管理中点击未连接的节点,可以看到这一串,复制过来,后面跟节点名
启动后查看日志,日志出现Connected,说明连接成功
docker logs -f slave1
查看jenkins上节点状态,正常,连接成功
12. pipeline流水线任务
12.1. 创建流水线任务
1.首页点击新建任务
2.输入任务名称,选择流水线,最后点确定
3.在这里填写流水线脚本,不会写可以参考流水线语法
以下给出一个流水线脚本示例,此脚本作用是从git上拉取代码到指定的节点
pipeline {
//指定执行节点
agent {
label 'auto-interface1'
}
//步骤
stages {
stage('拉取自动化代码') {
steps {
// One or more steps need to be included within the steps block.
git credentialsId: '116f4a45-564d-4f5c-832d-306edd4ec768', url: 'https://gitee.com/zly-zly00/auto_interface.git'
}
}
}
}
(1)首先指定执行节点,点击流水线语法
在片段生成器中未找到节点有关的信息,去Declarative Directive Generate找
点击agent:Agent,在Agent处选择根据标签选择节点(根据需要来即可)
填写节点标签,点击生成,就得到了pipeline的代码了,复制到流水线中即可
(2)配置操作步骤
Declarative Directive Generate中选择stages:Stages,步骤名根据需要填写,下一项选择steps,再点击生成代码,复制到流水线
(3)配置步骤中的具体操作
我们这里操作主要是拉取代码,片段生成器中找到GIT
填写仓库url,选择分支、凭据,点击生成流水线脚本,复制到流水线
点击保存
3.构建任务
点击立即构建
在构建历史这里会有任务,我们这里显示构建成功,点击"#1",可以进去详细情况
进入workspace
点击这个目录,就能看到拉取的代码文件了
我们也可以进去容器内部查看代码文件是否真的被拉下来了
docker exec -it auto-interface1 bash
- 钉钉通知配置
- 设置环境参数
- 构建触发器配置
- 流水线脚本生成