Gitee Go 快速體驗入口:https://gitee.com/features/gitee-go
Gitee Go 是 Gitee 推出的 CI/CD 服務,通過自定義構建流程,可以實現從代碼倉庫到構建部署自動化。目前已支持 Maven
、Gradle
、npm
、Python
、Ant
、PHP
、Golang
等工具和語言的持續構建與集成能力。
本次實踐將基於 Gitee Go 完成一個 Golang 應用的 自動化構建編譯
+部署
,並通過外網訪問預覽效果。
實現思路
Gitee Go 提供了將項目持續集成並部署到指定主機環境中的能力,目前支持在任意可連通公網的 Linux 主機上進行部署,推薦主機環境使用 Ubuntu/CentOS。
環境準備
- 實現 Gitee Go 持續部署集成需要一臺可連通外網的 Linux 主機,推薦使用 Ubuntu/CentOS。
- 用戶部署目標機器需要自行集成運行環境。
- 通過文章頂部開頭鏈接(Gitee Go)獲取可用的構建時長,以用於流水線使用。
Gitee Go 的持續集成主要通過 Agent 方式實現,故會在系統中安裝 JDK 1.6+ 環境。
持續部署的流程
在持續部署過程中,通過持續集成編譯並打包的製品工程,結合用戶定義具體的部署腳本,可以輕鬆將用戶的代碼部署到指定的機器上。
一、開通 Gitee Go
在倉庫中找到「DevOps」菜單中的「Gitee Go」功能,點擊「同意並開通」,完成服務開通。
二、製品庫配置
在 Gitee Go 中,製品庫主要是用於存放和管理 CI 過程產生的構建物,包括但不僅限於:二進制構建物、測試報告、其他數據報告等。 在製品庫中,允許存在多個製品,單個製品支持歷史版本下載和自定義標記版本號。
通過 Gitee Go 流水線頁面找到「製品庫管理」功能,創建一個製品庫並設定製品庫的唯一標識。此處以創建一個名爲 “編譯製品",唯一標識爲 “compiled-artifact” 的製品庫爲例。如下圖。
三、添加部署機器
在 Gitee Go 中,“計算資源管理” 功能主要用於管理用戶的計算資源,如集羣、雲主機等。 目前對主機資源的管理主要通過在宿主機安裝 Agent 程序實現對機器的管理。
添加主機組
企業管理員通過訪問 管理
->功能設置
->計算資源管理
進行設置管理。以下以創建名爲 “後端服務”,唯一標識爲 “backend-server” 的主機組爲例。
添加主機
在創建完主機組後,通過主機組 主機管理
選項添加一個新主機。 此處已準備了一臺裝有 Golang 的 Ubuntu 主機爲例。相關信息如下:
- 主機信息:Ubuntu 20.04.1 64bit LTS
- Golang版本:1.13.8 linux/amd64
通過選擇 添加新主機
,在彈出的界面中獲取到 Agent 的安裝腳本,複製到目標機器上執行。安裝完成後,將看到 Agent started success!
的字樣,表示 Agnet 安裝並啓動完成。回到主機添加界面,勾選對在線的主機,選擇添加即可完成主機的添加。
添加主機
執行腳本,安裝並啓動 Agent 程序
回到 Web 端,勾選已在線的主機,點擊「添加主機」,完成主機添加。
在主機組中選擇「關聯倉庫」,在彈出窗口搜索並關聯要使用部署功能的倉庫。
四、流水線配置
在完成 製品庫
、主機組
和主機
後,此處以構建一個 Golang 版本的 HTTP Web Server 程序爲例,在倉庫中創建流水線。具體流水線業務內容如下:
通過流水線構建服務端程序,並部署到目標機器部署,程序通過 8080 端口提供 web 服務,訪問時輸出 “Hello, Gitee Go” 的內容。在部署啓動成功後通過 curl 檢測服務啓動情況。
注:爲保證流水線構建順利完整,案例中將程序源碼通過
Shell
輸出到 CI 環境中,默認情況下 CI 的Shell
起點就是 倉庫的根(即自動完成git clone xxxx && cd xxxx
的操作)
# ========================================================
# Golang 構建參考流水線樣例
# 功能:構建一個簡單的 Go 程序並編譯不同操作系統下的可執行環境
# ========================================================
name: gitee-go-golang-example # 定義一個唯一 ID 標識爲 gitee-go-golang-example,名稱爲 “Golang-流水線示例” 的流水線
displayName: 'Golang-流水線示例'
triggers: # 流水線觸發器配置
push: # 設置 master 分支 在產生代碼 push 時精確觸發(PRECISE)構建
- matchType: PRECISE
branch: master
commitMessage: '' # 通過匹配當前提交的 CommitMessage 決定是否執行流水線
stages: # 構建階段配置
- stage: # 定義一個 ID 標識爲 golang-build-stage,名爲 “Golang Stage” 的階段
name: golang-build-stage
displayName: 'Golang Stage'
failFast: false # 允許快速失敗,即當 Stage 中有任務失敗時,直接結束整個 Stage
steps: # 構建步驟配置
- step: golangbuild@1 # 採用 Golang 編譯環境
name: golang-build # 定義一個 ID 標識爲 golang-build ,名爲 “Golang Step” 的階段
displayName: 'Golang Step'
inputs: # 構建輸入參數設定
golangVersion: 1.13 # 指定 Golang 環境版本爲 1.13
goals: | # 示例腳本:創建並編譯構建一個命令行輸出 “Hello, Gitee Go” 的程序
echo 'package main' | tee -a main.go
echo 'import (' | tee -a main.go
echo ' "net/http"' | tee -a main.go
echo ' "fmt"' | tee -a main.go
echo ' "log"' | tee -a main.go
echo ')' | tee -a main.go
echo 'func myHandler(w http.ResponseWriter, r *http.Request) {' | tee -a main.go
echo ' fmt.Fprintf(w, "“Hello, Gitee Go!\n")' | tee -a main.go
echo '}' | tee -a main.go
echo 'func main(){' | tee -a main.go
echo ' http.HandleFunc("/", myHandler)' | tee -a main.go
echo ' log.Fatal(http.ListenAndServe(":8080", nil))' | tee -a main.go
echo '}' | tee -a main.go
mkdir output
GOOS=linux GOARCH=amd64 go build -o output/server.amd64 main.go
uploadArtifact: true # 開啓上傳構建物選項
uploadArtifactOptions: # 構建物參數
artifactPath: 'output' # 要打包的構建物所在目錄
artifactRepository: 'compiled-artifact' # 製品庫名稱
artifactName: 'server'
- step: agent-deploy@1 # 定義通過 SA 部署插件
name: deploy # Step 唯一標識
dependsOn: golang-build
displayName: '部署發佈' # Step 顯示名稱
inputs: # Step 入參
hostGroupID: 'backend-server' # 指定部署主機組ID
minComplicating: 0 # 允許的最小併發部署數量
maxComplicating: 2 # 允許的最大併發部署數量
deployArtifact: # 上傳的製品項
- name: 'php-index' # 上傳部署的製品名(僅作爲顯示,無具體作用,允許重複)
source: build@golang-build-stage/golang-build # 部署製品文件引用自上游流水線 Stage/Step 的製品
artifactRepository: 'compiled-artifact' # 當製品引用自流水線,此參數可忽略
artifactName: 'server' # 當製品引用自流水線,此參數可忽略
target: /data # 目標機器製品上傳目錄
isForce: true # 當目標存在時是否強制覆蓋,默認爲 true,可選
script: | # 部署腳本,到目標機器製品上傳目錄解壓並啓動構建程序,並通過curl檢測
cd /data
ls
tar -zxf server.tar.gz
cd output
chmod +x ./server.amd64
nohup ./server.amd64 &
echo "Deploy Success"
curl 127.0.0.1:8080
五、觸發構建部署效果
通過向倉庫提交代碼即可觸發流水線構建,流水線的構建效果如下:
構建環節
部署環節
通過瀏覽器訪問對應目標機器服務效果,如果順利的話可以看到主機的 8080 端口可以訪問並得到一個「Hello there!」的內容