41、Jenkins部署go项目
在使用jenkins构建go项目之前,我们需要先知道go项目的build和运行流程。
·
目录
一、jenkins安装go
- Go环境搭建(windows+linux)参考地址:https://blog.csdn.net/qq23001186/article/details/125697346
二、上传代码到git
- gitee新建仓库
- Golang创建Git仓库
- 项目根目录下添加忽略的文件
- 选择add的文件
- 提交
- 定义gitee的仓库地址
- 推送
三、go项目的build和运行
在使用jenkins构建go项目之前,我们需要先知道go项目的build和运行流程
- build项目
go build goods_web/main
- 运行
- 这里我们需要知道光有main.exe是不能运行,需要有yaml配置文件,并且与项目的相对路径保持一致
四、free style构建goods_web
1 - 新建free style任务
2 - git配置 pull 代码
3 - 添加go build构建goods_web项目
- 这里先测试go能否正常运行
- 无法找到go的解决方案:将配置过程通过shell脚本来执行,这样就不会报错了
- 现在将之前我们手动执行的步骤转化成shell脚本添加到构建中:
- 这里要注意一个问题,因为go build后,nacos会生成tmp的目录,我们也需要提前建好
mkdir -vp goods_web/target/tmp
,这样才会属于jenkins的用户组,否则是root用户组,这会导致无权限
- 这里要注意一个问题,因为go build后,nacos会生成tmp的目录,我们也需要提前建好
echo "配置Go语言环境变量"
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
echo "开启go moudle、代理配置"
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct
echo "准备好目录结构"
# 嵌套方式构建目录结构,之前我们已经分析过了目录结构
chmod 777 -R goods_web
mkdir -vp goods_web/target/goods_web
mkdir -vp goods_web/target/tmp
cp goods_web/config_zsz.yaml goods_web/target/goods_web/config_zsz.yaml
echo "执行go build 生成可执行文件"
go build -o goods_web/target/goods_web_main goods_web/main.go
echo "构建完成"
- 查看目录结构及运行:没有问题,都按照我们的shell脚本执行了
4 - 构建后操作 -> 部署到测试服务器
- 目标服务器路径生成:我们在目标的 /docker/golang下存放target目录,注意建好目录后,我们要给这个目录设置好权限
- 构建后上传到测试服务器:添加构建后操作
- 测试是否可以成功传输:查看测试服务器
5 - 添加goods_web_main的可执行权限
- 我们先手动添加下可执行权限确认是否可以正确运行:
chmod +x /docker/golang/goods_web/target/goods_web_main
- 构建中添加Exec command:
chmod +x /docker/golang/goods_web/target/goods_web_main
- 重新构建并查看可执行权限
5 - 添加执行exec command
- 我们还希望构建后,goods_web_main运行起来:可以在exec command中添加执行命令
/docker/golang/goods_web/target/goods_web_main
- 重新构建后我们发现异常了
- 我们到测试服务器上查看goods_web_main是否在运行:
ps aux|grep goods_web_main
6 - shell脚本方式启动goods_web_main
- 为什么不推荐使用exec command方式运行程序:我们更推荐使用shell脚本来运行,因为我们还可能有如下需求
- ①.我们希望在后台运行
- ②.如果这个程序之前已经启动过了,我们应该先关闭之前的进程,然后再重新启动,否则我们会启动多个版本的goods_web进程
- ③.实际开发过程中,我们可能会有更复杂的需求,所以还是推荐使用shell脚本的方式来启动
- 编写shell脚本:这个一定要注意文件的格式是Unix(LF),否则linux下执行会多出/r/r
#定义一个变量
srv_name="goods_web_main"
#添加可执行权限
chmod +x ./$srv_name
#重启,如果已经在则关闭重启
if pgrep -x $srv_name > /dev/null
then
echo "${srv_name} is running"
#先关闭进程
echo "shutting down ${srv_name}"
#这里不要使用kill -9,这个是强杀,我们需要优雅退出
if ps -a | grep $srv_name | awk '{print $1}' | xargs kill $1
then
echo "starting ${srv_name}"
#以后台方式启动,定向到dev/null 2>&1 &
./$srv_name > /dev/null 2>&1 &
echo "start ${srv_name} success"
fi
else
echo "starting ${srv_name}"
./$srv_name > /dev/null 2>&1 &
echo "start ${srv_name} success"
fi
- 构建中添加赋值shell脚本到target以便一起传输到测试服
- ssh传输后修改为执行shell脚本
- 重新构建:这时候发现有一个问题,如果原先goods_web_main在运行的时候,传输文件会导致失败
7 - 使用备份脚本方式构建
- 我们先传输到另外一个bak的目录中,然后关闭goods_web_main,cp备份的文件,最后再开启服务
- sh脚本修改
#定义一个变量
srv_name="goods_web_main"
#添加可执行权限
chmod +x ./$srv_name
#重启,如果已经在则关闭重启
if pgrep -x $srv_name > /dev/null
then
echo "${srv_name} is running"
#先关闭进程
echo "shutting down ${srv_name}"
#这里不要使用kill -9,这个是强杀,我们需要优雅退出
# shellcheck disable=SC2009
# shellcheck disable=SC2086
ps -a | grep $srv_name | awk '{print $1}' | xargs kill $1
fi
rm -rf /docker/golang/goods_web/
cp -r /docker/golang/goods_web_bak/goods_web/ /docker/golang/goods_web/
chmod +x /docker/golang/goods_web/target/$srv_name
echo "starting ${srv_name}"
cd /docker/golang/goods_web/target/ || exit
./$srv_name > /dev/null 2>&1 &
echo "start ${srv_name} success"
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献2条内容
所有评论(0)