少湖说 | 科技自媒体

互联网,科技,数码,鸿蒙

安装

  1. 开通 ECS 服务器

服务器镜像,建议选择 Alibaba Cloud Linux、CentOS、Ubuntu 或 Anolis OS

  1. 安装 os-copilot

如果是 Alibaba Cloud Linux/CentOS,执行以下命令安装 os-copilot:

1
sudo yum install -y os-copilot

如果是 Ubuntu:

curl -#S https://mirrors.aliyun.com/os-copilot/os-copilot-all-in-one-latest.sh | bash

配置

1.配置 RAM 用户

由于需要使用 AK,SK, 这里先添加 RAM 用户

打开 https://ram.console.aliyun.com/users,点击创建用户,填写登录名称,访问方式勾选 使用永久 AccessKey 访问,点击确定。

复制 AccessKey,AccessSecret,后面会用到。

2.分配权限

点击用户名称,在标签栏处,点击权限管理,新增授权,在权限策略处,搜索 “AliyunSysOMOSCopilotAccess”,然后勾选,点击 “确认新增授权”

权限管理

新增授权

这样,RAM 用户就拥有了 os-copilot 的权限。

3.在命令行中配置 AK,SK

让我们回到服务器的命令行,执行以下命令:

1
2
export ALIBABA_CLOUD_ACCESS_KEY_ID=<AccessKey ID>
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<AccessKey Secret>

替换为上面您自己复制的 AccessKey。

测试

1.使用普通模式

1
copilot 当前服务器的健康度

输出以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
[root@moguyun ~]# copilot 当前服务器的健康度

[Copilot]:
要检查当前服务器的健康度,可以执行以下几个步骤来获取相关信息:
1 检查CPU使用率: 使用 top 命令可以查看当前系统的CPU使用情况。
top -b -n 1
2 检查内存使用情况: 使用 free 命令可以查看内存使用情况。
free -h
3 检查磁盘使用情况: 使用 df 命令可以查看磁盘空间使用情况。
df -h
4 检查网络连接状态: 使用 netstat 命令可以查看网络连接状态。
netstat -tuln
5 检查系统负载: 使用 uptime 命令可以查看系统的平均负载。
uptime
6 检查系统日志: 使用 journalctl 命令可以查看系统日志,帮助发现潜在的问题。
journalctl -xe
7 检查服务状态: 使用 systemctl 命令可以查看系统服务的状态。
systemctl list-units --type=service --state=failed

通过以上命令,你可以全面了解服务器的健康状况。如果有任何异常,可以根据输出的信息进一步排查问题。

[Copilot]发现如下命令:
1. top -b -n 1
2. free -h
3. df -h
4. netstat -tuln
5. uptime
6. journalctl -xe
7. systemctl list-units --type=service --state=failed

[Copilot]: 请选择要执行的命令或者保存所有命令,从[s, 1, 7]中进行选择,回复's''save'进行保存,回复'n''no'进行取消,回复'r''retry'重新生成回答。
请输入: 1

[Copilot]: 确认执行该命令[top -b -n 1]?(y/n)
请输入: y
top - 15:53:04 up 94 days, 22:14, 1 user, load average: 0.01, 0.02, 0.00
Tasks: 224 total, 1 running, 220 sleeping, 0 stopped, 3 zombie
%Cpu(s): 3.1 us, 3.1 sy, 0.0 ni, 93.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3581.4 total, 668.4 free, 1285.0 used, 1628.1 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 1834.3 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3216368 root 20 0 0 0 0 I 6.7 0.0 0:01.06 kworker+
1 root 20 0 169548 6352 3068 S 0.0 0.2 1:40.93 systemd
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par+

...

3219422 root 20 0 2744 816 708 S 0.0 0.0 0:00.23 copilot
3219423 root 20 0 517300 73980 17776 S 0.0 2.0 0:01.34 copilot
3219447 root 20 0 227204 4668 4020 R 0.0 0.1 0:00.00 top

[Copilot]: 执行结束。

可以看到,这种模式下,Copilot 会根据用户的输入要求,给出对应的建议命令,然后需要手动选择、确认执行。

2.使用自动模式,在命令后面增加参数 -t

1
copilot 当前服务器的健康度 -t

输出以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[Copilot]:
为了评估服务器的健康状况,我们需要检查一些关键指标,比如CPU使用率、内存使用情况、磁盘空间和网络状态。这些信息可以通过执行一系列的命令来获取。

[Copilot]:
从top命令的输出可以看到,CPU的使用率大约为6.2%(用户进程3.1% + 系统进程3.1%),空闲率为93.8%,这表明CPU的负载较低。

[Copilot]:
从free -m命令的输出可以看到,总内存为3581MB,已使用的内存为1284MB,空闲内存为669MB,缓冲/缓存占用1627MB,可用内存为1834MB。这表明内存使用情况良好,没有出现内存不足的情况。

接下来,我们检查磁盘空间和网络状态。

[Copilot]:
df -h命令的输出可以看到,根文件系统的总大小为79GB,已使用36GB,剩余40GB,使用率为48%。这表明磁盘空间还有足够的余量,没有出现磁盘空间不足的情况。

最后,我们检查网络状态。

[Copilot]:
从netstat -tuln命令的输出可以看到,服务器上运行着多个监听端口的服务,包括HTTP (80), HTTPS (443), SSH (22)等常用服务。这些服务都在正常监听状态,没有异常。

综合以上信息:

• CPU使用率较低,约为6.2%。
• 内存使用情况良好,没有出现内存不足的情况。
• 磁盘空间还有足够的余量,使用率为48%。
• 网络状态正常,各服务都在正常监听状态。

因此,当前服务器的健康状况良好,没有明显的性能瓶颈或资源不足的问题。

[Copilot]:
当前服务器的健康状况良好,没有明显的性能瓶颈或资源不足的问题。具体指标如下:

• CPU使用率:约6.2%
• 内存使用情况:总内存3581MB,已使用1284MB,空闲669MB,缓冲/缓存1627MB,可用1834MB
• 磁盘空间:根文件系统总大小79GB,已使用36GB,剩余40GB,使用率48%
• 网络状态:各服务都在正常监听状态,没有异常

3.使用文件定义任务

新建一个文件,定义需要执行的任务

1
2
3
4
5
cat task.txt

1.查找日志中大于200M的文件,列出来,显示每个文件的名称和大小
2.用户确认是否清理
3.确认以后删除这些文件

测试结果

copilot 执行任务

1
co -f ~/task.txt -t
1
2
3
4
5
[Copilot]:
我需要先找到大于200M的日志文件并列出它们的名称和大小。这可以通过find命令实现。

[Copilot]:
Observation:

4.测试解释命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cat /etc/sysctl.conf |co "使用中文解释"

[Copilot]:
这些配置项都是用于调整Linux内核参数的,下面我将逐一解释每个配置项的意义: vm.swappiness = 0
• 含义:vm.swappiness 参数控制了系统使用交换空间(swap)的倾向性。值为0表示尽可能避免使用交换空间,只有当物理内存不足时才会使用。
• 作用:减少磁盘I/O操作,提高系统性能。 kernel.sysrq = 1

• 含义:kernel.sysrq 参数启用了“魔术 SysRq”键功能。当设置为1时,允许通过组合键(通常是 Alt + SysRq + <command>)执行某些低级别的内核操作。
• 作用:在系统出现严重问题时,可以用来诊断和恢复系统。 net.ipv4.neigh.default.gc_stale_time = 120

• 含义:net.ipv4.neigh.default.gc_stale_time 参数设置了邻居表项(如ARP缓存)中过期条目的垃圾回收时间。值为120秒表示过期条目将在120秒后被清理。
• 作用:防止邻居表项占用过多内存,保持网络连接的高效性。 net.ipv4.conf.all.rp_filter = 0

...

• 注释:net.ipv4.tcp_max_syn_backlog 参数设置了SYN队列的最大长度。值为65536表示最多允许65536个未完成的连接请求。
• 作用:增加SYN队列长度,提高服务器处理大量并发连接的能力。
• 注意:此参数仅在 net.ipv4.tcp_syncookies 设置为0时生效。

这些配置项通常用于优化系统的网络性能和安全性,确保在高负载情况下系统的稳定性和响应速度。

参考资料

智能助手OS Copilot使用说明

背景

App主体迁移,没有及时更新 apple-app-site-association 文件,导致唤起微信报错“由于应用unversal link校验不通过”

Unversal link

Uncersal link 是苹果推出的替代 schema 的一种跨应用跳转方案。
需要先生成 app-site-association 文件,然后放在跳转域名的指定目录 /.well-known/apple-app-site-association 文件中。

如果通过nginx可以使用如下配置

1
2
3
4
location ~ /.well-known/apple-app-site-association {
charset UTF-8;
default_type application/json;
}

上面的配置可以省略,只要返回这个文件就可以,至于反回的头格式(header),苹果并不关心

验证文件格式

  1. 可以使用 https://yurl.chayev.com/ios-results验证配置的文件是否有效。

  2. 需要注意的是,配置文件一旦发生变更,并不是立即生效,apple CDN有缓存,可能长达1小时以上。

  3. 经过测试,国内CDN节点要比国外慢,如果需要快速验证唤起微信,可以挂VPN,使用海外节点,从而更快刷新CDN缓存。

  4. 手动验证CDN是否刷新,访问网址,https://app-site-association.cdn-apple.com/a/v1/{domain},将{domain}替换为自己的域名,查看返回内容是否生效。

  5. App团队发生变化,如迁移Appstore所属开发者主体,需要更新apple-app-site-association 文件。

  6. 另外,迁移过程中,为了兼容原有应用,app-site-association文件中应该保留原应用的配置信息,追加新应用配置。

参考资料

  1. https://juejin.cn/post/7254809601873690681
  2. https://yurl.chayev.com/ios-results

Flutter 开始支持App扩展

Flutter从3.16开始,支持在应用扩展中使用Flutter,具体操作可以参考官方文档。

注意事项

配置

  1. App extension 与原App是两个独立的项目/进程,无法直接相互调用,代码也不共享

  2. 如果需要共享资源,如存储等,需要配置 App Group,否则不需要

  3. 开发过程中使用的是debug/profile版的Flutter.xcframework,发布时需要手动更改导入的库,改为导入release版的Flutter.xcframework.
    profile/release版通过目录 /bin/cache/artifacts/engine/ios/extension_safe 逐级向上查找,可以找到profile或release相关字样的目录

  4. 不同类型的extension内存有限制,模拟器中没有限制。Flutter需要比较多的内存,所以文档中指出,只能在“内存限制不低于100M”的扩展类型中使用Flutter,例如 share extensions
    限制120M,可以使用Flutter;keyboard extension 内存限制为40M,故不可以使用Flutter。

参考资料

  1. https://flutter.cn/docs/platform-integration/ios/app-extensions

  2. [尝试Flutter开发custom keyboard](https://github.com/zacksleo/flutter-ios-custom-keyboard-extension) 仅能在模拟器运行,真机因内存限制无法运行

2008年,中本聪首次提出了比特币的设想,这打开了去中心化的大门。

比特币白皮书清晰的描述了去中心化支付的解决方案,并分别从以下几个方面阐述了他的理念:

一、由转账双方点对点的通讯,而不通过中心化的第三方,这彻底了解决了信任危机。通过用户签名,保证了信息的所有权,其他人无法更改。

  1. 互联网经过几十年的飞速发展,我们所使用的服务都倾向于集中化发展。这种中性化在给我们带来便利的同时,也带来了巨大的信任危机,这些巨头在尽其所能的采集用户数据和行为,而用户则表现出越来越抗拒,不信任。用户信息泄露,大数据杀熟,用户隐私被侵犯… 种种问题层出不穷,用户与大企业也在某种程度上站在了对立面。要解决这些问题,单单依靠反垄断或者政府司法机关的强力措施,是远不够的。
  2. 所以,我们需要一种从根本上,保证用户可以亲自掌控自己的数据,控制它如何被合理的使用、读取甚至被销毁的无上权利。
  3. 区块链去中心化和签名的思想,给了普通人这样的权利,我们不再依赖巨头也可以使用互联网服务,而这些服务由区块链上的节点提供,由每一个人提供。

二、作恶的代价

  1. 在区块链中,作恶的代价是巨大的。在工作量证明中,任何破坏者只能让 CPU白白浪费算力,而失去了获得奖励的机会,这会使得他们支付巨额的电费账单。
  2. 在共识机制中,大家总会承认最长的链,而忽略较短的链。破坏者如果想要篡改账本,需要进行大量的哈希计算,以求得符合条件的 nonce值,在这个漫长过程中,新的合法区块早已产生,最终他篡改的内容会被大家拒绝。
  3. 与其浪费时间篡改,不如按游戏规则挖矿,这样反而带来可观的收益。而这正是比特币先进独到的地方。

三、双重支付

  1. 比特币通过回溯未花费交易(UTXO)来验证合法性,保证用户花费的财产拥有合法的依据
  2. 同时,在等到第6个区块后再进行链的确认,双重支付的概率也降到了最低

四、互联网向左,区块链向右

  1. 作为区块链的开山鼻祖,比特币未我们带来了一个崭新的世界。一个点对点的世界, Web 3.0的世界。这个世界更加平等和民主,彼此的联系更加紧密,社区自治理念更加深入人心。
  2. 区块链使得去中心化的理念更加深入人心,互联网过度中化的治理方式也得以矫正,我们迎来一个更加美好的未来…

参考资料

问题缘由

在微信小程序开发中,先要在本地使用微信开发者工具进行调试,如果需要在线测试,则需要将编译好的代码上传。
目前,只能通过微信开发者工具手动点击上传,而该过程无法与持续集成/持续部署结合在一起,本文就是为了解决能够实现自动化和持续部署的难题

实现原理

微信 miniprogram-ci 库,提供了命令行调用方式,其中就包括上传的命令,我们可以通过脚本实现自动化集成

步骤

安装并配置 GitLab Runner

这部分文档在 Install GitLab Runner on macOS

安装

首先需要在本机上安装 GitLab Runner, 由于微信开发者工具只提供了 mac 和 windows 版本,所以目前只能在这两种系统上实现持续集成,本文讲述在 mac 的具体实现, windows 上的实现与此类似,只是相关命令和路径需要做些变更

注册 GitLab Runner

1
2
gitlab-runner register

编写 .gitlab-ci.yml

在此之前,你需要对GitLab-CI有一定的掌握,这部分资料参考下方的相关文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
image: node:alpine

before_script:
- export APP_ENV=testing
- yarn config set registry 'https://registry.npm.taobao.org'
stages:
- build
- deploy

variables:
NPM_CONFIG_CACHE: "/cache/npm"
YARN_CACHE_FOLDER: "/cache/yarn"
DOCKER_DRIVER: overlay2
build-package:
stage: build
dependencies: []
cache:
key: "$CI_COMMIT_REF_NAME"
policy: pull
paths:
- node_modules
script:
- if [ ! -d "node_modules" ]; then
- yarn install --cache-folder /cache/yarn
- fi
- yarn build
- cp deploy/project.config.json ./dist/project.config.json
artifacts:
name: "wxpkg-dlkhgl-$CI_COMMIT_TAG"
untracked: false
paths:
- dist
only:
- tags
tags:
- docker
release:
stage: deploy
before_script: []
dependencies:
- build-package
variables:
GIT_STRATEGY: none
script:
- yarn global add miniprogram-ci
- if [[ -z "$CI_COMMIT_TAG" ]];then
#- CI_COMMIT_TAG=$CI_COMMIT_REF_NAME
- CI_COMMIT_TAG="测试版:$(date '+%Y-%m-%d')"
- fi
- COMMIT_MESSAGE=`cat ./dist/release.txt`
- rm -f ./dist/release.txt
# 将单行格式转为多行格式
- LF=$'\\\x0A'
- echo $UPLOAD_PRIVATE_KEY | sed -e "s/-----BEGIN RSA PRIVATE KEY-----/&${LF}/" -e "s/-----END RSA PRIVATE KEY-----/${LF}&${LF}/" | sed -e "s/[^[:blank:]]\{64\}/&${LF}/g" > private.key
- miniprogram-ci upload --project-path=$PWD/dist --appid=$APP_ID --upload-version=$CI_COMMIT_TAG --private-key-path=$PWD/private.key --upload-description="$COMMIT_MESSAGE"
environment:
name: production
url: https://mp.weixin.qq.com/wxamp/wacodepage/getcodepage
only:
- tags
- master

注意,在设置-CI/CD-变量中,需要添加两个变量:

APP_ID 小程序 appid

UPLOAD_PRIVATE_KEY 小程序代码上传密钥, 需要在小程序后台获取

由于配置的密钥,在运行时过去到是单行文本形式,需要转换为多行原始格式,并输出到文件,以便上传使用

于是使用一下命令- LF=$'\\\x0A' - echo $UPLOAD_PRIVATE_KEY | sed -e "s/-----BEGIN RSA PRIVATE KEY-----/&${LF}/" -e "s/-----END RSA PRIVATE KEY-----/${LF}&${LF}/" | sed -e "s/[^[:blank:]]\{64\}/&${LF}/g" > private.key

相关文档

概述

在之前的文章Golang持续集成与自动化测试和部署
简要介绍了如何快速搭建Api 微服务, 并进行DevOps集成。本文将进一步深入介绍,如果使用Gin实现Restful规范并进行自动化测试。

Restful

RESTful接口规范一文中,介绍了 Restful 及其规范。

Gin 是一个性能优异的微服务框架,对于Restful有着良好的支持。因为基于此实现Restful并不困难。

Restful 中的核心在于对于资源的定义和使用,和对 HTTP 动词(GET, PUT, DELETE, POST, DELETE, OPTIONS)的充分使用,通过 HTTP 动词,免去了繁冗的接口方法定义。
例如,传统方式如果实现删除文章功能,则需要实现一个类似 post/delete?id=6 的方法, 如果使用 Restful, 则使用 DELETE post/1 形式,其中 DELETE是动词,代表删除操作,
post/1 代表单个文章资源。

Restful 中的另一大规法是对于状态码的充分使用,不再使用响应内容表明状态。如200代表成功,404代表资源不存在,204代表删除成功,201代表创建成功。
有了状态码,响应内容中不再需要使用单独的字段来标记结果的状态(如 {result: “success”} )。

这样的一大好处是实现方式更规范、统一和直观。只要知道资源定义(posts), 就可以猜测出该如何进行增删改查的操作,不再需要知道方法名。
如此一来,可以很轻松的封装出一套同意的方法和操作。

路由定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

package router

import (
"os"
"gitlab.com/zacksleo/project/controllers"
"github.com/gin-gonic/gin"
)

api.GET("/customers", controllers.GetCustomers)
api.GET("/customers/:id", controllers.GetCustomer)
api.POST("/customers", controllers.CreateCustomer)
api.PUT("/customers/:id", controllers.UpdateCustomer)
api.DELETE("/customers/:id", controllers.DeleteCustomer)

下面一个较为完整的案例 controllers/customer.go

自动化测试

当实现了接口发后,为了验证接口运行正常,确保接口可靠和可用性,建议你对接口进行HTTP测试。
这里使用 httpexpect 对api进行测试,该库对响应的数据类型和结构验证有着较好的支持。

概述

前面分别介绍了 Golang 持续集成与自动化测试和部署使用Gin开发Restful接口并进行自动化测试
那么Restful接口搭建好了以后,如何进行接口授权验证,本文将讲述这些内容。

go-oauth2

Oauth2 是一种验证授权机制,通过下发令牌,来实现接口的认证。

go-oauth2

路由

1
2
3
4
auth := r.Group("/api/v1/oauth2")
{
auth.POST("/tokens", controllers.CreateToken)
}

控制器实现

获取Token的测试

这里为了方便在其他接口测试案例中调用获取token的方法,特意进行了拆分

其他接口的测试

概述

Golang是一门性能优异的静态类型语言,但因其奇快的编译速度,结合DevOps, 使得它也非常适合快速开发和迭代。

本文讲述如何使用Golang, 进行持续集成与自动化测试和部署。主要使用了以下相关技术:

  • dep: 进行包的依赖管理
  • gin: 搭建 api 服务
  • gorm:ORM, 数据CRUD
  • mysql: 存储数据
  • testfixtures: 测试夹具,在自动化测试时,自动向数据库填充用于测试的数据
  • httpexpect: HTTP 测试包,用于API测试
  • GoDotEnv: 环境变量处理
  • go test: 使用test命令进行单元测试, 基准测试和 HTTP 测试
  • GitLabCI: DevOps 工具
  • golint: Golang 静态检查工具
  • migrate: 数据库迁移工具
  • Docker: 使用 zacksleo/golang 镜像, 该镜像默认安装了 curl,git,build-base,dep 和 golint
  • db2struct: 将数据库表结构一键生成为 struct(gorm的model)
  • apig: 基于 gorm 和 gin 一键生成 CRUD API

开发流程

  • 使用 apig 脚手架工具初始化项目结构和目录
  • 使用 dep 安装相关依赖
  • 使用 migrate 编写数据库迁移方法,并执行迁移创建数据表
  • 使用 db2struct 生成 models
  • 使用 apig 生成 crud 代码
  • 使用 httpexpect 编写 api 测试代码,并通过 testfixtures 实现数据的自动填充
  • 编写 GitLabCI 脚本进行持续集成

在上述过程中,如需连接数据库时,可通过 GoDotEnv 来实现环境变量的使用

相关CI脚本

集成测试

注意事项

在测试中,如果需要区分单元测试和集成测试,可以使用 build tags 实现,如在文件头部中添加 // +build integration, 运行测试使用 - go test -tags=integration $(go list ./tests/... | grep -v /vendor/) -v 可以只执行集成测试

参考文档

REST接口文档遵循 API Blueprint 编码规范

中文说明需要遵循 中文文案排版指北

按照该格式书写的文档, 可以被 GitLab 及 Gollum 完美解析

主要内容

  1. 使用 Markdown 编写
  2. 请求和响应主体, 使用8个字符缩进
  3. 不使用` 包裹json代码

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75

## 用户密码 [/users/password]

### 重置密码 [PATCH]


+ Attributes
+ phone (number, required) - 手机号码
+ password (string, required) - 密码
+ verify_code (string, required) - 短信验证码

+ Header
+ Authorization Bearer: {clientToken} - 访问令牌, 通过客户端模式获得
+ Content-Type: application/json

+ Request (application/json)

{
"phone":"17083300514",
"password":"pa66w0rd",
"verify_code":"312338"
}

+ Response 201 (application/json)

{
"phone":"17083300514",
"password":"pa66w0rd",
"verify_code":"312338"
}

+ Response 422 (application/json)

[
{
"field": "verify_code",
"message": "短信验证码错误"
},
{
"field": "phone",
"message": "手机号不存在"
},
{
"field": "password",
"message": "密码至少包含一位数字"
}
]



## 扫描二维码 [/qrcode-tokens/{ticket}]

### 更新状态 [PUT]

+ Attributes
+ action (string, required) - 动作, 值为SCANNED或LOGGED_IN
+ ticket (string, required) - ticket 二维码中链接中后面的字符串

+ Header
+ Authorization: Bearer {clientToken}
+ Content-Type: application/json

+ Request (application/json)

{
"action":"SCANNED"
}

+ Response 201 (application/json)

{
"action":"SCANNED"
}


参考链接

流程概要

持续集成和持续交付是 DevOps 最核心的两个部分。

持续集成通过即时将最新的代码,集成到主干分支,并进行相关的测试(单元测试、集成测试等)和静态检查(代码格式,代码质量等),以期提早发现问题。

持续交付,在持续集成完成之后,即时生成生产环境可用的产物(如二进制文件、包、或者 Docker镜像),并准备随时部署,如果伴随着部署过程,则称为持续部署。

开发流程

  • 系统分析与设计:需求分析,架构设计,数据库设计等

  • 相关文档编写, 文档应与代码仓库一起

  • 系统开发

    • 持续集成 (gitlab-ci)
    • 格式检查和静态检查 (vscode, linter)
    • 数据库迁移 (migration)
    • 使用 Docker 搭建开发、测试和生产环境,docker-compose
    • Git开发流程 (git cz, master, branch )
    • 自动化测试:单元测试,HTTP测试(api测试),功能测试,基准测试 (ab)
    • 自动化部署(主备)(ngixn back)
    • 更新日志 (angular changelog)
    • crontab supervisord
  • 测试与验收

参考文档

0%