传统的工作流
- 项目分模块开发,分配到开发人员
- 开发好一个模块就进行单元测试
- 等所有模块开发完成后,统一对所有代码进行集成
- 集成后部署到测试环境服务器上,交给测试人员进行集成测试
- 有Bug,就记录下,分配给相应的开发人员去修改
- 修改完成后,再次对项目进行集成,部署到测试服务器上
- 测试人员在集成测试中进行回归测试,通过则部署到生产环境中
- 不通过,就重复“分配Bug--》修改Bug---〉集成代码---》部署到测试服务器上---〉集成测试”
持续集成-- CI(Continuous Integration)
定义
在软件工程中,持续集成是指将所有开发者工作副本每天多次合并到主干的做法。
- 合并开发人员正在编写的所有代码
- 一天内进行多次合并和提交代码
- 从存储库或生产环境中进行构建和自动化测试,确保没有集成问题并及早发现任何问题
持续部署-- CD(Continuous Delivery)
定义
完成 CI 中构建及单元测试和集成测试的自动化流程后,持续交付可自动将已验证的代码发布到存储库。
- 可以通过将更改自动推送到发布系统来随时将软件发布到生产环境中
- 持续部署,并自动将更改推送到生产中
前言
实现效果:开发人员本地开发,Push提交代码到指定分支,自动触发Jenkins进行持续集成和自动化部署。部署完成后邮件通知,构建成功后将打包后的文件上传到服务器,通过nginx反向代理展现页面。构建失败,则打印出错误日志。
CI/CD的工作【Docker+Jenkins】
- 本地代码合并到dev分支,push推送到远程git仓库,触发任务自动build-->build成功后自动部署发布到dev开发环境
- 在gitee 申请feature分支,合并到release,成功后,触发任务自动build->build成功后自动部署发布到release测试环境
- 申请release分支或&hotfix分支合并到master,成功后,触发任务自动build->build成功后通过手动部署发布到正式生产环境(生产环境一般是需要多加一步手动发布,点击个按钮发布等操作)
Docker容器
Docker核心组成
- 镜像:文件系统,只读包,包含node、gitlab等
- 容器:镜像存储在容器中
- 仓库:远端中的镜像仓库,类似git仓库
Docker的运行过程
从远端仓库中拉取合适的镜像到本地---》通过镜像创建容器---》启动容器
搭建环境
1.安装Docker(Docker服务器8核32G)
终端工具
# From https://get.docker.com:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
docker -v // 检查是否安装成功
2.安装docker-compose
一个完整的应用程序,往往都不是一个容器组成的,而是通过容器组成一个容器群。一个容器群的搭建需要执行太多命令,更重要的是需要考虑太多应用和容器间的依赖关系处理。docker-compose正是解决多个容器之间管理的问题。
# 安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 提升权限
sudo chmod +x /usr/local/bin/docker-compose
docker-compose -v // 检查是否安装成功
配置Docker镜像加速,推荐使用阿里云容器加速服务
3.安装Nginx和Jenkins环境
docker pull jenkins/jenkins:lts
docker pull nginx
4.查看已下载的镜像
docker images
5.新建目录及文件
在docker下将Nginx和Jenkins聚集到一个文件目录之中
+ compose
- docker-compose.yml // docker-compose执行文件
+ nginx
+ conf.d
- nginx.conf // nginx配置
+ jenkins
- jenkins_home // jenkins挂载卷
+ webserver
-static //存放前端打包后的dist文件
6.编写docker-compose.yml文件,存放在一个目录中
version: '3'
services: # 集合
docker_jenkins:
user: root # 为了避免一些权限问题 在这我使用了root
restart: always # 重启方式
image: jenkins/jenkins:lts # 指定服务所使用的镜像 在这里我选择了 LTS (长期支持)
container_name: jenkins # 容器名称
ports: # 对外暴露的端口定义
- 8080:8080
- 50000:50000
volumes: # 卷挂载路径
- /home/jenkins/jenkins_home/:/var/jenkins_home # 这是我们一开始创建的目录挂载到容器内的jenkins_home目录
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker # 这是为了我们可以在容器内使用docker命令
- /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
docker_nginx:
restart: always
image: nginx
container_name: nginx
ports:
- 80:80
- 433:433
volumes:
- /home/nginx/conf.d/:/etc/nginx/conf.d
- /home/webserver/static/jenkins/dist/:/usr/share/nginx/html
7.编写nginx.conf文件,存放在一个目录中
server{
listen 80;
root /usr/share/nginx/html;
index index.html index.html;
}
8.启动docker-compose
进入compose目录下(有yml文件),启动
docker-compose up -d
安装jenkins插件 (Jenkins大小一般2核4G)
Manage Jenkins中找到Manage Plugins选项,安装gitlab、Publish Over SSH 、nodejs
初始管理员密码
docker ps //查看容器运行状态
docker logs xxx(容器名称) // 查看管理员初始密码
运行上面的指令后,出现两个星号的中间的内容,即为初始管理员密码
初始密码输入这里即可
创建一个用户,保存完成即可。
Jenkins配置选项
首先,在jenkins中安装Gitlab Hook Plugin插件,用以支持gitlab的webhook功能
- 1.在jenkins新建job,输入job名称,选择“构建一个自由风格的软件项目”一项
- 2.进入job配置页面"General"选项,配置名称和描述
- 3.“源码管理”选项,配置项目的git仓库地址需要构建的分支信息
- 4.“构建触发器” 选项,配置 job 构建时机,勾选 “Poll SCM”,”日程表” 留空。即可通过 gitlab webhook 来触发 job 构建
- 5.“构建” 选项, “增加构建步骤”, 选择 “Execute shell”,配置构建命令。 如下,这里配置了 cnpm install、npm run unit、npm run build, 分别做安装依赖、单元测试、编译打包三件事。
- 6.“构建后操作” 选项,添加两个构建后操作步骤:
- “E-mail Notification”,配置构建失败的邮件通知人;
- “Send build artifacts over ssh”, 执行预先写好的[远程服务器]的部署脚本
- 7.点击最下方的“保存”,job创建完毕。
配置gitlab webhook
进入项目的 gitlab 页面 >> Settings >> Integrations , 添加一条 webhook: URL 中输入”http://jenkinshost/gitlab/build_now", Trigger 勾选触发时机 ,我们用的是 “Push events”,点击 “Add webhook”。
当有代码 push 到git 仓库时,gitlab 会向 jenkins 服务器发送 post 请求,触发之前创建好的 jenkins job 运行, 代码从开发到部署测试,是一个持续的过程,同时对整个过程错误提供了反馈机制。