基于 Gitee Go 的 Golang 持续集成部署体验

诺墨
Gitee Go 快速体验入口:https://gitee.com/features/gitee-go

[Gitee Go] 是 [Gitee] 推出的 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!」的内容

阅读 1.5k

诺墨的技术工坊
诺墨的技术工坊,写写代码,聊聊人生。

独立开发者。

20 声望
2 粉丝
0 条评论

独立开发者。

20 声望
2 粉丝
文章目录
宣传栏