集成和部署(CICD)
我们需要做持续集成持续部署的工作首先我们需要了解他给我们带来什么 接下来我将使用Jenkins来做CICD的演示 下面先描述并列举一下持续集成持续部署的一些优点概念
优点
-
卓越的代码质量
-
减少变更和审核时间.
-
加速发布周期
-
故障检测和隔离
-
增强测试可靠性
-
减少任务堆积
-
改善平均解决时间
-
降低成本
-
增强透明度和责任制
-
简化沟通
-
频繁的更新和维护
-
提升客户满意度
-
增强的性能指标*
现在你已经了解实施CI/CD流水线的好处,我觉得是时候做出转变了。
只需记住几件事,你的CI/CD管道步骤越多,你将能获得越多的好处。它将自动提高你的发布速度和质量。请记住,这些好处并不局限于业务,还会影响项目方和最终用户,因为它们能降低成本和更好的投资回报率。
环境准备
系统:Centos7 64位 内核版本:5.0以上 内存大小:8G以上
初始化
这里我们需要执行一些初始化系统的指令
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
# 永久关闭selinux(重启后生效)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 临时关闭selinux(不需要重启,立即生效)
setenforce 0
# 关闭swap
# 永久关闭swap(重启后生效)
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 临时关闭swap(不需要重启,立即生效)
swapoff -a
# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 立即生效
sysctl --system
# 时间同步
yum install ntpdate -y
ntpdate -u pool.ntp.org
# 添加定时
crontab -l
*/20 * * * * /sbin/ntpdate -u pool.ntp.org > /dev/null 2>&1
升级系统内核
首先我们查看系统内核版本
输入下面指令会出现如下列表
0 : CentOS Linux (3.10.0-1160.53.1.el7.x86_64) 7 (Core) 1 : CentOS Linux (3.10.0-1160.11.1.el7.x86_64) 7 (Core) 2 : CentOS Linux (3.10.0-1062.el7.x86_64) 7 (Core) 3 : CentOS Linux (0-rescue-ccae925869aa43f9b2868f73a0a778e7) 7 (Core)
会看到系统内核版本才3.10
所以这时候我们需要升级内核
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
或者
rpm -qa kernel
接下来我们先导入内核源
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # 导入elrepo的签名
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-5.el7.elrepo.noarch.rpm # 升级elrepo源
导入软件yum源
这里使用的阿里巴巴的软件源
你也可以使用其他比如清华,163等等
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo --no-check-certificate
yum makecache
查看系统可用版本,我们看可以看到两个大版本
kernel-lt 基于长期支持分支
kernel-ml 基于主线稳定分支
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
这里我们使用ml主线稳定分支版本即可
执行安装指令
yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel -y
安装内核会等个几分钟
这里需要耐心等待
安装完成后
再次查看内核
我们看到5.19内核已经安装成功了
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
设置最新内核为第一启动项
grub2-set-default 0
接着重启即可
查看内核是否升级成功
uname -a
安装Docker
执行下面命令安装docker
#安装wget
yum install wget -y
#下载docker-ce源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
#查看可以安装的docker版本
yum list docker-ce --showduplicates | sort -r
#安装docker
yum install -y docker-ce-20.10.10 docker-ce-cli-20.10.10 containerd.io-1.4.12
#查看docker版本
docker -v
#创建docker配置目录
mkdir /etc/docker
#配置docker源
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
#重载
systemctl daemon-reload
#设置开机启动
systemctl enable docker
#启动docker服务
systemctl start docker
#旧版docker迁移
grep -rl 'docker-runc' /var/lib/docker/containers/ | xargs sed -i 's/docker-runc/runc/g'
systemctl stop docker
systemctl start docker
#查看docker
docker -v
查看docker
出现版本号说明安装成功
docker -v
自此系统环境准备完成
安装软件-Jenkins
gitlab
github
这里我们用到Jenkins作为集成部署工具
文档:https://hub.docker.com/_/jenkins
编写Dockerfile
首先我们来编写一个Jenkins的Dockerfile文件
cat > Dockerfile << EOF
FROM jenkins/jenkins:lts
USER root
#指定容器的源
RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN sed -i s@/security.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN apt clean
#安装集成部署需要用到软件
RUN apt-get update
RUN apt-get install -y wget
RUN apt-get install -y iputils-ping
#RUN apt-get install -y libltdl7
RUN apt-get install -y apt-transport-https
#RUN apt-get install -y npm
ENTRYPOINT ["/sbin/tini","--","/usr/local/bin/jenkins.sh"]
EOF
执行完成后在当前目录下可以看到一个Dockerfile文件
此文件类似于一个安装清单
编写执行脚本
接下来就是编写Jenkins的安装脚本并启动在Docker中
接下来就是创建一个执行脚本文件Jenkins.sh 来创建Jenkins软件
cat > Jenkins.sh << EOF
echo 创建Jenkins数据目录
mkdir jenkins_home
echo 停止容器中...
docker stop jenkinsserver
echo 删除容器中...
docker rm jenkinsserver
echo 删除镜像中...
docker rmi myjenkins
echo 构建镜像中...
docker build -t myjenkins .
echo 创建容器中...
docker run --restart=always --name jenkinsserver \
--env JAVA_OPTS="-server -Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m" \
-e TZ=Asia/Shanghai \
-p 8888:8080 -p 50000:50000 \
-u 0 \
-v /var/ans/jenkins/home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-d myjenkins
EOF
可以看到我们安装脚本创建成功了
执行安装
bash Jenkins.sh
当执行后等待几分钟
当看到一串字母就说明成功了
我们也可以执行Docker指令查看Jenkins运行状态
docker ps
访问Jenkins服务
这时候可以通过web服务访问Jenkins
这儿等待Jenkins初始化完成我们就可以进行登录
获取初始密码
初始化完成会出现获取初始化密码的界面
docker exec -u 0 jenkinsserver /bin/sh -c "cat /var/jenkins_home/secrets/initialAdminPassword"
等待初始化
接着让你选择默认设置还是自定义设置
这里就选择默认设置即可
接着就会出现安装界面
等待安装完成即可
登录系统
接着设置账号密码
配置访问的url
如果在外网访问就需要
这里默认即可
登录成功
安装svn组件
这里我们在Jenkins中安装svn代码获取组件
以便于我们在后面创建项目时可以选择svn仓库中的代码进行集成部署
安装svn组件成功后重启Jenkins服务
重启Jenkins服务后我们就开始创建Jenkins的CICD任务
集成部署任务
环境和软件都搭建好了
接下来创建一个集成部署任务测试一下
创建任务
点击创建任务
输入一个任务名称
然后选择构建一个自由风格的软件项目
填写代码仓库地址
填写仓库地址
这里先用我自己gitlab做演示吧
当然你也可以用svn的地址或者github地址都是可以的
编写构建部署脚本
编写构建脚本
echo 构建app中...
docker build -t myapp .
echo 创建容器中...
docker run --restart=always --name myapp \
-e TZ=Asia/Shanghai \
-p 8080:80 \
-d myapp
echo 构建并部署完成
查看日志
保存任务后我们手动执行CI/CD任务
此时我们打开任务控制台查看日志
可以看到任务是先拉取仓库代码
然后执行Docker构建任务
构建部署结果
可以看到Success的标志
说明构建部署任务已经完成
访问部署服务
此时我们尝试访问构建成功的一个web服务
上面用到的端口是 8080端口
可以看到我们访问web服务的一个接口成功返回了数据
至此我们的CI/CD基础搞清楚了
最后
前面的构建部署在所有CI/CD项目中基本上都是大同小异
这里这里只是演示了主动构建部署演示
后续操作
开发人员提交代码,系统触发CI/CD任务
构建失败,给与响应,如果钉钉,微信公众号提醒
部署失败,同上
远程部署
流水线工作部署构建测试等等