采用敏捷开发以后,自动化集成和部署的必要性越来越大,每天可以节省大量的时间。对比之后,采用GoCD作为持续集成和部署的工具。
GoCD分为两个部分:go-server 和 go-agent 需要分别进行安装。可以安装在同一台主机上,也可以安装在不同的主机上。服务端提供了统一的任务管理,相关的任务会分配给不同的代理服务器(go-agent)上来执行。相关的概念和部署在文档中都有体现,按步骤操作基本没什么问题。
官网地址:https://www.gocd.org/
参考中文文档: https://gocd.org.cn/#/
背景:项目结构为maven项目,采用的技术为SpringBoot
目标:实现项目自动打包,自动重启
步骤:
(1)依次创建piplelines、stage、job 如下图:
(2)创建tasks
Task1:执行maven打包操作,GoCD已内置了mvn命令,但是代理服务器上需要安装maven客户端
Task2:将打包后的jar文件,复制到项目部署目录。
注意:文件夹权限,GoCD通过自己创建的go用户来执行命令,需要确保文件夹的操作权限 ,可用chmod +777 命令进行设置权限;另打包后的jar文件,在GoCD的沙箱中,直接从target/***.jar 复制即可
Task3:重启jar包,需要借助shell 命令来完成。
注意:sh文件需要编辑测试好以后,放在代理服务器的相应的目录下。
sh文件编写:
#!/bin/bash
#这里可替换为你自己的执行程序,其他代码无需更改
APP_NAME=/opt/server/msp/health-api/health-2.0.2.jar
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh health_api.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq 0 ]; then
echo "${APP_NAME} is already running. pid=${pid}"
else
echo "开始启动..."
nohup java -jar ${APP_NAME} >/dev/null 2>&1 &
echo "启动结束"
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#重启
restart(){
stop
sleep 5
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
背景:项目为通过npm管理的web项目,需要借助npm进行编译,编译后为静态html、js、css文件
目标:编译项目,并将编译后的文件复制到nginx服务器指向的目录内
步骤:由于GoCD并没有内置npm管理命令,所以,需要直接在代理服务器上用脚本来执行,
注意:代理服务器上需要配置好项目代码目录,svn环境,以便于脚本执行代码更新,并进行编译
(1)依次创建piplelines、stage、job ,同java项目
(2)执行shell命令,同java项目中的task3,需要提前在代理服务器上部署sh文件
npm项目shell脚本如下:
#!/bin/bash
#这里可替换为你自己的执行程序,其他代码无需更改
SOURCE_CODE_DIR=/opt/server/sourceDir
DEPLOY_DIR=/opt/server/msp/depDir
#更新代码
cd ${SOURCE_CODE_DIR}
svn cleanup --username yourSVNname --password yourSVNpassword
svn update --username yourSVNname --password yourSVNpassword
#编译
npm install
npm run build
#复制到部署目录
cp ./dist/{index.js,index.css} ${DEPLOY_DIR}
问题描述:服务器断电重启后,go-server可以正常启动,go-agent启动一直报权限不足。使用sudo进行启动仍提示权限不足 sudo /etc/init.d/go-agent start
解决方法:根据错误提示:/etc/default/go-agent 执行权限问题。
使用sudo命令 cp go-agent文件 权限即变为 root root ,然后再用sudo 命令启动即正常。
问题2:在GoCD中使用 sudo命令执行脚本时,需要输入密码的问题
解决方法:
打开文件:sudo vi /etc/sudoers
添加代码:go ALL=(ALL) NOPASSWD:ALL
强制保存退出即可。