前端CI/CD工具
pm2是node进程管理工具,利用它进行node应用管理的性能监控、自动重启、负载均衡等。
全局安装
npm install -g pm2
使用pm2控制进程
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 //停止所有应用
其他命令行参数
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中指定启动环境(开发环境、生产环境等)
"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/"}
启动时设置环境
pm2 start app.js --env dev
pm2支持线上系统和第三方扩展,如常用的log、rotate,
jenkins是基于java和docker的自动化部署和管理工具
安装之前确保电脑安装java(java 1.8)和docker
mac安装
使用brew工具安装和启动
Jenkins 流水线 (或简单的带有大写"P"的"Pipeline") 是一套插件,它支持实现和集成 continuous delivery pipelines 到Jenkins。
Jenkinsfile
能使用两种语法进行编写 - 声明式和脚本化。
声明式和脚本化的流水线从根本上是不同的。 声明式流水线的是 Jenkins 流水线更近的特性:
然而,写到Jenkinsfile
中的许多单独的语法组件(或者 "步骤"), 通常都是声明式和脚本化相结合的流水线。
本质上,Jenkins 是一个自动化引擎,它支持许多自动模式。 流水线向Jenkins中添加了一组强大的工具, 支持用例 简单的持续集成到全面的CD流水线。通过对一系列的相关任务进行建模, 用户可以利用流水线的很多特性:
然而, 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
块定义了整个流水线中完成的所有的工作。
pipeline {
agent any
stages {
stage('Build') {
steps {
//
}
}
stage('Test') {
steps {
//
}
}
stage('Deploy') {
steps {
//
}
}
}
}
在脚本化流水线语法中, 一个或多个 node
块在整个流水线中执行核心工作。 虽然这不是脚本化流水线语法的强制性要求, 但它限制了你的流水线的在node
块内的工作做两件事:
node {
stage('Build') {
//
}
stage('Test') {
//
}
stage('Deploy') {
//
}
}
Pipelines 由多个步骤(step)组成,允许你构建、测试和部署应用。 Jenkins Pipeline 允许您使用一种简单的方式组合多个步骤, 以帮助您实现多种类型的自动化构建过程。
可以把“步骤(step)”看作一个执行单一动作的单一的命令。 当一个步骤运行成功时继续运行下一个步骤。 当任何一个步骤执行失败时,Pipeline 的执行结果也为失败。
当所有的步骤都执行完成并且为成功时,Pipeline 的执行结果为成功。
在 Linux、BSD 和 Mac OS(类 Unix ) 系统中的 shell 命令, 对应于 Pipeline 中的一个 sh
步骤(step)。
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'echo "Hello World"'
sh '''
echo "Multiline shell steps works too"
ls -lah
'''
}
}
}
}
Windows 的系统使用 bat
步骤表示执行批处理命令。
pipeline {
agent any
stages {
stage('Build') {
steps {
bat 'set'
}
}
}
}
Jenkins Pipeline 提供了很多的步骤(step),这些步骤可以相互组合嵌套,方便地解决像重复执行步骤直到成功(重试)和如果一个步骤执行花费的时间太长则退出(超时)等问题。
pipeline {
agent any
stages {
stage('Deploy') {
steps {
retry(3) {
sh './flakey-deploy.sh'
}
timeout(time: 3, unit: 'MINUTES') {
sh './health-check.sh'
}
}
}
}
}
完成时动作
当 Pipeline 运行完成时,你可能需要做一些清理工作或者基于 Pipeline 的运行结果执行不同的操作, 这些操作可以放在 post
部分。
pipeline {
agent any
stages {
stage('Test') {
steps {
sh 'echo "Fail!"; exit 1'
}
}
}
post {
always {
echo 'This will always run'
}
success {
echo 'This will run only if successful'
}
failure {
echo 'This will run only if failed'
}
unstable {
echo 'This will run only if the run was marked as unstable'
}
changed {
echo 'This will run only if the state of the Pipeline has changed'
echo 'For example, if the Pipeline was previously failing but is now successful'
}
}
}
环境变量
环境变量可以像下面的示例设置为全局的,也可以是阶段(stage)级别的。 如你所想,阶段(stage)级别的环境变量只能在定义变量的阶段(stage)使用。
pipeline {
agent any
environment {
DISABLE_AUTH = 'true'
DB_ENGINE = 'sqlite'
}
stages {
stage('Build') {
steps {
sh 'printenv'
}
}
}
}
通过 archiveArtifacts
步骤和文件匹配表达式可以很容易的完成构建结果记录和存储,
pipeline {
agent any
stages {
stage('Build') {
steps {
sh './gradlew build'
}
}
stage('Test') {
steps {
sh './gradlew check'
}
}
}
post {
always {
archiveArtifacts artifacts: 'build/libs/**/*.jar', fingerprint: true
junit 'build/reports/**/*.xml'
}
}
}
如果在 archiveArtifacts
步骤中指定了多个参数, 那么每个参数的名称必须在步骤代码中明确指定, 即文件的路径、文件名和 fingerprint
三个参数。 如果您只需指定文件的路径和文件名, 那么你可以省略参数名称 artifacts
,例如: archiveArtifacts 'build/libs/**/*.jar'
回放
1.配置企业微信
填写名称,创建成功后复制hook地址
2.在jenkins中进入系统管理-管理插件
搜索插件Qy Wechat Notification,安装这个插件
然后配置Jenkins的Webhook
构建后的操作
-> 选择企业微信通知
设置Webhook,把企微中的地址填入
circle CI可以与github action串接
参考rocksdb ci流程
创建并初始化项目
$ mkdir rootProject && cd rootProject
$ dagger project init
更新依赖
$ dagger project update
创建main.cue文件
package main
import (
"dagger.io/dagger"
)
dagger.#Plan & {
actions: {
hello: #Run & {
script: contents: "echo \"Hello!\""
}
}
}
然后创建另一个文件夹
$ cd .. && mkdir personal && cd personal && git init
创建一个新的main.cue
package personal
import(
"universe.dagger.io/alpine"
"universe.dagger.io/bash"
)
#Run: {
_img: alpine.#Build & {
packages: bash: _
}
bash.#Run & {
always: true
input: _img.output
}
}
Cue是json的超集,可以编译成json或者yaml文件
sentry是一个开源的错误追踪工具,可以帮助开发人员实时监控和修复系统中的错误。其专注于错误监控以及提取一切事后处理所需的信息,支持几乎所有主流开发语言(JS/Java/Python/php)和平台,并提供了web来展示错误。
sentry.io docs.sentry.io/platforms
官方推荐使用docker或者python安装
在前端项目中使用
npm install @sentry/browser @sentry/integrations
初始化
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{}],
})
使用
import * as Sentry from '@sentry/browser';
// Set user information, as well as tags and further extras
Sentry.configureScope(scope => {
scope.setExtra('battery', 0.7);
scope.setTag('user_mode', 'admin');
scope.setUser({ id: '4711' });
// scope.clear();
});
// Add a breadcrumb for future events
Sentry.addBreadcrumb({
message: 'My Breadcrumb',
// ...
});
// Capture exceptions, messages or manual events
Sentry.captureMessage('Hello, world!');
Sentry.captureException(new Error('Good bye'));
Sentry.captureEvent({
message: 'Manual',
stacktrace: [
// ...
],
});
面向k8s的CD平台
创建
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
扫描代码。检查代码
可以报错