跳到主要内容

自定义存储插件配置

ohpm-repo从2.2.0版本开始支持自定义存储插件(需要配套使用1.7.0及以上版本ohpm命令行工具),允许您开发定制化的存储插件来对接您自己的存储系统,您希望将ohpm-repo下的三方包文件存储在华为云OBS或者其他云存储平台,可以按照如下步骤来实现自定义存储插件。

当您使用自定义存储插件对接自己的存储系统时,如果存在网络通信,建议使用https协议,确保信息安全传输。

准备工作

  1. 下载ohpm-repo私仓工具安装包并解压。
  2. 进入ohpm-repo部署根目录,把模板文件tsconfig.json 文件移动到ohpm-repo解压根目录。
  3. 建议将模板文件中CustomStorage.ts文件存入ohpm-repo解压根目录的plugins文件夹内。

编辑CustomStorage.ts文件,实现存储插件接口StoragePlugin

  • 打开CustomStorage.ts模板文件,需要编写代码实现接口类StoragePlugin,实现init, save, delete, download和getDownloadUrl五个基础函数,实现类CustomStorage的名字可自定义修改。
  • 当使用自定义存储插件时,db存储位置必须为MySQL

接口类StoragePlugin中包含如下五个函数,需要在实现类中完成功能的实现。

// 存储插件接口类定义如下
export interface StoragePlugin {

/**
* 初始化插件
*/
init(): Promise<void>;

/**
* 上传文件
* @param srcPath 上传文件的本地路径
* @param packageInfo: 待上传包的详细信息,包括包名(含组织名)和包版本号两部分,包名:packageInfo.packageName,包版本:packageInfo.version.
* @returns 响应的返回信息
*/
save(srcPath: string, packageInfo: any): Promise<string>;
/**
* 删除文件
* @param savedResponse 上传文件的响应值
* @returns 删除的结果:true表示删除成功
*/
delete(savedResponse: string): Promise<boolean>;

/**
* 获取已上传文件的数据
* @param savedResponse 上传文件的响应值
* @returns 获取文件的内容,数据格式为 Buffer
*/
download(savedResponse: string): Promise<Buffer>;

/**
* 根据保存文件生成的结果字符串,获取文件下载url
* @param savedResponse 保存文件的结果字符串
*/
getDownloadUrl(savedResponse: string): Promise<string>;
}
  1. init

    实现初始化准备工作。在配置文件config.yaml中store.config处可自定义一些插件所需要的参数信息,可通过函数getStorageConfigInfo()读取配置文件中自定义的参数信息。

  2. save

    实现本地文件的上传功能。返回值为一个字符串,能够标识所上传的文件。函数入参为上传文件的本地路径srcPath和待上传包的详细信息packageInfo,packageInfo为可选项。

    在实现save方法的时候,上传每一个三方包有三类文件待上传:

    • 包文件(har包有:<package_name>.har一个文件,tgz包有:<package_name>.har和<package_name>.hsp两个文件);
    • 元数据文件(metadata.json文件);
    • 文档文件(readme.md和changelog.md文件)。

    由于后面两类文件在每个三方包中名称都相同,请存放在不同位置或者使用不同文件名存储,避免文件被覆盖。

  3. delete

    实现已上传文件的删除功能。函数入参为savedResponse:上传文件save后的返回信息,通过入参信息定位已上传文件,进行文件的删除;返回值信息为删除的结果,布尔类型。

  4. download

    实现已上传文件的内容读取功能。函数入参为savedResponse:上传文件save后的返回信息,通过入参信息定位已上传文件,进行文件内容读取;返回所读取到的文件信息,数据类型为Buffer。

  5. getDownloadUrl

    实现已上传文件下载URL的获取。函数入参为savedResponse:上传文件save后的返回信息,通过入参信息定位已上传文件,进行文件内容读取;返回所读取到文件的下载URL,数据类型为String。

  1. 在实现上述五个函数时,插件文件CustomStorage.ts需要引用:StoragePlugin接口类和getStorageConfigInfo方法,故需要根据当前插件文件CustomStorage.ts所在位置,正确地书写引用地址,被引用的接口类和方法地址如下:
    • getStorageConfigInfo方法所在文件的位置:ohpm-repo解压根目录/libs/common/getStorageConfigInfo
    • StoragePlugin接口类所在文件的位置:ohpm-repo解压根目录/libs/plugins/storage/customStorage/StoragePlugin
  2. 如果插件文件CustomStorage.ts存储在默认位置(ohpm-repo解压根目录的plugins文件夹内),插件文件CustomStorage.ts中引用StoragePlugin类和getStorageConfigInfo方法的默认地址如下:
    • import {StoragePlugin} from '../libs/plugins/storage/customStorage/StoragePlugin';
    • import {getStorageConfigInfo} from '../libs/common/getStorageConfigInfo';

使用插件文件和启动ohpm-repo

  1. 安装必要的npm包

    安装typescript包,编译ts文件为js文件。

    $ npm i typescript -g
  2. 编译插件文件

    • 如果CustomStorage.ts存放在ohpm-repo安装根目录的plugins文件夹中,在ohpm-repo安装根目录下执行编译命令。

      $ tsc
    • 命令成功执行后会在ohpm-repo解压目录的plugins/outDir文件夹中生成编译后的文件CustomStorage.js。

      如果CustomStorage.ts没有存放在plugins内,请先修改tsconfig.json文件include和outDir参数,前者指定待编译插件代码的存储目录,后者指定编译完成后文件的输出位置,然后再在ohpm-repo解压根目录执行编译命令tsc。

      // tsconfig.json 文件中的默认配置
      // 默认值:插件存放在 ./plugins 中,编译后的文件存放在./plugins/outDir中
      "include": "plugins/*" // 插件文件的位置
      "outDir": "./plugins/outDir" // 编译后文件的存放位置
  3. 编译后文件存放指定位置

    编译后获得的CustomStorage.js需要与CustomStorage.ts保持在同一级目录中,否则会运行出错,默认输出在./plugins/outDir 内,需要把CustomStorage.js拷贝到CustomStorage.ts同级目录./plugins中(ohpm-repo成功启动后可删除CustomStorage.ts文件)。

  4. 编辑配置文件

    为了保证ohpm-repo能够正确加载自定义存储插件,需要修改配置文件config.yaml,主要涉及store处内容修改。

    // 配置文件中 store 项的格式参考
    store:
    type: custom
    config:
    export_name: CustomStorage
    plugin_path: plugins/CustomStorage.js
    custom_field: "test"
    #server: http://localhost:8088

    参数说明****:****

    • type: 插件名称,如果是自定义插件,值必须为:custom。
    • config: 插件配置项,具体为:
      • export_name: 必填,自定义插件文件CustomStorage.js中定义的实现类名称,如果实现类为CustomStorage,故此处export_name值为:CustomStorage。
      • plugin_path: 必填,编译后插件文件CustomStorage.js的存储位置。支持绝对路径和相对路径,相对路径的基准为ohpm-repo解压根目录。
      • custom_field: 选填,可配置多个,自定义名称和值,值的类型为字符串,方便在插件文件CustomStorage.ts中通过函数getStorageConfigInfo()进行读取。参考上述store项的格式,已添加配置参数custom_field,故getStorageConfigInfo()函数的返回结果中会包含与custom_field配置项同名的属性。
      • server: 选填项,仓库内容的下载地址,但当listen的host为0.0.0.0且本机存在多个网络接口时,则必须配置。
        • server的格式如下:<listen 的proto>://<host>:<listen 的port>
        • 当配置项listen的host不为0.0.0.0时,则server默认取listen的完整格式,例如listen为127.0.0.1:8088,故server默认值为http://127.0.0.1:8088
        • 当配置项listen的host为0.0.0.0时,如果本机仅存在一个网络接口,则server中的host默认为 本机网络接口的ipv4地址;如果本机存在多个网络接口,则server中的host默认为本机获取到的第一个网络接口的ipv4地址,建议手动修改host为指定的本机ip/域名,例如listen为0.0.0.0:8088,故server需配置为http://<本机ip/域名>:8088
        • 如果需要通过反向代理来访问ohpm-repo服务,则该字段须配置为反向代理服务器的域名地址。
  5. ohpm-repo服务部署

    在完成上述操作之后,按照ohpm-repo部署指导,完成服务部署。