一、jenkins安装go

二、上传代码到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用户组,这会导致无权限
      在这里插入图片描述
      在这里插入图片描述
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 commandchmod +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"


在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐