Skip to content

Jenkins 自动化构建、部署范例






TIP

推荐使用我们提供的项目脚手架来创建项目:

$ pnpm create wakeadmin



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






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





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 创建

    1. 限制运行的节点。建议在 linux 下执行



    1. git 仓库配置,这里要从 Gerrit 拉取



    1. Gerrit 触发规则配置



    1. 执行






5.2 构建、发布 Job 创建

    1. 参数配置

    分支:


    构建目标环境:


    Rancher 项目(用于开发、测试环境自动升级):


    是否打上 latest 标签:




    1. Git 仓库配置



    1. Docker 发布账密



    1. 执行





6. Rancher 工作负载创建


    1. 创建工作负载

    运行容器支持在部署时对应用进行配置, 比如上图,通过 MAPP_CDN_DOMAIN 配置了 cdnDomain 变量。



    1. 配置 Ingress 负载均衡

    dss-ma-release 的两个域名,都转发到刚才创建的工作负载中。




客户经营,找惟客