为Terraform部署Travis

559 阅读4分钟
如果不用Travis做自动打包,以下是你用户的体验:
  1. 使用官方自带版本  ->  可能已经是几周前的版本
  2. 自己下载源码编译  ->  毕竟不是所有人都是Golang用户, 部署go需要很久
  3. 最后都能变成         ->  再见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字段 deploy字段是什么意思?

首先我在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文件,现在用户终于可以下下来就用了,而且也不用我们手动上传了!