Appearance
Jenkins 自动化构建、部署范例
1. 命名规范
Jenkins Job、Rancher 工作负载、容器我们都定义了命名规范。后面请严格遵循命名规范。
2. 目录组织
dist/ # 静态资源产出目录
scripts/ # 构建脚本
check.sh # 代码规范检查
build.sh # 项目构建
docker-build.js # Docker 镜像构建
docker-publish.js # Docker 镜像发布
rancher-update.js # 开发环境、测试环境 Rancher 更新
shared.js # 共享工具类
Dockerfile # Docker 构建描述
.dockerignore # 一定要忽略掉 node_modules
3. 脚本示例
3.1 代码检查
#!/usr/bin/env bash
set -e
set -x
# 规范检查
env
node -v
npm i -g pnpm
pnpm -v
pnpm install
# 构建
pnpm run --if-present build
# 规范检查
pnpm wkstd gerrit-check
# 单元测试
pnpm run --if-present test
- 新项目推荐使用 pnpm
- 执行构建。确保每一个提交都能通过构建
- 使用 wkstd 进行自动化检查
- 如果有单元测试也在这里执行
3.2 代码构建
#!/usr/bin/env bash
set -e
set -x
# 容器构建
# 需要提供以下参数
# DOCKER_USER docker 用户
# DOCKER_PASSWORD docker 用户密码
if [ "$STAGE" = 'PRODUCTION' ]; then
export DOCKER_SERVER=ccr.ccs.tencentyun.com
else
export DOCKER_SERVER=172.26.59.200
fi
env
node -v
npm i -g pnpm
pnpm install
# 构建静态资源
pnpm build
# 构建镜像
node ./scripts/docker-build.js
# 发布
node ./scripts/docker-publish.js
# 触发 Rancher 更新
node ./scripts/rancher-update.js
- 要发布镜像需要提供
DOCKER_USER
、DOCKER_PASSWORD
registry 账密 - 通过
STAGE
来区分生产构建和测试环境构建 DOCKER_SERVER
表示镜像推送的服务器
4. Docker 构建、发布、Rancher 更新
Dockerfile 示例:
FROM wkfe/single
# 拷贝静态资源到 __entry__ 目录
COPY ./dist /data/source/__entry__
dss-ma-release
使用了 单应用运行容器。 对于微前端基座、子应用,可以参考微前端部署文档
4.1 shared.js
const pkg = require('../package.json');
const PRODUCTION = process.env.STAGE === 'PRODUCTION';
const NOW = new Date();
// 唯一的构建 ID
const BUILD_ID =
process.env.BUILD_ID ??
`${NOW.getFullYear()}${NOW.getMonth() + 1}${NOW.getDate()}${NOW.getHours()}${NOW.getMinutes()}`;
// 镜像名称
const DOCKER_IMAGE_NAME = pkg.imageName;
// 镜像版本
let DOCKER_VERSION = pkg.version;
if (!PRODUCTION) {
// 非正式版本使用 `-snapshot-BUILD`
DOCKER_VERSION = DOCKER_VERSION + `-snapshot-${BUILD_ID}`;
}
// Rancher 工作负载名称
const WORKLOAD = pkg.workload;
// 是否打上 latest 标签
const DOCKER_PUBLISH_LATEST = process.env.DOCKER_PUBLISH_LATEST !== 'false';
module.exports = {
DOCKER_IMAGE_NAME,
DOCKER_VERSION,
PRODUCTION,
WORKLOAD,
DOCKER_PUBLISH_LATEST,
};
这里主要构造了镜像名称和版本号。
4.2 docker-build.js
Docker 镜像构建
const { build } = require('@wakeadmin/docker-build');
const { DOCKER_IMAGE_NAME } = require('./shared');
build(DOCKER_IMAGE_NAME);
4.3 docker-publish.js
Docker 镜像发布
const { publish, clean } = require('@wakeadmin/docker-build');
const { DOCKER_IMAGE_NAME, DOCKER_VERSION, DOCKER_PUBLISH_LATEST } = require('./shared');
// 发布需要提供 DOCKER_USER、DOCKER_PASSWORD、DOCKER_SERVER 等环境变量
publish(DOCKER_IMAGE_NAME, DOCKER_VERSION, DOCKER_PUBLISH_LATEST);
clean(DOCKER_IMAGE_NAME);
4.4 rancher-update.js
Rancher 自动升级。
const { update } = require('@wakeadmin/docker-build');
const { PRODUCTION, WORKLOAD, DOCKER_IMAGE_NAME, DOCKER_VERSION } = require('./shared');
// Rancher 项目名称
const PROJECT = process.env.PROJECT;
if (!PRODUCTION && PROJECT) {
update(DOCKER_IMAGE_NAME, DOCKER_VERSION, {
project: PROJECT,
// Rancher 工作负载名称
workload: WORKLOAD,
});
}
WARNING
触发 Rancher 自动升级之前,Rancher 上应该已存在对应的工作负载。
5. Jenkins 配置示例
5.1 自动化检查 Job 创建
- 限制运行的节点。建议在 linux 下执行
- git 仓库配置,这里要从 Gerrit 拉取
- Gerrit 触发规则配置
- 执行
5.2 构建、发布 Job 创建
- 参数配置
分支:
构建目标环境:
Rancher 项目(用于开发、测试环境自动升级):
是否打上 latest 标签:
- Git 仓库配置
- Docker 发布账密
- 执行
6. Rancher 工作负载创建
- 创建工作负载
运行容器支持在部署时对应用进行配置, 比如上图,通过
MAPP_CDN_DOMAIN
配置了 cdnDomain 变量。- 配置 Ingress 负载均衡
dss-ma-release
的两个域名,都转发到刚才创建的工作负载中。