jenkins 跨机房自动部署方案

嘿嘿,首先不进入正题。这两天趁着假期把笔记内容都给整理了一番,这些大多是平时写代码的总结,以及看过的一些文章的转载和笔记,数了一下大概将近150篇文章。每次V站上秀博客我的特想秀下我的域名,只是我现在这小站 itstudying 太简陋了点,空有外表,实际啥内容也没,只有个个人简介在里面。而且我还花钱买了个服务器挂着它,与其闲着它不用还不如把这些笔记整理下放上去,文章倒不是多牛逼,只是些自己的个人总结,所悟所思所想而已。


对于不同机房,网络互不相同情况下部署解决方法

正常情况下想要使用jenkins做自动化部署只需要安装Publish Over SSH插件即可,但是不同机房、网络不通得情况下就不能使用此插件了,像我们公司有三个机房,难道每个机房都配一个jenkins吗。。。又或者手动部署??。。 也很奇怪网上没有合适的解决办法,可能是大佬们觉得问题太过简单了吧。

网络环境

在机房a中有台跳板机,登录a的机器和其他机房b,c的机器都需要通过此跳板机才能登录,jenkins是在a机房中。首先想到是在jenkins机器上设置ssh代理,但是测试下在jenkins机器上能正常登录到其他机房,但是jenkins部署时怎么着都不通,貌似是jenkins自己维护了一套ssh服务。所以尝试第二种方案,比如有以下两个文件需要部署至机房

config.toml main
  1. 新建两个辅助部署脚本deploy.sh和重启脚本restart.sh,将需部署的文件以及两个脚本先上传到跳板机器,

deploy.sh

#!/bin/bash

function perform() {
    IP=$1
    DIR=$2
    PORT=$3
    FILENAME=$4
    ENV=$5

    echo "scp  config"
    scp ${PORT} ${DIR}${FILENAME} root@${IP}:/data/www/demo/_config.toml
    echo "scp  main"
    scp ${PORT} ${DIR}_main root@${IP}:/data/www/demo/_main
    echo "scp  restart"
    scp ${PORT} ${DIR}restart.sh root@${IP}:/data/www/demo/restart.sh
    echo "sh  restart"
    ssh root@${IP} ${PORT,,} "sh /data/www/demo/restart.sh ${ENV}"
    echo "完成"
}

if [[ "$1" == "a" ]]; then
        echo "test start!!!"
        perform "11.*.*.*" "/tmp/test/" "-P 22" "config.toml.test.11" "ss"
elif [[ "$1" == "b" ]];then
        echo "huaxin1 start!!!"
        perform "12.*.*.*" "/tmp/prod/" "-P 22" "config.toml.prod.12" "ss"
elif [[ "$1" == "c" ]];then
        echo "jinqiao1 start!!!"
        perform "13.*.*.*" "/tmp/prod/" "-P 22" "config.toml.prod.13" "ss"
else
    echo "no"
    exit 0
fi

restart.sh


#!/bin/bash
function s11() {
    YMD=`date +%Y%m%d-%H%M%S`
    cd /data/www/demo && mv config.toml config.toml-${YMD} && mv _config.toml config.toml

    cd /data/www/demo && mv demo demo-${YMD}  && mv _main main && chmod u+x main
    # 重启....
}

function s12() {
      YMD=`date +%Y%m%d-%H%M%S`
    cd /data/www/demo && mv config.toml config.toml-${YMD} && mv _config.toml config.toml

    cd /data/www/demo && mv demo demo-${YMD}  && mv _main main && chmod u+x main
    # 重启....
}


if [[ "$1" == "a" ]]; then
    s11
elif [[ "$1" == "b" ]];then
    s12
else
    echo "no"
    exit 0
fi

以上代码做了些隐私处理,只是当做示例二用,实际使用时有很多问题需要去处理,需要做的只是完善这俩脚本即可

jenkins配置

image
image

配置好这个后点击jenkins会把config.toml_开头的文件、restart.shdeploy.sh上传到jump机器的jump机器的指定目录/test/目录下,并且执行deploy脚本,此脚本会根据脚本内容执行,例子脚本会把文件上传到b机房服务器中,因为这机房就是通过跳板机进行登录所以这里的scp是能传输成功的。并且会执行restart脚本,此脚本用于重启替换目标机房的程序并重启。

这些配置就能搞定,方法也很简单,虽不是很优雅但能解决问题。现在需要上线跨机房的服务时就会用这个方法,点击一下坐着看log就行,省去了很多麻烦。毕竟人类的懒促进了科技发展。