蓝易云

Jenkins 打包微服务流程优化

466次阅读
没有评论

共计 2061 个字符,预计需要花费 6 分钟才能阅读完成。

之前有写到 Jenkins 打包微服务教程-一个配置文件即可打包所有模块,其中构建后操作使用到了 Publish Over SSH 这个插件,当有很多主机时,会显得很麻烦,而且需要另外页面去配置。

于是就把构建后操作里面的运行镜像修改为只使用 shell 脚本的方式来实现。代码如下:

# 准备工作 -> 1. 定义主机 2.获取工作目录 3. 连接新主机不询问是否添加到known_hosts
cat > hosts.txt <<EOF
172.26.1.21 root xxx dev_test "-e ACTIVE=pro -e NACOS_URL=172.26.1.21"
EOF
current_dir=$(pwd)
grep -q 'StrictHostKeyChecking no' /etc/ssh/ssh_config || echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config

#==========定义远程执行脚本文件开始==========
cat << 'EOF' > script.sh
#!/bin/bash
cd /tmp/robot-patrol-platform
tarName=$(ls *.tar -1t | head -n 1)
imageName=$(docker load -i ${tarName} |  cut -d' ' -f3)
containerName=$(echo ${imageName} | cut -d: -f1)
# 删除原来的容器,并新建一个容器
if docker ps | grep "${containerName}" >/dev/null 2>&1; then docker rm -f ${containerName} ; fi
docker run -d --net host $1 --restart=unless-stopped --name ${containerName} ${imageName}
# 删除无用的镜像,只保留最新的镜像
serviceName=${containerName}
if docker images | grep "${serviceName}" >/dev/null 2>&1; then docker rmi -f $(docker images | grep ${serviceName} |awk 'NR>1 {print $3}'); fi
# 删除临时文件夹
rm -rf /tmp/robot-patrol-platform/${tarName}
rm -rf /tmp/robot-patrol-platform/script.sh
echo "The script has been executed successfully."
EOF
#==========定义远程执行脚本文件结束==========

#==========定义任务函数开始==========
dotask () {
    ip=$1; username=$2; password=$3; environment=$4; param=$5
    echo "===============远程主机 "$ip" 开始执行任务==============="
    sshpass -p $password scp $current_dir/${module}/target/*.tar $username@$ip:/tmp/robot-patrol-platform
    sshpass -p $password scp $current_dir/script.sh $username@$ip:/tmp/robot-patrol-platform
    sshpass -p $password ssh $username@$ip "chmod +x /tmp/robot-patrol-platform/script.sh && /tmp/robot-patrol-platform/script.sh $param"
    echo "===============远程主机 "$ip" 脚本执行完成==============="
}
#==========定义任务函数结束==========

while read -r ip username password environment param; do
  if [ "$host" = "all" ]; then
    dotask $ip $username $password $environment "$param"
  elif [ "$host" = "$environment" ]; then
    dotask $ip $username $password $environment "$param"
  fi
done < hosts.txt
echo "===============所有任务已完成==============="

该 ssh 脚本完全替代了 Publish Over SSH,通过 sshpass 命令免密拷贝文件和在宿主机执行脚本。

脚本最开始,定义了目标主机的ip、用户名、密码以及环境和 docker 执行添加的额外环境变量,其中环境用于匹配$host变量。

其中 $module 还是和之前的变量,$host 是需要打包到的目标机器,如果该字段为 all,打包到所配置的全部机器上。

提醒:本文发布于594天前,文中所关联的信息可能已发生改变,请知悉!

AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完
 0
阿蛮君
版权声明:本站原创文章,由 阿蛮君 于2023-04-23发表,共计2061字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
Copyright © 2022-2024 阿蛮君博客 湘ICP备2023001393号
本网站由 亿信互联 提供云计算服务 | 蓝易云CDN 提供安全防护和加速服务
Powered by Wordpress  Theme by Puock