如果不用Travis做自动打包,以下是你用户的体验:
- 使用官方自带版本 -> 可能已经是几周前的版本
- 自己下载源码编译 -> 毕竟不是所有人都是Golang用户, 部署go需要很久
- 最后都能变成 -> 再见Terraform
Travis不一定是最全能的,目前来看至少应该是跟github衔接最无缝的,
也就是说很可能你都感受不到CI是在工作的
1. 通用流程 -> 如果你的场景很简单,这么做够了
# 回头补,这个教程很多,今天先记录一下踩过的坑
2. 我踩过的坑
2.1 我如何操作组织的项目
问题背景: 我想将组织下的项目关联上 Travis
操作步骤:首先点击左下角的Organizations, 接着右边会出现这个组织对应的项目,但是有时候这里显示的不全,可能你的组织里有5个项目,实际这里只出现了三个。 这个问题出现的原因是因为Travis没有组织所有项目的权限。
点击右下角的Manage Repo on Github, 如果你在组织中是管理者的权限,你就会直接来到Github上的代码仓库权限管理,添加对应仓库的权限保存
当然如果你不是组织的管理者,只是开发者的一员,你可能需要申请这样的权限,点击一下灰色的Request,就会发出申请,变成红色的Cancel Request, 等待管理员审核
2.2 什么是Travis官网啊?
- 可以是 travis-ci.org
- 也可以是 travis-ci.com
问题的错误描述: The following repositories cannot be migrated to travis-ci.com at this time because they are currently active on our legacy platform travis-ci.org.
这个问题的背景: 我这个项目是fork来的
这个问题的起因: 我进了 travis-ci.com, 尝试为我的项目启用travis,启用时出现了这样的报错
问题翻译一下就是说: 你现在不能在 travis-ci.com上,为这个项目启用travis服务,因为这个项目目前正在travis-ci.org上活跃着,你不能从org那边迁移到com这边
问题处理方法: 忘记travis-ci.com 接着进入travis-ci.org, 这时候就发现这个项目可以关联上了。
这个问题的出现,我认为是 jdclouddevelopers/terraform-provider-jdcloud 这个项目之前已经被关联上了 travis-ci.org。 今天我登陆了官网,就以为可以顺利开工。其实呢,项目关联的是org官网,但我登陆的是com官网,两边其实是不互通的,我在com这边是操作不了org的东西的。
2.3 Travis Auto Release - Travis自动发布
如果你到了这一步,说明你的Travis至少在工作了,你的每一次提交Travis都会按照你的 .travis.yml
来执行所有流程。 现在关心一下我想要打包怎么做
问题背景: 我希望Travis不仅能帮我编译,还要编译出 Windows/OSX/Linux 版本. 然后都发布了
script:
- cd ../.. && mv jdclouddevelopers terraform-providers && cd terraform-providers/terraform-provider-jdcloud
- make test
- make vendor-status
- make vet
# 编译 + 打包压缩
- CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o terraform-provider-jdcloud
- tar zcvf Linux-amd64.tar.gz terraform-provider-jdcloud
- CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o terraform-provider-jdcloud
- tar zcvf OSX-amd64.tar.gz terraform-provider-jdcloud
- CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o terraform-provider-jdcloud.exe
- zip Windows-amd64.zip terraform-provider-jdcloud.exe
deploy:
provider: releases
api_key: ${GITHUB_TOKEN}
file:
# 选择上传文件
- Linux-amd64.tar.gz
- OSX-amd64.tar.gz
- Windows-amd64.zip
skip_cleanup: true
on:
tags: true
首先我在Script字段中规定了一下步骤:
- 先执行一些测试,至少证明这份代码能编译,也符合go代码风格规范。
- 重点-1: 每次Travis工作,都会按照顺序编译出Linux/OSX/Windows版本,并且都做了压缩,这些打包好的文件都会在根目录下,现在已经准备就绪了
- 重点-2: 我在Deploy中描述到,请在
tags = true
(我每次发布新的tag) 的时候,帮我做一下 release(自动发布), 我希望你能帮我上传,我刚刚编译出的三个文件
2.3.1 为什么我需要一个api_key?我怎么获得?
发布Release并不是任何用户都能发布,必须得证明操作者的身份,所以你需要在这里填上你的Personal Access Token, 你可以在这里点击创造一个 Settings -> Developer settings -> PAT.
你不用给它很多权限,按照下面的图这样填写就好了,给Token操控项目的权限。按照生成之后一定要保留好这个Token, 网页一关Token就找不到了
接下来你可以在 travis.yml 中直接填上这个api_key,但是我们显然不推荐这么做,你可以像我上面这样,在Travis中把api_key做为环境变量,然后在yaml文件中直接引用就好了,做法如下:
点击项目右侧的Settings按钮,进入以后划到最下面,有一个"Environment Variables" ,左边填写 GITHUB_TOKEN, 右边填写Token值,点击保存,就可以了
2.3.2 我发了新tag,没用啊?
背景描述: 一开始我的代码中有这样的片段
branches:
only:
- master
我参考了这个回答,如果你的yaml中也存在这样的片段,那么很有可能就算你发布了新tag,仍旧会被忽视掉,似乎是一个Travis中存在的bug,后续版本中我删掉了这一行
2.3.3 为什么第一步是 cd ../..
背景描述: 这个项目本身是从 terraform-providers 组织 fork 到 jdclouddevelopers 组织下,所有代码都会有引用,就像下面这样:
import "github.com/terraform-providers/terraform-provider-jdcloud/jdcloud"
如果你clone官方分支: clone完成以后会创造出这样一个路径
${GOPATH}/src/github.com/terraform-providers/terraform-provider-jdcloud/jdcloud
但是如果你clone我们的分支: 你就会得到这样一个路径
${GOPATH}/src/github.com/jdclouddevelopers/terraform-provider-jdcloud/jdcloud
问题出现了,如果你只有一条 jdclouddevelopers的路径,那么在引用的时候就会找不到所需要的包,所以我第一步回到上层,修改文件夹名 jdclouddevelopers -> terraform-providers
2.3.4 测试环节
因为你在刚刚的描述中说到,"请在我发布新tag的时候,帮我做release" , ok , 那我们来做tag
# 生成标签,标签对应的是当前最新的commit
git tag v0.0.1-travis
# 推送标签,服务器接收到这个新标签产生的信号,Travis开始工作
git push origin v0.0.1-travis
进入Release页面 ,就能看到我们刚刚想要生成的Linux/OSX/Windows文件,现在用户终于可以下下来就用了,而且也不用我们手动上传了!