发布管理-持续交付
立即解锁
发布时间: 2025-08-25 01:31:15 阅读量: 4 订阅数: 5 

### 发布管理 - 持续交付
#### 1. 与统计数据对抗
软件发布管理一直是软件开发中比较繁琐的部分。通常是不同团队(运维、管理、开发等)聚在一起,详细规划如何部署公司某个应用的新版本。这往往是个重大事件,常安排在凌晨4点进行,而且结果是二元的:要么成功发布新版本,要么失败并回滚。
在这类部署中,压力和紧张是常见的,而且我们还得与统计数据“对抗”。当创建部署计划时,我们构建的是一个串联系统,即一系列有限的步骤来更新系统,例如:
1. 将JAR文件复制到服务器
2. 停止旧的Spring Boot应用
3. 复制属性文件
4. 启动新的Spring Boot应用
若其中任何一步失败,整个系统就会失败,这就是串联系统。假设每个步骤的失败率为1%,看似可以接受,但当它们串联起来时情况就不同了。例如一个有10个步骤的部署,每个步骤成功率为99%(可靠性为0.99),那么整个系统的可靠性为:
```plaintext
(0.99)^10 = 0.9043
```
这意味着系统的成功率为90.43%,即失败率为9.57%。与单个步骤1%的失败率相比,情况发生了巨大变化,几乎每10次部署就有1次会失败。为降低风险,我们可以采用金丝雀部署和蓝绿部署这两种概念,后续会研究如何在Kubernetes中使用它们来降低部署失败的风险和传统软件开发中重大发布带来的压力。
#### 2. 测试系统
为构建持续交付管道,需要一个测试系统。这里使用的是Chronos系统,其目的与时区和日期格式管理相关。该系统包含三个服务:
- API聚合器
- 将时间戳转换为ISO格式日期的服务
- 将时间戳转换为UTC格式日期的服务
这些服务协同工作,将时间戳转换为不同格式的日期,并且可以通过聚合更多服务来扩展功能,并通过API聚合器对外暴露。每个服务会打包成不同的Docker镜像,在Kubernetes中作为Deployment部署,并通过服务(外部和内部)向集群和外部世界暴露(API聚合器可对外)。
##### 2.1 ISO日期和UTC日期服务
- **ISO日期服务**:接收时间戳并返回ISO格式的日期。代码如下:
```javascript
const Hapi = require('hapi')
const server = new Hapi.Server()
const moment = require('moment')
server.connection({port: 3000})
server.route({
method: 'GET',
path: '/isodate/{timestamp}',
handler: (request, reply) => {
reply({date: moment.unix(request.params.timestamp).toISOString()})
}
})
server.start((err) => {
if (err) {
throw err
}
console.log('isodate-service started on port 3000')
})
```
对应的`package.json`文件如下:
```json
{
"name": "isodate-service",
"version": "1.0.0",
"description": "ISO Date Service",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"author": "David Gonzalez",
"license": "ISC",
"dependencies": {
"hapi": "^15.2.0",
"moment": "^2.15.1"
}
}
```
Dockerfile如下:
```plaintext
FROM node:latest
RUN mkdir /app/
WORKDIR /app/
COPY . /app/
RUN npm install
EXPOSE 3000
CMD ["npm", "start"]
```
构建和测试步骤如下:
1. 构建Docker镜像:
```plaintext
docker build . -t iso-date-service
```
2. 运行镜像:
```plaintext
docker run -it -p 3000:3000 iso-date-service
```
3. 测试:
```plaintext
curl http://localhost:3000/isodate/1491231233
```
- **UTC日期服务**:与ISO日期服务类似,但代码和接口不同。代码如下:
```javascript
const Hapi = require('hapi')
const server = new Hapi.Server()
const moment = require('moment')
server.connection({port: 3001})
server.route({
method: 'GET',
path: '/utcdate/{timestamp}',
handler: (request, reply) => {
let date = moment.unix(request.params.timestamp).utc().toISOString().substring(0, 19)
reply({date: date})
}
})
server.start((err) => {
if (err) {
throw err
}
console.log('isodate-service started on port 3001')
})
```
`package.json`文件如下:
0
0
复制全文
相关推荐









