基於 Gitee Go 的 Golang 持續集成部署體驗

Gitee Go 快速體驗入口:https://gitee.com/features/gitee-go

Gitee GoGitee 推出的 CI/CD 服務,通過自定義構建流程,可以實現從代碼倉庫到構建部署自動化。目前已支持 MavenGradlenpmPythonAntPHPGolang 等工具和語言的持續構建與集成能力。

本次實踐將基於 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!」的內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章