前端CI/CD工具
自动化部署与负载均衡
pm2
pm2是node进程管理工具,利用它进行node应用管理的性能监控、自动重启、负载均衡等。
全局安装
1 | npm install -g pm2 |
使用pm2控制进程
1 | pm2 start app.js //启动进程pm2 restart app.js //重启进程pm2 list //获取当前应用等名字/进程idpm2 stop app_name|app_id //停止进程应用pm2 delete app_name|app_id //删除特定进程应用pm2 stop all //停止所有应用 |
其他命令行参数
1 | pm2 start app.js -i max //根据有效CPU数启动最大进程数目pm2 start app.js -i 3 //启动3个进程pm2 start app.js -n name //启动进程时指定进程名字namepm2 start app.js --watch //监听应用目录的变化,一旦发生变化就自动重启pm2 monit //查看当前pm2的运行进程的状态pm2 start big-array.js --max-memory-restart 20M //超过内存上限后自动重启 |
配置启动环境
在node中指定启动环境(开发环境、生产环境等)
1 | "env":{ "NODE_ENV":"production", "REMOTE_ADDR":"http://www.example.com/"},"env_dev":{ "NODE_ENV":"development", "REMOTE_ADDR":"http://wdev.example.com/"}"env_test":{ "NODE_ENV":"test", "REMOTE_ADDR":"http://wtest.example.com/"} |
启动时设置环境
1 | pm2 start app.js --env dev |
pm2支持线上系统和第三方扩展,如常用的log、rotate,
jenkins
jenkins是基于java和docker的自动化部署和管理工具
安装之前确保电脑安装java(java 1.8)和docker
mac安装
使用brew工具安装和启动
1 |
流水线
Jenkins 流水线 (或简单的带有大写”P”的”Pipeline”) 是一套插件,它支持实现和集成 continuous delivery pipelines 到Jenkins。
Jenkinsfile
能使用两种语法进行编写 - 声明式和脚本化。
声明式和脚本化的流水线从根本上是不同的。 声明式流水线的是 Jenkins 流水线更近的特性:
- 相比脚本化的流水线语法,它提供更丰富的语法特性,
- 是为了使编写和读取流水线代码更容易而设计的。
然而,写到Jenkinsfile
中的许多单独的语法组件(或者 “步骤”), 通常都是声明式和脚本化相结合的流水线。
本质上,Jenkins 是一个自动化引擎,它支持许多自动模式。 流水线向Jenkins中添加了一组强大的工具, 支持用例 简单的持续集成到全面的CD流水线。通过对一系列的相关任务进行建模, 用户可以利用流水线的很多特性:
- Code: 流水线是在代码中实现的,通常会检查到源代码控制, 使团队有编辑, 审查和迭代他们的交付流水线的能力。
- Durable: 流水线可以从Jenkins的主分支的计划内和计划外的重启中存活下来。
- Pausable: 流水线可以有选择的停止或等待人工输入或批准,然后才能继续运行流水线。
- Versatile: 流水线支持复杂的现实世界的 CD 需求, 包括fork/join, 循环, 并行执行工作的能力。
- Extensible:流水线插件支持扩展到它的DSL [1]的惯例和与其他插件集成的多个选项。
然而, Jenkins一直允许以将自由式工作链接到一起的初级形式来执行顺序任务, [4] 流水线使这个概念成为了Jenkins的头等公民。
流水线是用户定义的一个CD流水线模型 。流水线的代码定义了整个的构建过程, 他通常包括构建, 测试和交付应用程序的阶段 。
节点是一个机器 ,它是Jenkins环境的一部分 and is capable of执行流水线。
stage
块定义了在整个流水线的执行任务的概念性地不同的的子集(比如 “Build”, “Test” 和 “Deploy” 阶段), 它被许多插件用于可视化 或Jenkins流水线目前的 状态/进展. [6]
本质上 ,一个单一的任务, a step 告诉Jenkins 在特定的时间点要做what (或过程中的 “step”)。 举个例子,要执行shell命令 ,请使用 sh
步骤: sh 'make'
。当一个插件扩展了流水线DSL, [1] 通常意味着插件已经实现了一个新的 step。
在声明式流水线语法中, pipeline
块定义了整个流水线中完成的所有的工作。
1 | pipeline { |
在脚本化流水线语法中, 一个或多个 node
块在整个流水线中执行核心工作。 虽然这不是脚本化流水线语法的强制性要求, 但它限制了你的流水线的在node
块内的工作做两件事:
- 通过在Jenkins队列中添加一个项来调度块中包含的步骤。 节点上的执行器一空闲, 该步骤就会运行。
- 创建一个工作区(特定为特定流水间建立的目录),其中工作可以在从源代码控制检出的文件上完成。
Caution: 根据你的 Jenkins 配置,在一系列的空闲后,一些工作区可能不会自动清理 。
1 | node { |
step
Pipelines 由多个步骤(step)组成,允许你构建、测试和部署应用。 Jenkins Pipeline 允许您使用一种简单的方式组合多个步骤, 以帮助您实现多种类型的自动化构建过程。
可以把“步骤(step)”看作一个执行单一动作的单一的命令。 当一个步骤运行成功时继续运行下一个步骤。 当任何一个步骤执行失败时,Pipeline 的执行结果也为失败。
当所有的步骤都执行完成并且为成功时,Pipeline 的执行结果为成功。
在 Linux、BSD 和 Mac OS(类 Unix ) 系统中的 shell 命令, 对应于 Pipeline 中的一个 sh
步骤(step)。
1 | pipeline { |
Windows 的系统使用 bat
步骤表示执行批处理命令。
1 | pipeline { |
Jenkins Pipeline 提供了很多的步骤(step),这些步骤可以相互组合嵌套,方便地解决像重复执行步骤直到成功(重试)和如果一个步骤执行花费的时间太长则退出(超时)等问题。
1 | pipeline { |
完成时动作
当 Pipeline 运行完成时,你可能需要做一些清理工作或者基于 Pipeline 的运行结果执行不同的操作, 这些操作可以放在 post
部分。
1 | pipeline { |
环境变量
环境变量可以像下面的示例设置为全局的,也可以是阶段(stage)级别的。 如你所想,阶段(stage)级别的环境变量只能在定义变量的阶段(stage)使用。
1 | pipeline { |
通过 archiveArtifacts
步骤和文件匹配表达式可以很容易的完成构建结果记录和存储,
1 | pipeline { |
如果在 archiveArtifacts
步骤中指定了多个参数, 那么每个参数的名称必须在步骤代码中明确指定, 即文件的路径、文件名和 fingerprint
三个参数。 如果您只需指定文件的路径和文件名, 那么你可以省略参数名称 artifacts
,例如: archiveArtifacts 'build/libs/**/*.jar'
回放
Circle CI
circle CI可以与github action串接
参考rocksdb ci流程
travis
Sentry
sentry是一个开源的错误追踪工具,可以帮助开发人员实时监控和修复系统中的错误。其专注于错误监控以及提取一切事后处理所需的信息,支持几乎所有主流开发语言(JS/Java/Python/php)和平台,并提供了web来展示错误。
sentry.io docs.sentry.io/platforms
官方推荐使用docker或者python安装
在前端项目中使用
1 | npm install @sentry/browser @sentry/integrations |
1 | import * as Sentry from '@sentry/browser'import * as Intergrations from '@sentry/integrations'process.env.NODE_ENV === "production" && Sentry.init ({ dsn: 'https://e028cb7b8dd645978cf5d84a@sentry.io/18726', integrations: [new Integrations.Vue{}],}) |