Release 自动更新 Krew Index

前面介绍过创建 Krew 插件的方法,其中生成插件描述文件的部分,可以说是又直接又麻烦,而且每次发布的时候,都要重新生成并刷新 Krew Index,于是我写了个脚本,可以根据既有信息和已经发布的二进制文件生成 YAML 文件。这个脚本的功能,简单说就是写一个 YAML 模板,然后下载二进制文件,计算哈希,生成最终的插件描述文件,把描述文件覆盖旧版本,然后发布 PR 即可。有了脚本之后其实还是挺麻烦的,不过在浏览 Krew 文档时发现有一节 Automating plugin updates ,其中提到了可以使用 Krew Release Bot 来自动地完成这个过程,官方强烈推荐使用这个 Bot 进行更新,理由是该 Bot 生成清单文件后自动提交的 PR,如果其中包含的变更内容只是简单的版本升级,能够被 Krew Index 的 Bot 自动处理,免除人工环节之后,整个更新过程可以在几分钟之内完成,避免了新版本二进制无法及时更新的尴尬。下面就介绍一下这个 Bot 的用法。

这个 Bot 是一个 Github Action 的插件,其工作原理和之前的脚本类似,在前文用 Github Action 自动发布二进制包中,在 Karmada 项目 里使用 Github Action 进行了二进制文件的构建和发布,接下来继续使用这个基础,根据新发布的二进制来更新 Krew Index。

要在项目里使用 Krew Release Bot,首先要求项目插件已经成功发布到 Krew Index 中;接下来,需要生成一个文件 .krew.yaml,作为 Bot 的模板,这个模板和 Krew Index 的 YAML 是基本一致的,不过其中的二进制 URL 和 Hash 部分被替换为模板的占位符,例如 {{addURIAndSha "https://github.com/karmada-io/karmada/releases/download/{{ .TagName }}/kubectl-karmada-darwin-arm64.tgz" .TagName }},甚至连这一步简单操作,Bot 作者也帮你解决了——他做了一个 Krew Release Bot Helper,在输入框输入已发布的 Karmada 插件名称,就可以自动生成 YAML 模板,放到项目里就可以了。

接下来,在 Release Action 里面加入如下语句:

- name: Update new version in krew-index
  uses: rajatjindal/krew-release-bot@v0.0.40

提交代码之后,创建一个新的 Release,会发现 Action 失败了,错误信息大概如下:

error

原因在于前面使用的 Matrix,我们的 PR 应该在生成并上传所有的二进制文件之后才能发起,所以改成这样:

  update-krew-index:
    needs: release-assests
    name: Update krew-index
    runs-on: ubuntu-18.04
    steps:
    - uses: actions/checkout@master
    - name: Update new version in krew-index
      uses: rajatjindal/krew-release-bot@v0.0.40

这里用了一个新的 job,使用 needs 关键字明确指出,需要等待 release-assests 任务完成。

再次提交,并创建 Tag,创建 Release。Action 运行示意图如下:

follow

这里生成的 URL 所指向的二进制文件是无法访问的,因此还是无法成功,但如果是官方自行发布的话,就可以了,而且如上文所说,这样生成的 PR 会在几分钟之内得到 Approve。

读到这里会产生一个问题,会不会有人冒充发表呢?应该是不会的:Krew index 项目的 PR 机器人会对新 PR 的差异进行判定,如果不是典型的版本更新,会转入人工通道,因此新发的 PR 必须是和上一个版本具备这样的差异关系,而且必须是基于官方的二进制发布,才能够得到自动审批,因此完全可以放心使用。

comments powered by Disqus
下一页
上一页

相关