MavenGradlenpmPythonAntPHPGolang
自动化构建编译部署
实现思路
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 程序实现对机器的管理。
添加主机组
管理功能设置计算资源管理
添加主机
主机管理
- 主机信息:Ubuntu 20.04.1 64bit LTS
- Golang版本:1.13.8 linux/amd64
添加新主机Agent started success!
添加主机
执行脚本,安装并启动 Agent 程序
回到 Web 端,勾选已在线的主机,点击「添加主机」,完成主机添加。
在主机组中选择「关联仓库」,在弹出窗口搜索并关联要使用部署功能的仓库。
四、流水线配置
制品库主机组主机
通过流水线构建服务端程序,并部署到目标机器部署,程序通过 8080 端口提供 web 服务,访问时输出 “Hello, Gitee Go” 的内容。在部署启动成功后通过 curl 检测服务启动情况。
ShellShellgit 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!」的内容