什么是CI
- CI 的意思是 持续构建 。
- 负责拉取代码库中的代码后,执行用户预置定义好的操作脚本,通过一系列编译操作构建出一个 制品 ,并将制品推送至到制品库里面。
- 常用工具有 Gitlab CI,Github CI,Jenkins 等。
- 这个环节不参与部署,只负责构建代码,然后保存构建物。构建物被称为 制品,保存制品的地方被称为
制品库
什么是CD
- CD 则有2层含
- 持续部署(Continuous Deployment)
- 持续交付(Continuous Delivery) 。
- 持续交付 的概念是:将制品库的制品拿出后,部署在测试环境 / 交付给客户提前测试。 持续部署 则是将制品部署在生产环境。
硬件要求
配置 | 技术栈 | 类型 | 标签 |
---|---|---|---|
2核4G | Jenkins + Nexus + Docker | Cloud | 构建机 |
2核4G | Docker + Kubernetes | Cloud | kubernetes Master |
1核1G | Docker + Kubernetes | Cloud | kubernetes Node |
搭建构建机
- 硬件要求:2核4G
- Jenkins + Nexus + Docker
- 阿里云->ECS服务器->按量付费->就近服务->共享型->2核4G
- centOS->7.9
- 创建完成之后,复制公网IP,用你喜欢的工具链接连接到服务器即可
- 我用xshell
- 到了这一步,服务器创建,登录成功
- 登录进去第一件事更新一下系统(非硬性要求)
yum update
搭建CI
- 详细工作流
安装docker
-
安装工具包
yum install -y yum-utils device-mapper-persistent-data lvm2
-
指定安装源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
安装CE版本docker
yum install docker-ce -y
-
安装完成后启动docker
systemctl start docker
-
为了方便使用可以设置为开机启动docker
`systemctl enable docker -
如果速度太慢那么建议你可以配置安装源
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://fwvjnv59.mirror.aliyuncs.com"]
}
EOF
# 重载所有修改过的配置文件
sudo systemctl daemon-reload
sudo systemctl restart docker
安装git
yum install git -y
集成GIT仓库
- 简介:此处建立与代码仓库的信任在做代码推送时,只要带有私钥的就可以通过密钥校验,而不需再通过密码
- 生成公钥/私钥
ssh-keygen -t rsa -C "你的邮箱地址"
- 代码仓库配置公钥
- 拿到生成的公钥
cat ~/.ssh/id_rsa.pub
- 去代码仓库添加公钥
设置=>安全设置 => SSH公钥
- 至此CI服务器跟代码仓库建立免密访问的关系,那么从CI服务器发出对该代码仓库的命令也就可以顺利执行
- ?那我再这个服务器创建jenkins并且把服务器私钥给jenkins带上,那是不是jenkinsi就可以操作代码仓库了…
安装Jenkins
- 简介Jenkins
- Jenkins 是一个基于 Java 语言开发的持续构建工具平台,主要用于持续、自动的构建/测试你的软件和项目。它可以执行你预先设定好的设置和构建脚本,也可以和 Git 代码库做集成,实现自动触发和定时触发构建
- 安装java
yum install -y java
- 安装jenkins
docker pull jenkins/jenkins
- 采用cdn方式安装
sudo wget -O /etc/yum.repos.d/jenkins.repo 你的cdn镜像地址/jenkins.repo
sudo rpm --import 你的cdn镜像地址/jenkins.io.key
yum install jenkins -y
- 比如:
sudo wget -O /etc/yum.repos.d/jenkins.repo https://img.zhufengpeixun.com/jenkins.repo
sudo rpm --import https://img.zhufengpeixun.com/jenkins.io.key
- 启动 Jenkins
systemctl start jenkins.service
- 开放端口-8080
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --zone=public --add-port=50000/tcp --permanent
systemctl reload firewalld
- 访问jenkins
你的公网ip:8080
- 仔细阅读信息,人家告诉你我的密码放在服务器那个位置了,复制那个红色的地址去服务器cat一下,复制到输入框回车就可以了
- 查看密码 #
cat /var/lib/jenkins/secrets/initialAdminPassword
- 下面我们去安装我们必须的插件,但是很慢,为什么?因为地址都在国外,所以我们要改下jenkins的安装源
- 修改插件镜像(不改超慢,无敌慢…)
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' /var/lib/jenkins/updates/default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' /var/lib/jenkins/updates/default.json
- 修改插件镜像(不改超慢,无敌慢…)
- 设置第一个账号密码或用admin登录吧
- 构建第一个任务
- 新建item
- 选择freestyle project->确定
- 项目->配置->构建->执行shell
docker -v
docker pull node:latest
- 立即构建
- 报错哟~
解决jenkins没权限访问docker(常见问题)
- 将jenkins添加到docker组里面
groupadd docker
# 创建一个docker组
sudo gpasswd -a jenkins docker
#将当前用户添加至docker用户组
newgrp docker
#更新docker用户组 - 尝试执行构建,如果还有问题,查看docker状态
systemctl start docker.service
- 还有问题?看看docker状态
docker image ls
- 如果还有问题? 重启一下jenkins
systemctl restart jenkins.service
- 至此一般就可以了
安装Node
- 对于前端的工具流肯定要依赖node工作,所以我们需要在jenkins中安装node执行node命令
系统管理 -> 插件管理 -> 可选插件 -> 安装NodeJS插件->安装完重启
全局工具配置 -> NodeJS -> 新增NodeJS
- 新增别名
- 新增安装方式
- 保存->应用
- 设置任务的构建环境
- 任务->配置->构建环境->
Provide Node & npm bin/ folder to PATH
- 重新在执行构建
- 任务->配置->构建环境->
在jenkin配置私钥
-
前面环境搞定了,下面我们给jenkins带上服务器私钥,去操作我们仓库里面的代码
-
在 Jenkins 中,私钥/密码等认证信息都是以凭证的方式管理的
一定要确保先安装git yum install git -y -
项目->配置 => 源码管理 =>
把你的代码仓库ssh地址粘贴过来
-
Credentials => 添加 => SSH Username with private key
-
-
Username
你的邮箱
-
获取私钥
cat ~/.ssh/id_rsa
-
可能不会马上生效,静待几分钟
-
选择
-
可能会有问题,多尝试几次看看??
安装失败想卸载jenkins?
rpm -e jenkins #rpm卸载
rpm -ql jenkins #检查是否卸载成功
find / -iname jenkins | xargs -n 1000 rm -rf 彻底删除残留文件
插件安装总是失败?
在 jenkins 工作目录下找到文件 .jenkins/hudson.model.UpdateCenter.xml;打开文件内容如下
<sites>
<site>
<id>default</id>
<url>https://updates.jenkins.io/update-center.json</url>
</site>
</sites>
将url修改为https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json</url>
</site>
</sites>
构建镜像
- 项目根目录
- 新建Dockerfile
FROM nginx:1.15
COPY dist /etc/nginx/html
COPY conf /etc/nginx
WORKDIR /etc/nginx/html
- 项目根目录
- 新建conf/site
server {
listen 80;
server_name _;
root /etc/nginx/html;
}
- jenkins 执行脚本
- 构建-> 执行脚本
#!/bin/sh
npm install --registry=https://registry.npm.taobao.org
npm run build
docker build -t [构建名称] .
请注意nodejs版本问题
- 注意:在编译构建的过程中会出现依赖问题,很可能是node版本问题
- 怎么解决?
-系统配置->全局工具配置->安装node->选择合适版本
- 怎么解决?
查看构建结果
docker image ls
- 先把我们产出的镜像跑起来
docker run -d okrt-web
#okrt-web 你可以换成你的镜像名
- 进入我们的镜像中
docker exec -it 72f450c27c1ff71a68355f1695c6e863b2a57cf4beae6e40e0229db3e8a88963 bash
- 对应Dockerfile 查看目录下的问题件
FROM nginx:1.15
COPY dist /etc/nginx/html
COPY conf /etc/nginx
-
查看打包的内容
cd /etc/nginx/html
-
查看镜像配置
cd /etc/nginx