一、jenkins安装go 二、上传代码到git
  • gitee新建仓库
  • Golang创建Git仓库

  • 项目根目录下添加忽略的文件
  • 选择add的文件
  • 提交
  • 定义gitee的仓库地址

  • 推送


三、go项目的build和运行

在使用jenkins构建go项目之前,我们需要先知道go项目的build和运行流程

go build goods_web/main


四、free style构建goods_web

1 - 新建free style任务

2 - git配置 pull 代码

3 - 添加go build构建goods_web项目

  • 这里先测试go能否正常运行


  • 无法找到go的解决方案:将配置过程通过shell脚本来执行,这样就不会报错了
mkdir -vp goods_web/target/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_mainchmod +x /docker/golang/goods_web/target/goods_web_main

5 - 添加执行exec command

/docker/golang/goods_web/target/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"