更简单地用Travis自动发布GitHub Releases

GitHub每次打Tag时,都会在项目首页的releases那里增加。 Tag是Git的概念,除此之外,GitHub还特有Release(发布)这个概念。 基于Tag,Release除了既有的源码压缩包以外,还可以新增其它发布文件、撰写标题与说明。

TravisGitHub上最流行的CI服务,开源免费。 孤一年前曾撰文《从Travis回GitHub》,描述如何配置Travis,让其自动根据Tag,发布文件到GitHub Release。

本文介绍一种更简单的办法。

预备

这种方法需要已经安装travis.rb。 这是Travis的CLI客户端,用Ruby写的。 安装方法,大致如下,详见官方文档

gem install travis -v 1.8.8 --no-rdoc --no-ri

在不知道什么版本起,这个CLI有了setup这个子命令,可以自动生成一些.travis.yml文件的片段。 本文介绍的方法,就是基于这个子命令,可以省去很多人工操作。 为了确保没有版本问题,建议在使用前,先升级travis.rbv1.8.8

实战样例

输入travis setup releases,并且根据提示,依次输入GitHub账户、密码、需要上传的文件等信息。 以下以孤在yanqd0/docker-hugo中的配置为例,展示过程与结果。

$ travis setup releases
Username: yanqd0
Password for yanqd0: ****************
File to Upload: Dockerfile
Deploy only from yanqd0/docker-hugo? |yes| yes
Encrypt API key? |yes| yes

完成后,即可在.travis.yml文件,得到以下代码片段。

deploy:
  provider: releases
  api_key:
    secure: jm5XX...
  file: Dockerfile
  on:
    repo: yanqd0/docker-hugo

这个工具有两点不好。 一是会自动格式化整个.travis.yml文件,造成排版、版本管理问题。 这一点可以通过三个步骤,简单修复。

  1. 保存以上代码片段
  2. git checkout .travis.yml
  3. 再把代码片段复制回去

第二个问题是,没有自动配置tags: true。 孤习惯在打Tag时做发布,而不是每次提交时。 所以,只能把它手动添加到on:里去。

  ...
  on:
    repo: yanqd0/docker-hugo
    tags: true

一个小坑

要注意,如果此前设置过CI的分支限制,tags: true不会生效。 因为,对Travis来说,Tag也算是一种branch。

branches:
  only:
    - master

去掉以上代码块,否则自动发布将不会执行。

原理简介

travis setup releases的原理是,利用GitHub的账户密码,生成一个access token。 如本例,就叫automatic releases for yanqd0/docker-hugo — public_repo。 与直接配置账户与(加密后的)密码在.travis.yml相比,用token会更安全。 前者拥有所有权限,而后者仅有公开库的访问权限。

得到这个token后,travis.rb自动将其加密,并配置到.travis.yml中。

自动配置后的格式化,也有玄机。 travis.rb并非简单地将其写到文件最后,而是通过解析YAML的方式,插入其中,整个文件会被重写。 如果有其它多个deploy配置,这个命令并不会导致错误。

在GitHub上,这条命令执行后,会新增一个token, 可以在【Settings】【Personal access tokens】这个页面查看。

默认情况下,自动发布的标题是Tag名,描述是Tag的描述。 虽然显示效果比较差,但看在是自动发布的份上,在本例勉强可以接受。

参考


相关笔记