Travis CI 设置 Push 权限配置

要 Travis 向 Github 仓库 Push 的权限,需要由 SSH 协议机制来保证安全性。现在 Github 开放免费私有库使用,Travis Push 私有库通过 SSH 的方式比较方便安全。下面简单讲解一下如何配置。

基本原理

首先,了解一下 git 使用 SSH 协议向 Github 仓库 Push 时采用的 公钥加密 机制。

  1. Github 保存本机生成的 SSH公钥
  2. git 客户端发起 Push 请求,Github 接收到后向客户端发送一个随机字符串
  3. git 客户端接收到后,使用本地的 SSH私钥 对字符串进行加密,然后发送回 Github
  4. Github 使用存储的公钥对字符串进行解密,若和之前发送的字符串匹配,则验证通过。

在 Github 中,可以添加用户全局的公钥,对用户的所有仓库具有权限;也可以对每一个仓库单独设置公钥,使得该公钥只能在该仓库的验证步骤中生效,即后文我们会用到的 Deploy Key。

要使得 Travis 能够向 Github 推送,用户需要以某种形式把本地的 SSH私钥 发送给 Travis,直接发送显然是不安全的,于是 Travis 把用户的 SSH 私钥再次加密,然后每次在 CI 容器中解密私钥,再用私钥来完成推送前的验证步骤,加密私钥的过程可以通过其客户端 travis 来完成。

步骤概览

  1. 在 Github 上创建一个仓库;
  2. 为该仓库开启 Travis CI
  3. 本地生成公钥并添加到仓库的 Deploy Key;
  4. 克隆仓库到本地,并进入仓库目录;
  5. 使用 travis 客户端加密 SSH 私钥;
  6. 创建 CI 相关文件;
  7. 推送仓库,触发 CI 并完成配置。

下面对钥匙生成和添加、仓库克隆、加密私钥和配置文件进行详细说明。

钥匙生成

生成 RSA Key Pair(使用你的邮箱替换命令中的邮箱)

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

连续回车三次,会在 ~/.ssh/ 目录中生成密钥对,其中 ~/.ssh/id_rsa.pub 即是需要添加到仓库的 Deploy Key 的公钥。cat ~/.ssh/id_rsa.pub,然后选择并复制公钥内容,添加到仓库的 Deploy Key。

设置 Deploy Key 的页面为 https://github.com/<your name>/<your repo>/settings/keys,将 your nameyour name 分别替换为你的用户名和仓库名。注意需要选定 Allow Write Access,开启该公钥对仓库的写权限。

克隆仓库

$ git clone git@github.com:<username>/<reponame>.git

分别替换 <username><reponame> 为用户名和仓库名。

克隆完成后 cd 进入仓库目录。

加密私钥

首先安装 travis 客户端(假设系统已安装 Ruby)。

$ gem install travis

然后使用 Github 账户信息登录

$ travis login --com

创建 Travis CI 配置文件(空)

$ touch .travis.yml

登录成功以后使用

$ travis encrypt-file ~/.ssh/id_rsa --add

加密私钥并将加密信息添加到 .travis.yml。加密成功后 .travis.yml 文件内在before_install段应该有解密私钥的指令,其中解密过程用到的钥匙以环境变量的形式指定,该环境变量的值对其他用户是透明的,从而保证了安全性。

要注意这里,生成的命令的-out选项的值多了一个\,类似 -in ./id_rsa.enc -out ~\/.ssh/id_rsa -d,这会导致报错,要手工去掉。

配置文件

一个通常的实践是,创建多个 git 分支,在某些分支上修改,构建成功后集成到 master 分支。于是假设以下的示例流程:

  1. 创建一个 dev 分支,在 dev 分支上修改代码并推送;
  2. 触发 Travis 的构建程序;
  3. 若构建成功,将代码(或构建结果)推送到 master 分支。

创建 dev 分支

$ git checkout -b dev

.travis.yml 文件中 travis 自动添加的信息(before_install段)下面添加

- chmod 600 ~/.ssh/id_rsa
- eval "$(ssh-agent -s)"
- ssh-add ~/.ssh/id_rsa
- git config --global user.name "Travis Bot"
- git config --global user.email <your_email>@example.com
- cd ~
- git clone --depth=50 --branch=dev git@github.com:<username>/<reponame>.git build_dir
- cd build_dir
- git checkout -b master

script:
- bash -x ./compile.sh

after_success:
- git add --all
- git commit -m":black_nib:Updated By Travis"
- git push -u origin HEAD:master --force

branches:
  except:
    - master

branches:
  only:
    - dev

注意需要替换 user.email, <username>, <reponame> 等配置信息。

注意到 script 段中调用 compile.sh 脚本完成构建,因此需要创建一个 compile.sh 文件,在里面添加项目相关的构建代码。

完成之后初始推送,即可触发 Travis 的第一次构建。

$ git add --all
$ git commit -m"init"
$ git push origin dev

到 Travis 上看看,Travis 构建完成后 master 分支会在构建成功后由 Travis 的 Push 更新。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容

  • 敏捷开发 敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。 在敏捷开发中,软件项目在构建初期...
    null_fca6阅读 3,754评论 0 1
  • 作者: 阮一峰 编写代码只是软件开发的一小部分,更多的时间往往花在构建(build)和测试(test)。 为了提高...
    YichenWong阅读 3,308评论 1 5
  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,651评论 9 163
  • 前文 持续构建一直是比较热门的话题,通过持续集成可以自动编译、打包、签名项目,配合单元测试可以实现持续集成+自动化...
    lockefank阅读 4,641评论 2 0
  • 我是一个有私心的人,而且私心可大了。譬如,我就嫉妒富有的乡镇和村庄,为什么富有的不是我的村庄村民呢?!...
    木言的阅读 641评论 0 5