如何使用Travis CI对Github Organization下的代码进行持续集成

2,057 阅读4分钟

想到持续集成/持续部署,想必大家对免费开源工具 Travis CI 再熟悉不过了。Travis CI 对个人开源项目也支持比较友好,通过Github Token就可进行快速的CI/CD。

但有的时候,我们会在Github上创建 Github Organization 来作为一个团队,共同维护一个开源项目。在这种情况下,使用Travis CI进行持续集成就没有那么简单了。下面就小结下如何使用Travis CI对Github Organization下的代码仓库进行持续集成。

一、仓库同步

1.1 开启访问权限

在 github 上开启Travis CI应用的访问权限,操作流程如下:

  • 进入github的应用插件页面:github.com/settings/ap…

  • 点击Travis CI应用,并开启相应的Github Organizations的访问权限。

1.2 仓库同步

登录 https://travis-ci.com 网站(注意:是.com,不是.org),点击个人账号下的Settings按钮,进入设置页面。在该页面下可以点击 Sync account按钮,就可以同步我们在Github Organizations 中的代码仓库。

在同步代码仓库的过程中,会经常发现Travis CI一直处于同步的过程中。针对这个问题介绍个简单同步技巧:

通过Chrome提供的无痕浏览器重新登录Travis CI网站,再点击Sysc account,发现就可以立马同步成功了(不保证一定有效)。

二、安装 Travis CI 命令行客户端

安装过程详见官方链接

2.1 安装 ruby

brew install ruby

2.2 安装 Travis CI 命令行客户端

gem install travis

安装成功后,运行travis version命令,查看是否一切运行正常。

如果提示command not found: travis,则表示安装失败,此时可以进行下如下尝试:

  • 更新gem,然后重新运行安装命令。

gem update --system
gem install travis

2.3 登录 Travis CI 命令行客户端

travis login --com --github-token xxxxxxxxxxx

其中 github-token 需在 Git Settings 中点击Generate new token 来自动生成。

三、生成 SSH-KEY

  1. 通过命令 ssh-keygen 生成 SSH-KEY。可将生成的 SSH-KEY 存储到要进行持续集成部署的项目仓库目录下,但不要进行 Git 托管。

ssh-keygen -t rsa -b 4096 -C "xxxx@xxxx.com"

  1. 在相应的 Git 代码仓库上,将刚生成的公钥文件ssh.pub 添加至 Deploy Keys。

四、使用 Travis 客户端对私钥进行加密

加密流程详见官方链接

4.1 进入项目目录

进入要持续集成的项目仓库目录下,然后进行后续操作。否则后续加密流程会报如下错误:

Can't figure out GitHub repo name. Ensure you're in the repo directory, or specify the repo name via the -r option (e.g. travis -r /)

4.2 使用 travis 对私钥进行加密。

对私钥进行加密,ssh是刚才生成的私钥文件。

travis encrypt-file ssh

此时会提示当前仓库是否是要进行持续集成的仓库,如下所示,若是则输入 yes

Detected repository as Lagrange-Team/ii-ui, is this correct? |yes| yes

若操作无误,则会生成如下一段脚本:

openssl aes-256-cbc -K $encrypted_e8b9f665f844_key -iv $encrypted_e8b9f665f844_iv -in ssh.enc -out ssh -d

注:

若加密失败,并报如下错误:

repository not known to https://api.travis-ci.com/: 刚输入的仓库名

此时需查看下当前仓库名是否有输入错误或者远程仓库是否曾重命名过。针对这种情况,可查看当前目录下的.git/config文件,查看travis配置的仓库名是否正确。

[travis]
    slug = LagrangeLabs/ii-ui

若配置的仓库名有误,则直接进行修改,并重新保存即可。

4.3 加密文件添加Git管理

将加密后的私钥文件ssh.enc添加Git管理,并上传到代码仓库中。注意不要将生成的私钥文件ssh也添加至git仓库中。

五、添加部署脚本

5.1 配置.travis.yml

language: node_js
node_js:
  - stable
cache:
  directories:
    - node_modules

# 设置环境变量
env:
  matrix:
    - CI=true

script:
  # 默认运行编译脚本
  - npm run build-storybook

deploy:
  provider: script
  # Do not delete the build assets
  skip_cleanup: true
  script: bash scripts/deploy.sh
  on:
    # 当 master 有 push 的时候,触发 deploy 操作
    branch: master

5.2 创建部署脚本

在scripts目录下,创建部署脚本deploy.sh

#!/bin/sh
set -e

# setup ssh-agent and provide the GitHub deploy key
openssl aes-256-cbc -K $encrypted_fc7f0aafbcdc_key -iv $encrypted_fc7f0aafbcdc_iv -in config/travis/deploy.enc -out deploy -d

# 对解密后的私钥添加权限
chmod 600 deploy

# 启动 ssh-agent
eval "$(ssh-agent -s)"

ssh-add deploy

# 删除解密后的私钥
rm deploy

git config --global user.name 'Travis'  
git config --global user.email 'travis@travis-ci.com' 

# commit the assets in storybook-static/ to the gh-pages branch and push to GitHub using SSH
./node_modules/.bin/gh-pages -d storybook-static/ -b gh-pages -r git@github.com:${TRAVIS_REPO_SLUG}.git
  • -in config/travis/deploy.enc 表示加密后的私钥文件存放地址,可以修改成自己要存放的目录地址;
  • -out deploy 表示解密后的私钥文件,默认存放在当前根目录下,可修改成要存放的目录地址;
  • 由于使用了gh-pages进行发布部署,还需安装下依赖npm install -D gh-pages

注:

如果 OpenSSL 在解密的过程中,报出 iv undefined 错误,可以排查以下几个问题:

  • 查看下登录的 Travis 网址是否是 https://travis-ci.com,注意不能是https://travis-ci.org
  • 登录 Travis 客户端的时候,travis login --com后面的参数是--com,不是--org
  • 查看文件~/.travis/config.yml,看下当前仓库调用的是否是https://api.travis-ci.com/
repos:
  LagrangeLabs/ii-admin-base:
    endpoint: https://api.travis-ci.com/

至此,就完成了整个Travis CI的配置,接下来就可以开心玩耍了。