提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
CI(Continuous Intergration )—— 持续集成,指开发人员能够频繁将代码集成到公共代码仓库的主分支中。而 CD(Continuous Deployment)——持续部署,以持续集成过程为其理论基石,其核心是部署一条流水线,实现应用程序从构建、部署、测试到发布这整个过程的自动化,从而提高软件的交付能力。本示例将用gitlab和gogs仓库,实操jenkins配置,实现代码推送后自动打包部署。
一、Jenkins基础配置
本次示例是基于容器化运行的jenkins服务,基础配置中包含支撑仓库事件捕获的插件安装,全局的参数配置。
1.插件安装
插件安装可以采用联网下载自动安装,也可以采用手动安装。考虑插件对其他组件的依赖性,建议采用联网下载自动安装。如果联网下载不成功,可以将插件镜像的地址切换为国内镜像后再次下载安装。
插件搜索安装操作路径:
Dashboard=》系统管理=》插件管理=》Available plugins
插件镜像源切换操作路径:
Dashboard=》系统管理=》插件管理=》Advanced settings=》升级站点
插件手动安装操作路径:
Dashboard=》系统管理=》插件管理=》Advanced settings=》Deploy Plugin
-
安装gitlab插件
-
安装gogs插件
2.jenkins重启,使已安装的所有插件生效
3.全局参数配置
- 配置gitlab仓库账号信息
操作路径及截图:
Dashboard=>系统管理=>Configure System
- 配置gogs仓库账号信息
操作路径及截图:
Dashboard=>系统管理=>Configure System
- 配置项目编译打包用的maven-setting文件
操作路径及截图:
Dashboard=>系统管理=>Managed files=>Add a new Config
二、gitlab仓库CD配置
1. jenkins上创建项目,配置项目流水线,并配置构建触发器
2. 创建触发器地址访问的安全令牌标识
3. gitlab仓库配置webhook,配置完成后可以测试推送
4. 配置项目编译构建maven工具:命令、setting.xml
5. 构建后登陆目标服务器,执行脚本,部署服务
三、gogs仓库CD配置
1. jenkins上创建项目,配置项目流水线,并配置构建触发器
2. gogs仓库配置webhook,并调试推送
3. gogs仓库的webhook推送地址格式参照如下:
4. 其他jenkins构建和部署步骤及配置,同gitlab相同。
5. 当配置完,点击调试出现403错误时,按照如下操作可以解决:
#登陆jenkins容器所在服务器,并进入容器内
docker exec -it jenkins bash
#找到文件 /usr/local/bin/jenkins.sh 将启动脚本 java -jar 后面加上一行:-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
exec java -Duser.home="$JENKINS_HOME" -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true "${java_opts_array[@]}" -jar ${JENKINS_WAR} "${jenkins_opts_array[@]}" "$@"
#退出容器并重启容器
docker stop jenkins && docker start jenkins
四、自用部署脚本
1. jar包下载脚本
#!/bin/sh
#description:从远程服务器复制jar包文件
#下载文件基础路径
download_file_base_path="http://nexus.tongtech.top/repository/tongboot/org/tongframework/boot"
#部署目录
deploy_dir="/opt/quality"
#jar包文件存放路径
jar_save_path="$deploy_dir/jars"
#日志文件存放路径
log_path="$deploy_dir/log"
#新建目录,如果不存在则新建
if [ ! -d $deploy_dir ]; then
mkdir -p $deploy_dir
fi
if [ ! -d $jar_save_path ]; then
mkdir -p $jar_save_path
fi
if [ ! -d $log_path ]; then
mkdir -p $log_path
fi
#清空已存在的jar包
echo ">>>>>>>>>>>>>>>>>>>>>>>>>> clear jar >>>>>>>>>>>>>>>>>>>>>>>>>>>>"
rm -rf ${jar_save_path}/*.jar
#开始复制文件
echo ">>>>>>>>>>>>>>>>>>>>>>>>>> download jar >>>>>>>>>>>>>>>>>>>>>>>>>>>>"
cd ${jar_save_path}
wget ${download_file_base_path}/tong-quality-cloud-start/3.4.0/tong-quality-cloud-start-3.4.0.jar
wget ${download_file_base_path}/tong-system-cloud-start/3.4.0/tong-system-cloud-start-3.4.0.jar
wget ${download_file_base_path}/tong-cloud-gateway/3.4.0/tong-cloud-gateway-3.4.0.jar
sleep 10
#开始复制文件到部署目录
echo ">>>>>>>>>>>>>>>>>>>>>>>>>> copy jar >>>>>>>>>>>>>>>>>>>>>>>>>>>>"
cp -r ${jar_save_path}/* ${deploy_dir}
#重启所有jar包
echo ">>>>>>>>>>>>>>>>>>>>>>>>>> restart services >>>>>>>>>>>>>>>>>>>>>>>>>>>>"
cd ${deploy_dir}
./deploy_tongboot_quality_jar.sh restart
2. jar包部署脚本
#!/bin/sh
#日志文件存放目录
export LOG_PATH=/opt/quality/log
#应用jar
export GATEWAY=/opt/quality/tong-cloud-gateway-3.4.0.jar
export SYSTEM=/opt/quality/tong-system-cloud-start-3.4.0.jar
export QUALITY=/opt/quality/tong-quality-cloud-start-3.4.0.jar
#应用端口号
export GATEWAY_port=9999
export SYSTEM_port=7001
export QUALITY_port=7002
#jdk环境:服务器环境和jenkins执行环境不一样,如果通过jenkins构建脚本执行,需要指定具体的java参数
export JAVA=/usr/local/jdk1.8.0_241/bin/java
case "$1" in
start)
## 启动GATEWAY
echo "--------开始启动 GATEWAY---------------"
nohup $JAVA -jar $GATEWAY >$LOG_PATH/gateway.out 2>&1 &
GATEWAY_pid=`lsof -i:$GATEWAY_port|grep "LISTEN"|awk '{print $2}'`
until [ -n "$GATEWAY_pid" ]
do
GATEWAY_pid=`lsof -i:$GATEWAY_port|grep "LISTEN"|awk '{print $2}'`
done
echo "GATEWAY pid is $GATEWAY_pid"
echo "---------GATEWAY 启动成功-----------"
## 启动SYSTEM
echo "--------开始启动 SYSTEM---------------"
nohup $JAVA -jar $SYSTEM >$LOG_PATH/system.out 2>&1 &
SYSTEM_pid=`lsof -i:$SYSTEM_port|grep "LISTEN"|awk '{print $2}'`
until [ -n "$SYSTEM_pid" ]
do
SYSTEM_pid=`lsof -i:$SYSTEM_port|grep "LISTEN"|awk '{print $2}'`
done
echo "SYSTEM pid is $SYSTEM_pid"
echo "---------SYSTEM 启动成功-----------"
## 启动QUALITY
echo "--------开始启动 QUALITY---------------"
nohup $JAVA -jar $QUALITY >$LOG_PATH/quality.out 2>&1 &
QUALITY_pid=`lsof -i:$QUALITY_port|grep "LISTEN"|awk '{print $2}'`
until [ -n "$QUALITY_pid" ]
do
QUALITY_pid=`lsof -i:$QUALITY_port|grep "LISTEN"|awk '{print $2}'`
done
echo "QUALITY pid is $QUALITY_pid"
echo "---------QUALITY 启动成功-----------"
echo "===startAll success==="
;;
stop)
P_ID=`ps -ef | grep -w $GATEWAY | grep -v "grep" | awk '{print $2}'`
if [ "$P_ID" == "" ]; then
echo "===GATEWAY process not exists or stop success"
else
kill -9 $P_ID
echo "GATEWAY killed success"
fi
P_ID=`ps -ef | grep -w $SYSTEM | grep -v "grep" | awk '{print $2}'`
if [ "$P_ID" == "" ]; then
echo "===SYSTEM process not exists or stop success"
else
kill -9 $P_ID
echo "SYSTEM killed success"
fi
P_ID=`ps -ef | grep -w $QUALITY | grep -v "grep" | awk '{print $2}'`
if [ "$P_ID" == "" ]; then
echo "===QUALITY process not exists or stop success"
else
kill -9 $P_ID
echo "QUALITY killed success"
fi
echo "===stop success==="
;;
restart)
$0 stop
sleep 3
$0 start
echo "===restart success==="
;;
esac
exit 0
总结
通过以上步骤,可以实现jenkins+gitlab/gogs+CD自动化构建和部署。如果jenkins/gitlab/gogs因版本不一样,操作界面及功能按钮显示不同的,要参照具体的版本具体配置。