為Terraform部署Travis
如果不用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檔案,現在使用者終於可以下下來就用了,而且也不用我們手動上傳了!