you are better than you think

github runner改造日记

· by thur · Read in about 2 min · (231 Words)
github action github runner goreleaser

自动化还是自动化

周五下午跟客户开完例会,稍微梳理了一下这周的需求,发现本周开源版和企业版都发布了很多版本。这里面包含我一直拖着没做的自动化环节。模块发布流程:

  1. 打tag -> 触发github action -> goreleaser -> github scm / docker hub;
  2. 镜像也是需要上传到国内公有云镜像市场的,方便交付同事交付;
  3. 二进制包需要上传到公有云存储,方便交付客户和国内社区用户下载。

这里第一步完全是自动化的,第二步之前也是goreleaser来做得,但是呢github推镜像到国内的云镜像市场,那个时间瞬间就是小时起步了。通过测试发现办公网推国内的镜像市场非常快, 那就从免费的github runner 迁移到办公网内的台式机上。这一步其实需要很扎实的网络来保证跟github的通信, 不过这个改造后步骤1的时间降到了8分钟, 那这些工作就很值了。为了避免直接物理机上做一些骚操作,搞了一个runner的容器镜像。 如何构建镜像见https://github.com/kongfei605/github-runner

第3步平时都是人工去github release页面, 点击下载,然后再用我自己封装了S3秘钥的脚本去上传,再把下载链接 文件名 MD5信息格式化输出,将格式化内容复制到另一个仓库,利用Jenkins发到官网上。

我们把脚本梳理一下,秘钥信息放到github secrets, 然后上传到S3的流程做成一个job,就又向前进了一步。这里有个有趣的小插曲,我查看goreleaser文档时,开源版的goreleaser只支持全局的before hooks,不支持after hooks。

before:
  # Templates for the commands to be ran.
  hooks:
  - make clean
  - go generate ./...
  - go mod tidy
  - touch {{ .Env.FILE_TO_TOUCH }}

Pro版本的全局hook 做了更精细化的支持,比如支持env , 是否输出output, if判断等等。

# global before hooks
before:
  # Commands to be ran.
  #
  # Templates: allowed.
  hooks:
  - make clean # simple string
  - cmd: 'go generate ./...' # specify cmd
  - cmd: 'go mod tidy'
    # Always prints command output.
    output: true
    # Specify directory.
    dir: ./submodule # specify command working directory
  - cmd: 'touch {{ .Env.FILE_TO_TOUCH }}'
    # Specify extra environment variables.
    env:
    - 'FILE_TO_TOUCH=something-{{ .ProjectName }}' # specify hook level environment variables
  - cmd: 'dotnet tool install --global wix'
    # Make the hook optional:
    # Since: v2.7.
    if: '{{ eq .Runtime.Goos "windows" }}'

# global after hooks
after:
  # Commands to be ran.
  #
  # Templates: allowed.
  hooks:
  - make clean
  - cmd: cat *.yaml
    dir: ./submodule
  - cmd: touch {{ .Env.RELEASE_DONE }}
    env:
    - 'RELEASE_DONE=something-{{ .ProjectName }}' # specify hook level environment variables
  - cmd: 'rm -rf ./something'
    if: '{{ eq .Runtime.Goos "linux" }}'

goreleaser真的是产品细节思考很清楚了。 不过我们的需求就是全局支持after hooks, 把下载链接、MD5 文件名格式化输出出来就行。 简单粗暴有效,基于开源版的修改见这个PR 把这个goreleaser替换到runner镜像中就行。

基础打好之后,修改.goreleaser.yaml 把after hooks配置好

after:
  hooks:
    - sh -c "chmod +x ./scripts/tencent_s3_upload.sh && ./scripts/tencent_s3_upload.sh"

不能自动化是万恶之源,下一步用工作流来搞定格式化输出到官网发布。

Comments