持续部署和持续集成

主要内容

  • 什么是CI/CD
  • 介绍CD/CD流程
  • 前端:结合CI/CD,实现快速迭代
  • Docker使用,Jenkins + gitlab + nodejs 自动化部署项目
  • 持续集成工具:
    • Jenkins
    • Travis CI
    • Circle CI

环境

  • Linux服务器(推荐:CentOS)

持续集成

  • CI (Continuous Integration)

持续交付

  • CD (Continuous Delivery)
  • 完成 CI 中构建及单元测试和集成测试的自动化流程后,持续交付可自动将已经验证的代码发布到存储库
  • 持续交付的目标是拥有一个可随时部署到生产环境的代码库

持续部署

  • CD (Continuous Deployment)
  • 持续部署是CI/CD的最后一个阶段,持续部署可以自动将应用发布到生产环境。

工具效率对比

jenkins

特点

  • 容易安装
    • jenkins是一个独立的java程序,包含各个平台的东西,可以直接下载运行
  • 容易配置:GUI配置界面
  • 容易支持
  • 集成E-Mail/RSS/IM:相当于结果通知
  • JUnit/TestNG测试报告
  • 分布式构建
  • 文件指纹信息
  • 支持第三方插件
  • Resr API:通过APi操作jenkins

优点

  • 免费-定制
  • 插件系统
  • 完全控制系统

缺点

  • 需要专门服务器(花钱)
  • 配置定制

Travis CI

  • 是一个托管的持续集成服务,用于构建和测试在GutHub上托管的软件项目

特点

  • 基于云-不需要额外的服务器
  • 支持Docker运行测试
  • 使用YAML文件进行配置
  • 支持语言非常多
  • 支持多环境构建,可以使用不同版本的语言和包进行运行测试

优点

  • 开箱即用
  • 快速启动
  • 轻量级YAML配置
  • 开源项目的免费计划
  • 无需外服务器

缺点

  • 收费

Circle CI

jenkins

相关概念

  • 流水线:jenkins Pipeline
    • 流水线通常被写入到文本文件中(成为Jenkinsfile),这个文件可以放到我们的项目源代码中
  • 节点:节点是一个机器,用于执行jenkins任务
  • 阶段:定义不同的执行任务,比如:构建,测试,发布(部署)
  • 不在:相当于告诉jenkins现在需要做什么,不如shell命令

安装

  • macOS FTP 小工具(Transmit),可以用来上传JDK,当然low的方法

  • docker logs 容器名称 查看日志

# 启动
docker run -itd -u root -p 10002:8080 -v /home/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /home/:/home --name jenkins jenkinsci/blueocean

# 查看密码
docker logs jenkins
1
2
3
4
5
  • 偶发性小问题
Please wait while Jenkins is getting ready to work (jenkins)
如果界面提示Jenkins正在启动,请稍后...或者提示
Please wait while Jenkins is getting ready to work...
解决方法:
需要你进入jenkins的工作目录,打开 hudson.model.UpdateCenter.xml 把 http://updates.jenkins-ci.org/update-center.json 改成 http://mirror.xmission.com/jenkins/updates/update-center.json
1
2
3
4
5
  • 访问,初始化
    • IP:端口号访问(docker前面的10002)
    • 记得记住你的管理员密码

配置插件加速

  • 入jenkins系统管理->插件管理中->高级选项卡->升级站点,使用清华源
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json
1

环境配置

  • jenkins URL 配置
  • 配置全局变量
  • 配置邮件服务
  • 配置gitlab等

全局工具配置

  • 安装JDK
  • 安装Git
  • docker
  • maven

用户管理

  • 权限矩阵配置
  • 添加管理员用户所有权限
  • 添加插件:Authorize Project,并且在系统管理中进行配置
    • 配置逻辑:给用户当前项目的权限

集成gitlab

安装插件

  • GitHub Integration
  • GitLab
  • Publish Over SSH
  • SSH Agent
  • SSH Pipeline Steps
  • SSH

简单集成gitlab

  • 创建项目
  • 设置 -- 集成 -- 添加链接和安全令牌
    • 链接:jenkins 创建项目 --> 构建触发器 --> build when a change is 。。。 找到后面的url:就是gitlab要添加的url
    • token:下面有创建token,记得添加创建
  • 如果是内网环境,需要在gitlab配置:
    • 记得 SSL 是否取消
    • 管理中心 -- 设置 -- 网络(Outbound requests)Allow requests to the local network from hooks and services 勾选
  • 添加构建步骤:执行ssh --> 添加ssh脚本
  • 提交验证查看jenkins是否有输出日志即可

shell脚本

  • 安装依赖
  • 打包命令 build
  • 将dist文件传到服务器

TIP

这里的shell脚本,在gitlab-runner,jenkins以及TravisCI中均可使用,只是细节配置问题

建议大家看下Element-UI源码,参考他们shell脚本

jenkinsfile

gitlab + gitlab-runner

环境安装

YML语法

  • 参考资料:https://www.cnblogs.com/yinchh/p/10405966.html

语法特性

  • 以缩进代表层级关系
  • 缩进不能使用tab,只能用空格
  • 空格个数不重要,但是同一层级必须左对齐
  • 大小写敏感
  • 格式为:key= value
  • 值可以不用"或'包裹,但是含有特殊字符时需要使用,如值中包含:
  • 注释单行用#,只能注释单行

数据格式

  • 字面量:数字、字符串、布尔等不可再分的值
  • 对象:即为键值对,key= value
  • 数组:两种写法:
# 写法一
用户名: [张三,李四]

# 写法二
# -后面有一个空格
用户名:
- 张三
- 李四
1
2
3
4
5
6
7
8

gitlab-ci.yml

流水线和作业

  • 流水线:项目提交(合并)之后,会根据配置进行自动化构建发布项目,这一整个流程可以称之为一个流水线(pipelines)
  • 作业:每个流水线可能包含若干个作业(jobs),这些作业按照顺序去执行,在 gitlab-ci.yml 文件中 为顶级元素

一个简单的gitlab-ci.yml

一个最简单的gitlab-ci.yml文件

# 用于指定 docker镜像
image: node:10

# 定义作用job1
job1:
  # 每个job最少要包含一个script
  script:
    # 输出:wo shi job 1
    - echo 'wo shi job 1'
  # 定义一列tags,用来指定选择哪个Runner(同时Runner也要设置tags,在创建runner的时候)
  # 如果没有设置共享runner(Shared Runner),就必须指定明确的(Specific)的runner,使用tags指定
  tags:
    - demo
    
# 定义作用job2
job2:
  script:
    - echo 'wo shi job 2'
  tags:
    - demo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

在这个runner中有2个作业,他们会按照顺序去执行

gitlab-ci.yml 语法详解

  • 官方文档:https://docs.gitlab.com/ce/ci/yaml/README.html

image

stages

before_script

after_script

jobs