流水线任务每次运行时,会调度一个全新的实例。用户需要拉取用于构建的代码以及构建所需要的依赖。拉取依赖的时间过久,会导致流水线任务执行出现构建慢或超时失败等问题。社区提供基于对象存储OSS实现的缓存插件,用于解决拉取依赖慢、构建超时等问题。本文介绍如何基于OSS缓存插件加速构建。
缓存插件使用
Serverless-cd社区提供缓存插件,并针对Serverless应用中心的特性进行优化,用户只需指定用于缓存存储的OSS Bucket,即可使用缓存插件。缓存插件会在指定或默认的OSS Bucket中,按照指定的Key检索读取并更新缓存内容。
插件执行完毕时,如果缓存Key命中,则缓存Key对应的文件内容将会被下载到本地指定路径。
引擎执行完毕时,本地指定路径的文件内容,将被上传至OSS Bucket。
在执行上下文中定义OSS缓存配置
在流水线、流水线模板或任务模板中,均可以在执行上下文中定义OSS缓存配置。示例如下。
---
# 提交流水线执行
kind: Pipeline
name: "p-<% .git.shortCommitId %>-<% .currentTimestampMs %>"
# 描述信息
description: cached pipeline
spec:
context:
data:
# 应用中心缓存配置,如果不提供,engine会自动在任务节点调度的地域初始化
# 默认的Bucket名称为: serverless-cd-cache-${region-id}-<% .accountId %>。
cacheConfig:
# 采用OSS作为缓存,如果不指定,平台会自动初始化
# 建议交给平台自动初始化,因为工作节点可能被调度到与指定OSS不同的地域
# 对于GitHub的代码仓库,工作节点以及对应的OSS Bucket在新加坡区地域(ap-southeast-1)
# 对于GitLab、Codeup、Gitee的代码仓库,工作节点以及对应的OSS Bucket在杭州地域(cn-hangzhou)
oss:
# 用于缓存的BucketName,如果不存在,engine不会自动初始化
bucketName: serverless-cd-cache-ap-southeast-1-<% .accountId %>
# Bucket所在的地域,不建议跨地域拉取缓存
regionId: ap-southeast-1
templateName: mytemplate-<% .git.branch %>
---
在Steps中使用缓存插件
在流水线模板或任务模板中,可以通过执行上下文Steps,使用缓存插件。需要特别指出的是,credentials
信息可以不指定,插件会自动使用用户为应用中心授权的角色权限。示例如下。
---
kind: PipelineTemplate
name: mytemplate-<% .git.branch %>
description: cached pipelinetemplate
spec:
context:
data:
envName: test
deployFile: s.yaml
tasks:
# 构建前检查
- name: pre-check
context:
data:
displayName: "前置检查"
enable: true
steps:
- plugin: "@serverless-cd/checkout"
- plugin: "@serverless-cd/s-setup"
- run: s plan --local -o json
taskTemplate: serverless-runner-task
runAfters: []
- name: pre-check-approval
context:
data:
dingdingNotification:
enable: false
enable: true
taskTemplate: need-approval
runAfters:
- name: pre-check
# 构建并部署
- name: build-and-deploy
context:
data:
enable: true
steps:
- plugin: "@serverless-cd/checkout"
- plugin: "@serverless-cd/s-setup"
- plugin: "@serverless-cd/cache"
inputs:
# 定义缓存的唯一标识符,可以将其与应用或Git版本等信息关联起来
# 也可以使用"cache-${{hashFile('./package.json')}}"
# 通过本地文件的散列值计算缓存的唯一标识符
# 缓存在Bucket中对应的文件路径是cache-home/${key},例如本示例
# 在Bucket中缓存路径为cache-home/cache-<% .appName %>
key: "cache-<% .appName %>"
# 按照当前构建的工具要求,配置缓存的路径
# 例如,对于Node.js,可以将默认的~/.npm作为流水线应用缓存的路径
path: ~/.npm
# 执行s-deploy
- run: |
set -e
s deploy -t --use-local --assume-yes --skip-push
echo "Deploy by Serverless Devs success."
taskTemplate: serverless-runner-task
runAfters:
- name: pre-check-approval
---
缓存路径
对于不同的构建工具,实际需要配置的缓存路径可能不同。具体可以按下表或对应的工具说明来判断。
管理工具 | 缓存路径 |
Maven | ~/.m2 |
Gradle | ~/.gradle |
NPM | ~/.npm |
Yarn | ~/.yarn |
gomod | $GOPATH/pkg/mod |
其他缓存(包括pip3) | ~/.cache |
本地制作缓存
如果构建依赖源服务性能过差,或由于安全问题无法从云上拉取到相关依赖,可以结合ossutils工具。利用本地开发机的缓存内容,上传一份缓存到对象存储OSS,并在流水线中使用。
您也可以登录对象存储OSS控制台,将本地的缓存,例如~/.npm
,上传至对象存储OSS对应的路径。
示例如下。
# 使用ossutils制作用于云上构建的缓存,将本地的npm缓存拷贝至对象存储OSS
# 自动创建的Bucket,对应的URL为serverless-cd-${region-id}-cache-${uid}.oss-${region-id}.aliyuncs.com
# 对于GitHub上的代码仓库,工作节点以及对应的OSS Bucket应该部署在新加坡区地域(ap-southeast-1)
# 对于GitLab、Codeup、Gitee上的代码仓库,工作节点以及对应的OSS Bucket应该部署在杭州地域(cn-hangzhou)
./ossutil64 cp -r ~/.npm oss://${bucket_url}/cache-home/${cache_key}