Gitee Support Center / detail

    Gitee Go 持续部署功能

    持续部署 简介

    持续部署是在通过持续集成完成自动化测试/构建后,将项目部署到指定测试/生产环境的能力。

    Agent部署是一项通用的主机部署能力,不针对某一种特定编译任务。 本文以 Golang 作为示例,在实际应用中,可替换为 Vue、React 等前端项目部署或其他 GITEEGO 所支持的编译语言或工具 产物部署

    Gitee Go 提供了将项目持续集成并部署到指定主机环境中的能力,目前支持在任意可连通公网的 Linux 主机上进行部署,推荐主机环境使用 Ubuntu/CentOS。

    环境准备

    • 实现 Gitee Go 持续部署集成需要一台可连通外网的 Linux 主机,推荐使用 Ubuntu/CentOS。
    • 用户部署目标机器需要自行集成运行环境。

    Gitee Go 的持续集成主要通过 Agent 方式实现,故会在系统中安装 JDK 1.6+ 环境。

    持续部署的流程

    在持续部署过程中,通过持续集成编译并打包的制品工程,结合用户定义具体的部署脚本,可以轻松将用户的代码部署到指定的机器上。

    一、开通 Gitee Go

    在企业版仓库中找到「DevOps」菜单中的「Gitee Go」功能,点击「同意并开通 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'         # 制品库ID/标识
                  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

    五、触发构建部署效果

    通过向仓库提交代码即可触发流水线构建,流水线的构建效果如下:

    构建环节

    部署环节

    通过浏览器访问对应目标机器服务效果

    Search