流水线任务每次运行时,会调度一个全新的实例。用户需要拉取用于构建的代码以及构建所需要的依赖。拉取依赖的时间过久,会导致流水线任务执行出现构建慢或超时失败等问题。社区提供基于对象存储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}