在开发开源项目中,通常会在gh-pages分支上放文档或者示例。如果每次都是手动更新很麻烦。使用travis进行持续集成自动部署就方便很多。

主要有两种方法实现,一种是使用github的Personal Access Token,另一种是使用SSH。

假设我们现在在github上有一个项目,接下来我们就一步一步实现使用travis自动部署到gh-pages分支。

这里不涉及具体如何写.travis.yml,可以参考官方文档或者自行搜索。

相同操作

两种方法都涉及一些相同的操作。

  1. 在travis官网上激活项目

    以github帐号登录travis官网,选择项目并激活。

  2. 安装travis客户端

    travis客户端是ruby包,使用gem进行安装

    $ gem install travis
    

    安装ruby可以参考之前的文章

  3. 登录travis

    使用github帐号登录travis

    $ travis login --org
    
  4. 创建一个空的.travis.yml文件

    $ touch .travis.yml
    

Token

  1. 生成token

    在github生成Personal access token,路径是Settings -> Developer Settings -> Personal access tokens

  2. 使用travis客户端加密token
     $ travis encrypt -r <github-user-name>/<repo-name> GH_TOKEN=<token> --add
    

    在项目根目录运行以上命令,加密token。运行完成后,.travis.yml中会添加全局变量secureGH_TOKEN

  3. .travis.yml中添加部署到gh-pages分支的脚本

    script:
    - cd examples
    - git init
    - git remote add origin https://<github-user-name>:${GH_TOKEN}@gihub.com/<github-user-name>/<ropo-name>.git
    - git add .
    - git commit -m 'Update examples'
    - git push -u -f origin master:gh-pages
    

    以上的实例把examples的内容推送到了gh-pages分支。需要注意的是如果已经存在remote,要先删除再添加带token的remote,因为我们无法控制travis中克隆时是否会带token。

SSH

  1. 生成SSH私钥公钥对,
    $ ssh-keygen -t rsa -C "<your_email@example.com>"
    

    注意不要passphrase,因为没有办法输入。

  2. 在github上添加SSH公钥

    添加路径是Settings -> SSH and GPG keys

  3. 使用travis客户端加密SSH私钥
    $ travis encrypt-file ~/.ssh/id_rsa --add
    

    这里以使用~/.ssh/id_rsa为例。运行完成后,当前路径下会生成加密文件id_rsa.enc,同时.travis.yml中的before_install会自动添加生成私钥的命令。

    不过1.8.8客户端有一个bug,生成的命令的-out选项的值多了一个\,这会导致报错:

     ~/.ssh/id_rsa: No such file or directory
    

    删掉多余的\就好了。已经向官方提了issue,期待下个版本解决。

  4. .travis.yml中添加部署到gh-pages分支的脚本

    before_install:
    - openssl aes-256-cbc -K $encrypted_xxx_key -iv $encrypted_xxx_iv
    -in bar_rsa.enc -out ~/.ssh/bar_rsa -d
     - chmod 600 ~/.ssh/bar_rsa
     - eval "$(ssh-agent -s)"
     - ssh-add ~/.ssh/bar_rsa
     - git config --global user.name <user-name>
     - git config --global user.email <email>
     - cd ~
     - git clone --depth=50  git@github.com:<gihub-user-name>/<repo-name>.git <dir-name>
     - cd <dir-name>
     - git checkout master
     script:
     - cd examples
     - git init
     - git remote add origin git@github.com:<github-user-name>/<repo-name>.git
     - git add .
     - git commit -m 'Update examples'
     - git push -u -f origin master:gh-pages
     after_success:
     - rm -rf ~/.ssh
    

参考