Chart Releaser

我们已经有了一套的 Helm Charts ,想办法把他们串起来发布出去,此时想着可以使用 chart releaser 来实现了。

我们的仓库地址是:https://github.com/openimsdk/helm-charts/

我们来介绍两种工具

  • cr: https://github.com/helm/chart-releaser
  • ct: https://github.com/helm/chart-testing

CR

使用的工具 GitHub 地址:https://github.com/helm/chart-releaser

帮助将GitHub存储库转换为Helm Chart存储库

简称为 CR:cr-release-packages

cr 是一个工具,旨在帮助GitHub存储库自托管自己的图表存储库,方法是将Helm图表工件添加到以图表版本命名的GitHub发布版本中,然后为可以托管在GitHub Pages(或其他地方!)上的这些发布版本创建 index.yaml 文件。

安装

Binaries (recommended) 二进制文件(推荐)

从版本页面下载您的首选资产并手动安装。

$ brew tap helm/tap
$ brew install chart-releaser

目前, cr 可以从打包到目录中的一组图表创建GitHub Releases,并从GitHub Releases为图表存储库创建 index.yaml 文件。

❯ cr

Create Helm chart repositories on GitHub Pages by uploading Chart packages
and Chart metadata to GitHub Releases and creating a suitable index file

Usage:
  cr [command]

Available Commands:
  completion  Generate the autocompletion script for the specified shell
  help        Help about any command
  index       Update Helm repo index.yaml for the given GitHub repo
  package     Package Helm charts
  upload      Upload Helm chart packages to GitHub Releases
  version     Print version information

Flags:
      --config string   Config file (default is $HOME/.cr.yaml)
  -h, --help            help for cr

Use "cr [command] --help" for more information about a command.

解析可以用的命令:

  • completion 生成指定 shell 的自动补全脚本。这有助于在使用 cr 命令时自动提示可用的命令和参数。
  • help 提供关于任何命令的帮助信息。
  • index 为给定的 GitHub 仓库更新 Helm 仓库的 index.yaml 文件。这个文件是 Helm 仓库的索引,包含了仓库中所有图表的信息。
  • package 打包 Helm 图表。这个过程通常涉及将图表源代码(通常是一组 YAML 文件)打包成一个压缩文件,以便发布和分发。
  • upload 将 Helm 图表包上传到 GitHub Releases。这是将 Helm 图表发布到 GitHub 仓库的一种方式。
  • version 打印 cr 工具的版本信息。

从Helm Chart软件包创建GitHub版本

扫描Helm chart包的路径,并在指定的GitHub存储库中创建发布,上传包。

$ cr upload --help
Upload Helm chart packages to GitHub Releases

Usage:
  cr upload [flags]

Flags:
  -c, --commit string                  Target commit for release
      --generate-release-notes         Whether to automatically generate the name and body for this release. See https://docs.github.com/en/rest/releases/releases
  -b, --git-base-url string            GitHub Base URL (only needed for private GitHub) (default "https://api.github.com/")
  -r, --git-repo string                GitHub repository
  -u, --git-upload-url string          GitHub Upload URL (only needed for private GitHub) (default "https://uploads.github.com/")
  -h, --help                           help for upload
  -o, --owner string                   GitHub username or organization
  -p, --package-path string            Path to directory with chart packages (default ".cr-release-packages")
      --release-name-template string   Go template for computing release names, using chart metadata (default "{{ .Name }}-{{ .Version }}")
      --release-notes-file string      Markdown file with chart release notes. If it is set to empty string, or the file is not found, the chart description will be used instead. The file is read from the chart package
      --skip-existing                  Skip upload if release exists
  -t, --token string                   GitHub Auth Token
      --make-release-latest bool       Mark the created GitHub release as 'latest' (default "true")
      --packages-with-index            Host the package files in the GitHub Pages branch

Global Flags:
      --config string   Config file (default is $HOME/.cr.yaml)

从GitHub Releases创建存储库索引

上传后,您可以创建一个可以托管在GitHub Pages(或其他地方)上的 index.yaml 文件。

$ cr index --help
Update a Helm chart repository index.yaml file based on a the
given GitHub repository's releases.

Usage:
  cr index [flags]

Flags:
  -b, --git-base-url string            GitHub Base URL (only needed for private GitHub) (default "https://api.github.com/")
  -r, --git-repo string                GitHub repository
  -u, --git-upload-url string          GitHub Upload URL (only needed for private GitHub) (default "https://uploads.github.com/")
  -h, --help                           help for index
  -i, --index-path string              Path to index file (default ".cr-index/index.yaml")
  -o, --owner string                   GitHub username or organization
  -p, --package-path string            Path to directory with chart packages (default ".cr-release-packages")
      --pages-branch string            The GitHub pages branch (default "gh-pages")
      --pages-index-path string        The GitHub pages index path (default "index.yaml")
      --pr                             Create a pull request for index.yaml against the GitHub Pages branch (must not be set if --push is set)
      --push                           Push index.yaml to the GitHub Pages branch (must not be set if --pr is set)
      --release-name-template string   Go template for computing release names, using chart metadata (default "{{ .Name }}-{{ .Version }}")
      --remote string                  The Git remote used when creating a local worktree for the GitHub Pages branch (default "origin")
  -t, --token string                   GitHub Auth Token (only needed for private repos)
      --packages-with-index            Host the package files in the GitHub Pages branch

Global Flags:
      --config string   Config file (default is $HOME/.cr.yaml)

Docker镜像被推送到 helmpack/chart-martaser Quay容器注册表。Docker镜像构建在Alpine之上,其默认入口点是 cr 。有关更多详细信息,请参阅Dockerfile。

Usage 使用

以下是您必须运行的三个命令,以使图表最终托管在Github页面的根目录中并可访问:

cr package <chart>
cr upload --owner <owner> --git-repo <repo_name> --packages-with-index --token <token> --push --skip-existing

不要忘记在upload命令中使用 --skip-existing 标志,以避免出现 422 Validation Failed 错误。

cr index --owner <owner> --git-repo <repo_name>  --packages-with-index --index-path . --token <token> --push

例如

在仓库的根目录中使用testChart helm chart:

cr package testChart/

如果你将在中获得 .tgz/cr-release-pacakges

那么你要执行下面两个命令:

cr upload --owner <owner> --git-repo <repo_name> --packages-with-index --token <token> --push --skip-existing

cr index --owner <owner> --git-repo <repo_name>  --packages-with-index --index-path . --token <token> --push

你应该在你的github-pages分支的根目录中获得你的图表和 .tgz 的版本。

使用引用每个图表和这些图表的每个不同版本的 index.yaml

配置

cr 是一个命令行应用。所有命令行标志也可以通过环境变量或配置文件设置。环境变量必须以 CR_ 为前缀。必须使用下划线而不是连字符。

CLI标志、环境变量和配置文件可以混合使用。以下优先顺序适用:

  1. CLI标志
  2. 环境变量
  3. Config文件

Examples

下面的示例显示了配置同一事物的各种方法:

CLI

cr upload --owner myaccount --git-repo helm-charts --package-path .deploy --token 123456789

环境变量

export CR_OWNER=myaccount
export CR_GIT_REPO=helm-charts
export CR_PACKAGE_PATH=.deploy
export CR_TOKEN="123456789"
export CR_GIT_BASE_URL="https://api.github.com/"
export CR_GIT_UPLOAD_URL="https://uploads.github.com/"
export CR_SKIP_EXISTING=true

cr upload

--package-path string is Path to directory with chart packages (default .cr-release-packages)

Config文件

config.yaml:

owner: myaccount
git-repo: helm-charts
package-path: .deploy
token: 123456789
git-base-url: https://api.github.com/
git-upload-url: https://uploads.github.com/

配置使用

cr upload --config config.yaml

cr 支持Viper可以读取的任何格式。e. JSON、TOML、YAML、HCL和Java属性文件。

请注意,如果没有指定配置文件,则从当前目录加载 cr.yaml (或任何支持的格式),如果找到,则按此顺序加载 $HOME/.cr/etc/cr

CT

ct 是测试Helm Charts的工具。它旨在用于linting和测试pull请求。它自动检测针对目标分支更改的图表。

安装

建议使用提供的Docker镜像,该镜像可以在Quay上找到。它配备了所有必要的工具安装。

上手

下面的例子显示了配置同一件事的各种方法:

With remote repo:

ct install --remote upstream --chart-dirs stable,incubator --build-id pr-42

本地回购:

如果您在当前目录中有一个图表,并且ct安装在主机上,那么您可以运行:

ct install --chart-dirs . --charts .

使用Docker时,它可以使用:

docker run -it --network host --workdir=/data --volume ~/.kube/config:/root/.kube/config:ro --volume $(pwd):/data quay.io/helmpack/chart-testing:v3.7.1 ct install --chart-dirs . --charts .

请注意, workdir param很重要,必须与挂载的卷相同。

环境变量

export CT_REMOTE=upstream
export CT_CHART_DIRS=stable,incubator
export CT_BUILD_ID

ct install

Config文件

config.yaml:

remote: upstream
chart-dirs:
  - stable
  - incubator
build-id: pr-42

配置使用

ct install --config config.yaml

ct 支持Viper可以读取的任何格式。e. JSON、TOML、YAML、HCL和Java属性文件。

请注意,如果没有指定配置文件,则从当前目录加载 ct.yaml (或任何支持的格式),如果找到,则按此顺序加载 $HOME/.ct/etc/ct

使用私有图表存储库

在添加chart-repos时,您可以在每个repo的基础上使用 helm-repo-extra-argshelm repo add 命令指定其他参数。您还可以指定OCI注册表,这些注册表将使用 helm registry login 命令添加,它们也支持 helm-repo-extra-args 进行身份验证。例如,这可以用于验证私有图表存储库。

config.yaml:

chart-repos:
  - incubator=https://incubator.io
  - basic-auth=https://private.com
  - ssl-repo=https://self-signed.ca
  - oci-registry=oci://nice-oci-registry.pt
helm-repo-extra-args:
  - ssl-repo=--ca-file ./my-ca.crt
ct install --config config.yaml --helm-repo-extra-args "basic-auth=--username user --password secret"

OpenIM Helm Charts 的 CICD 设计

OpenIM 的 CICD 设计使用了上续的 ct 和 cr 的工具,目录设计主要是三个部分:

+ .github/config/ # 存放配置文件 包括 ct 和 cr 的配置文件
+ scripts/ # 存放本地和其他的自动化脚本