基于 Gitee Go 的 Golang 持续集成部署体验
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!」的内容
本文系作者 @Gitee 原创发布在 Gitee 官方博客。未经许可,禁止转载。