一个简单的连续调用脚本部署代码的案例

先简单描述一下环境,Jenkins部署在私有云,从git拉取代码并编译后会调用脚本将jar包部署到阿里云的应用服务器。
阿里云应用服务器无公网IP,通过跳板机登录。就产生了连续调用脚本,穿透跳板机部署到阿里云内网的需求。

服务器信息:
**主机名称
IP **
git server 10.150.27.51
jenkins server 10.150.27.52
jump server 1.1.1.1/192.168.2.20
app server1 192.168.2.21
app server1 192.168.2.22

拓扑图如下:

1.部署脚本01-backend-earphone-8888.sh (Jenkins server)

主要实现功能:

  • 将跳板机1.1.1.1上面临时目录/data/deploy/pccode/earphone内容情况
  • 拷贝Jenkins编译生成的jar包文件(earphone-1.08888.jar)至跳板机/data/deploy/pccode/earphone目录
  • 调用跳板机脚本进行部署/data/deploy/script/earphone.sh

[[email protected] prod]# more backend-earphone-8888.sh

#!/bin/bash

. /etc/init.d/functions

node="1.1.1.1"

current="/home/bobo365/scripts/prod"

dest_user=‘remote‘
dest_passwd=‘xxxxxxx‘
package_name="earphone-1.08888.jar"
source_dir="${JENKINS_HOME}/jobs/${PROMOTED_JOB_NAME}/builds/${PROMOTED_NUMBER}/archive"
source_file="${PROMOTED_JOB_NAME}/builds/${PROMOTED_NUMBER}/archive/$package_name"
dest_temp="/data/deploy/pccode/earphone"
back_dir="/data/backup"
shell_dir="/data/deploy/script"
shell="earphone.sh"
back_prog="backend-earphone"
back_time=`date +"%Y-%m-%d-%s"`

NOW=`date +"%Y/%m/%d %T"`

echo "Clean the dir."
sshpass -p $dest_passwd ssh [email protected]$node -p 22 -o StrictHostKeychecking=no "rm -rf ‘$dest_temp‘/*" 

    if [ $? = 0 ]
    then
        echo $node $NOW clean the dir success | tee -a $current/logs/backend-earphone.log
    else
        echo $node $NOW clean the dir failed | tee -a $current/logs/backend-earphone.log
        echo  >> $current/backend-earphone.log
        exit 1
    fi

echo "Scp the file."
sshpass -p $dest_passwd scp -P22 -o StrictHostKeyChecking=no $source_dir/$package_name [email protected]$node:$dest_temp/$package_name 

    if [ $? = 0 ]
    then
        echo $node $NOW scp code success | tee -a $current/logs/backend-earphone.log
    else
        echo $node $NOW scp code failed | tee -a $current/logs/backend-earphone.log
        echo  >> $current/backend-earphone.log
        exit 1
    fi

echo "Deploy the file."
sshpass -p $dest_passwd ssh [email protected]$node -p 22 -o StrictHostKeychecking=no "/bin/bash $shell_dir/$shell" 

    if [ $? = 0 ]
    then
        echo $node $NOW deploy code success | tee -a $current/logs/backend-earphone.log
    else
        echo $node $NOW deploy code failed | tee -a $current/logs/backend-earphone.log
        echo  >> $current/backend-earphone.log
        exit 1
    fi

NOW=`date +"%Y/%m/%d %T"`
echo -e "$NOW: $prog complete of deploy ."

2.部署脚本02-earphone.sh (Jump server)

主要实现功能:

  • 拷贝文件至应用服务器(/data/deploy/pccode/earphone/earphone-1.08888.jar)
  • 调用应用服务器脚本(restart-headset.sh)进行代码的替换
  • 使用ansible
    • more /etc/ansible/hosts

      [promote]
      192.168.2.21
      192.168.2.22

[[email protected] script]# more earphone.sh

#!/bin/bash

current="/data/deploy/script"
source_dir="/data/deploy/pccode/earphone"
package_name="earphone-1.08888.jar"

ansible promote -m copy -a "src=$source_dir/$package_name dest=/root"

sleep 10

ansible promote -a "/bin/bash /root/restart-headset.sh"

3.部署脚本03-restart-headset.sh (application server)

主要实现功能:

  • 删掉现有earphone进程并重新启动

[[email protected] ~]# more restart-headset.sh

#!/bin/bash
package_name="earphone-1.08888.jar"
PID=`ps -ef|grep 8888|grep -v grep|awk -F " " ‘{print $2}‘`
kill -9 $PID

nohup /usr/local/jdk1.8.0_60/bin/java -jar $package_name &

4.在本例实现过程中,存在很大可以优化的地方

  • 脚本过于简单,很多地方缺少判断,健壮性有待提高
  • 部署脚本相互引用,过于繁琐,如果出现问题,排错有一定难度
  • 跨网络部署是否还有更好的方式,有待学习

原文地址:http://blog.51cto.com/bobo365/2129809

时间: 2024-11-10 07:49:21

一个简单的连续调用脚本部署代码的案例的相关文章

scapy编写简单的ARP扫描脚本 本课程基于 Python 的 scapy 模块编写,适合有 Python 基础的同学学习,最终完成一个简单的 ARP 扫描脚本。

scapy编写简单的ARP扫描脚本 本课程基于 Python 的 scapy 模块编写,适合有 Python 基础的同学学习,最终完成一个简单的 ARP 扫描脚本.

使用Socket模拟一个简单的Webservice调用

webservice是对socket的一个封装,让远程调用调用变得更加简单,那么使用socket究竟有多么麻烦呢?来看看. 做一个简单的天气查询: 服务端: public class SocketServer { public static void main(String[] args) { DataInputStream dataInputStream = null; DataOutputStream dataOutputStream = null; try { // 启动socket服务端

WebADI_建立一个简单的WebADI实现日记账上传(案例)

2014-06-01 BaoXinjian 一.摘要 WebADI原本固定资产导入和日记账导入的一些工具发展而来,因为财务部门人员大多非常熟悉Excel,希望竟可能尽量多的使用Excel工具去进行财务操作 而WebADI提供了这样一种可能性通过excel,将资料建立客制化的API或Interface处理,导入至EBS中 在11i中,WebADI可能还不够完善,还需要很多代码操作和注册 在R12中,WebADI的功能有进一步的加强 个人觉得,如果资料导入API或Interface不是太过频繁,数据

Linux初级脚本:一个简单的日志核查脚本

领导交代任务,要每天检查定时任务有没有执行.虽然简单但太繁琐,写了个脚本偷懒.顺便学习几个bash知识点.温故知新吧. #检查前一天的crontab日志有没有执行JOB1和JOB2两个定时任务 #检查数据库中的数据是否及时清理完 #!/bin/bashdeclare -i DB_STATUS=0 #由于日志日期只有月.日有效,时间不作判断,因此使用date -d参数格式化时间输出. #由于date命令用于grep,中间带空格,无法直接拼接,必须先赋予一个变量,然后用双引号标注该变量作为grep参

Python自动化测试例子--一个简单的自动化测试用例脚本--批量执行测试用例

#coding=utf-8 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common import keys from selenium.webdriver.support import select from selenium.common import exceptions import unittest,time,re class Bai

U3D 一个简单的角色控制脚本

之所以写这个脚本,是因为我想起了我还是新手的时候,那时为了一个角色控制脚本百度了半天还是一无所获,因为看不懂啊,都写的太高级了 希望这个脚本能够帮助那些 像曾经的我一样迷失于代码中的新手们能够清晰的理解这个角色控制的含义 ///角色控制脚本 public class Player : MonoBehaviour { public float m_speed=1;   //这个是定义的玩家的移动速度  之所以Public是因为为了方便对其进行调节  (public的属性和对象会在Unity中物体的

一个简单的redis调用类

能只能判断函数的调用规则,容错规则, 例如set函数 set($key, $value, $time = false) 根据time的真假来判断是否使用set,或者是setex函数 get函数 get($key, $json_decode = true) 根据json_decode来判断是否返回字符串或者是数组,默认返回数组 同时定义一个 private $tags = array( 'set'=>'set', 'setx'=>'set', ) 类内部使用魔术方法__call($name,$a

一个简单的中英文翻译脚本

这个脚本是很久之前写的,主要就是方便使用. 把它保存为 fy.sh 然后丢到 /usr/bin 目录下. 示例 [email protected]:~$ fy.sh hello world hello 你好世界 [email protected]-pc:~$ fy.sh 你好世界 Hello world 脚本代码如下 #! /bin/bash #curl etoc.sinaapp.com/英文 url="ctoe.sinaapp.com/" var=""$1 ech

一个简单的python web应用部署 nginx+uwsgi

1.环境配置 1)所需环境 操作系统 Mac os python3.6,web.py 0.40, uWSGI 2.0.15, uwsgitop 0.10, nginx 1.10.3 2)步骤 安装python3.6 -略 安装web.py easy_install web.py(推荐) pip install web.py 如果报错 可能还需安装utils db pip install utils pip install db 安装uWSGI pip install uwsgi 安装uwsgit