Golang项目基于Jenkins的CI/CD构建发布部署流程
2023-09-22 13:40:39

最近入职一家新公司,公司只有我一个后端。从上一个后端那接手过来了整个项目,虽然薪资比较低,不过想着这次可以完全自由发挥,还是有利有弊的。

经过几天的熟悉项目之后,感觉每次需要在本地构建二进制文件,然后再通过ftp传到服务器再重启服务,整个流程相当耗时费力,为了偷懒,我开始使用jenkins去简化整个发布流程。

这篇博客是为了记录我本人的整个部署过程方便日后回忆。

前情提要

目前两台服务器

应用服务器:2核4g
Jenkins服务器:4核8g

仓库管理使用的是gitea,搭建在jenkins服务器。

不要问我为什么应用服务器的配置为什么这么低,我接手过来就是这样的,所以我不想把其他应用都部署到应用服务器,以免应用服务器资源不够。

安装Jenkins

我是直接使用docker-compose的方式进行的安装,主要是为了方便简单。

1
2
3
4
5
6
7
8
9
10
11
services:
jenkins:
image: jenkins/jenkins:lts
ports:
- "8080:8080"
volumes:
- jenkins_home:/var/jenkins_home
ssh-agent:
image: jenkins/ssh-agent
volumes:
jenkins_home:

直接使用docker-compose up -d的方式启动Jenkins容器

此时可以通过http://<server-ip>:8080的方式访问Jenkins的web页面,需要一个token,token就在日志里,可以直接使用docker logs <container-id>的方式查看,里面有一个token填进去就OK了。

正常就注册账号密码,然后按照推荐插件进行安装就行,插件等待几分钟安装完成即可。

安装Go环境

因为是golang的项目,编译golang需要安装golang的环境,有两种方法可以安装。

第一种 直接在容器里安装golang环境,将go/bin/添加到环境变量种
第二种 在系统管理插件管理中搜索并安装go插件,然后全局工具配置中找到Go安装模块,点击Go安装,设置别名和go的版本保存。最后在任务配置中的构建环境模块勾选Set up Go programming language tools并选择你需要的go版本

我这里是直接在容器内安装的golang环境,因为用第二种方式安装,下载安装包老是超时,我没去解决直接用最简单的方式跳过了。

构建任务配置

其他配置不再赘述,主要记录我的Build Step。

我目前分了三个Build Step方便区分。

构建

第一个步骤是用来构建一个二进制文件 设置构建的系统和架构

1
2
3
4
#设置go proxy
export GOPROXY=https://goproxy.cn
#编译
GOOS=linux GOARCH=amd64 /usr/local/go/bin/go build -o go-admin .

发布

第二个步骤是用来上传二进制文件到服务器/builds/go-admin/文件夹中,文件名为go-admin

1
2
#将编译好的go-admin传到应有服务器
scp -o StrictHostKeyChecking=no ./go-admin root@<ip>:/builds/go-admin/go-admin

在做这步之前需要在当前Jenkins容器中生成一个ssh_key:

1
ssh-keygen -t rsa -b 4096

然后将.ssh/id_rsa.pub的密钥复制到应用服务器的.ssh/authorized_keys

最后在系统管理凭据管理中添加全局凭证 。

具体细节可以参考Jenkins远程传送以及执行远程命令

做这一步是为了ssh连接可以不用输入密码

部署

第三个步骤是通过ssh到应用服务器去部署。
在做这步之前需要完成以下步骤:

  1. 插件管理中安装SSH插件。
  2. 系统管理系统配置中添加ssh相关配置。因为在第二步已经将ssh密钥添加到了应用服务器,所以可以直接连接

然后在任务配置中Build Steps选择Execute shell script on remote host using ssh
选择刚才设置的应用服务器,在Command的输入框中填入对应的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#进入go-admin项目的二进制归档目录中
cd /builds/go-admin

#将二进制复制到对应的项目目录中并重命名,因为是测试环境 所以是dev-go-admin
cp go-admin /www/wwwroot/<project-dir>/dev-go-admin

#当前时间 格式为230922142900
current_time=$(date +'%y%m%d%H%M%S')

#文件名称
new_filename="go-admin-${current_time}"

#重命名当前文件 目的是为了归档 方便回滚
mv go-admin "$new_filename"

#重启dev-go-admin服务
supervisorctl restart dev_go_admin:dev_go_admin_00

总结

至此整个流程就走完了。服务是用supervisor进行管理,没有使用docker,原因也是应用服务器配置较低。目前整个CI/CD流程能够跑通了,最起码我直接点个按钮就可以直接上线,so easy~