首页 文章 精选 留言 我的

精选列表

搜索[诊断自动化],共10000篇文章
优秀的个人博客,低调大师

腾讯Android自动化测试实战3.2.1 Robotium支持Native原理

3.2.1 Robotium支持Native原理 1. 获取控件原理 我们知道Android会为res目录下的所有资源分配ID,例如在布局xml文件中使用了 android:id="@+id/example_id",那么在Android工程编译时就会在R.java中相应地为该布局控件分配一个int型的ID,在Android工程中就可以通过Activity、Context或View等对象调用findViewById(int id)方法引用相应布局中的控件。因此,在测试工程中,如果是在源码的情况下,测试工程可以引用被测工程的代码,也即可以直接获得被测工程中R.java中的ID,因此可以通过这种方式直接根据ID获取控件。Robotium中根据ID获取控件的实现即包含该方式,如代码清单3-5所示。 代码清单3-5 Getter.getView p

优秀的个人博客,低调大师

自动化部署操作系统-Kickstart+PXE自动部署

Kickstart+PXE自动部署 目录: 无人值守安装简介 实战:PXE批量部署linux操作系统 前言 部署dhcp服务 HTTP服务 TFTP服务 复制PXE启动时需要的文件 修改引导启动菜单 配置kickstart自动安装文件(ks.cfg) 装机测试 无人值守安装简介 无人值守安装(Unattended Setup)指软件安装时无需任何用户干预,直接按默认或通过应答文件设置安装,这对于无特殊需求的用户或企业大批量部署安装操作系统及软件时非常方便。无人值守安装也称为静默安装,在安装过程中可以静默安装好预先设计集成的一些常用软件,安装结束以后软件就已经可以使用,很多软件都支持静默安装 PXE:Pre-boot Execution Environment:一种引导方式,计算机含有个PXE支持的网卡(NIC),即网卡中必须要有PXE Client,这样就可以通过PXE协议从网络启动计算机(网卡必须有PXE芯片),协议分为Client和Server端,PXE Client在网卡的ROM中,当计算机启动引导时,BIOS把PXE Client调入内存运行,由PXE Client将放置在远端的文件通过网络下载到本地运行。运行PXE协议需要设置DHCP服务器和TFTP服务器,DHCP服务器用来给PXE Client (需要安装系统的主机)分配一个IP地址,由于是给PXE Client分配IP地址,所以在配置DHCP服务器时需要增加相应的PXE设置!此外,PXE Client的ROM中,已经存在了TFTPClient。PXE Client 通过TFTP协议到TFTPServer上下载所需文件! KickStart是一种无人职守安装方式。KickStart的工作原理是通过记录典型的安装过程中所需人工干预填写的各种参数,并生成一个名为 ks.cfg的文件;在其后的安装过程中(不只局限于生成KickStart安装文件的机器)当出现要求填写参数的情况时,安装程序会首先去查找 KickStart生成的文件,当找到合适的参数时,就采用找到的参数,当没有找到合适的参数时,才需要安装者手工干预。这样,如果KickStart文件涵盖了安装过程中出现的所有需要填写的参数时,安装者完全可以只告诉安装程序从何处取ks.cfg文件,然后去忙自己的事情。等安装完毕,安装程序会根据ks.cfg中设置的重启选项来重启系统,并结束安装 实战:PXE批量部署linux操作系统 前言 在真实的生产环境中,我们如果遇到新上线很多服务器的话,装系统是件很麻烦的事情,而且工作效率很低,机房辐射这么大,我们掌握了批量安装的技能,就可以在一个小时内,解决几百台或者更多的系统安装,下面来讲下Kickstart+PXE自动部署,以后还会更新Cobbler大家记得关注下 部署dhcp服务 安装dhcp服务器并关闭selinux及iptables [root@localhost ~]# setenforce 0 #设置selinux为permissive模式 [root@localhost ~]# getenforcePermissive[root@localhost ~]# service iptables stop #关闭防火墙[root@localhost ~]# yum -y install dhcp #安装[root@localhost ~]# rpm -ql dhcp |grep "dhcpd.conf" #检查[root@localhost ~]# cp /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample /etc/dhcp/dhcpd.conf cp: overwrite `/etc/dhcp/dhcpd.conf'? y[root@localhost ~]# vim /etc/dhcp/dhcpd.conf #配置 配置dhcp服务器 ddns-update-style none; # 不进行DDNS的更新 ignore client-updates; # 不允许客户机更新DNS记录subnet 192.168.1.0 netmask 255.255.255.0 # 与下面的range配合声明可分配IP的范围{ option routers 192.168.1.1 ; # 设置网关 range 192.168.1.110 192.168.1.120; # 可分配的起始IP 结束IP option subnet-mask 255.255.255.0; # 设定netmask default-lease-time 21600; # 设置默认的IP租用期限 max-lease-time 43200; # 设置最大的IP租用期限 next-server 192.168.1.2 ; # 用来告知主机TFTP服务器的ip filename "/pxelinux.0"; # tftp服务器根目录下面的文件名(pxelinux.0是PXE专用的一个boot loader 文件)} 启动服务 [root@localhost ~]# service dhcpd start #启动[root@localhost ~]# chkconfig dhcpd on #设置开机启动[root@localhost ~]# netstat -nlptu |grep dhcp #检查服务[root@localhost ~]# sed -i 's/DHCPDARGS= /DHCPDARGS=eth1/g' /etc/sysconfig/dhcpd #仅在eth1上提供dhcp服务[root@localhost ~]# sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf&&sysctl -p #开启路由功能 HTTP服务 [root@localhost ~]# yum -y install httpd #安装[root@localhost ~]# chkconfig httpd on #开机自启动[root@localhost ~]# service httpd start #启动服务[root@localhost ~]# mkdir -p /var/www/html/os/6 #创建挂载目录[root@localhost ~]# mount /dev/cdrom /var/www/html/os/6 #挂载系统镜像 TFTP服务 [root@localhost ~]# yum -y install tftp-server #安装[root@localhost ~]# vim /etc/xinetd.d/tftp #配置service tftp{ socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /tftpboot #指定默认目录 disable = no #由原来的yes,改为no per_source = 11 cps = 100 2 flags = IPv4} 复制PXE启动时需要的文件 [root@localhost ~]# yum -y install syslinux #安装引导程序(提pxelinux.0文件)[root@localhost ~]# cp /usr/share/syslinux/pxelinux.0 /tftpboot/ #复制引导文件到TFTP的根目录[root@localhost ~]# cp /usr/share/syslinux/{vesamenu.c32,boot.msg,splash.jpg} /tftpboot/ [root@localhost ~]# cp /var/www/html/os/6/p_w_picpaths/pxeboot/vmlinuz /tftpboot/ [root@localhost ~]# cp /var/www/html/os/p_w_picpaths/pxeboot/initrd.img /tftpboot/[root@localhost ~]# mkdir -p /tftpboot/pxelinux.cfg [root@localhost ~]# cp /var/www/html/os/6/isolinux/isolinux.cfg /tftpboot/pxelinux.cfg/default #拷贝启动菜单 修改引导启动菜单 [root@localhost ~]# vim /tftpboot/pxelinux.cfg/default //然后修改下22行(即在后面添加ks=http://192.168.1.2/ks.cfg ksdevice=eth0 ip=dhcp)。第22行的意思是使安装程序通过http服务器访问kickstart文件。#配置文件label linux menu label ^Install or upgrade an existing system menu default kernel vmlinuz append initrd=initrd.img ks=http://192.168.1.2/ks.cfg ksdevice=eth0 ip=dhcp//检测文件[root@localhost ~]# chmod 644 /tftpboot/pxelinux.cfg/default #设置文件权限[root@localhost ~]# ls /var/lib/tftpboot #检查boot.msg initrd.img pxelinux.0 pxelinux.cfg splash.jpg vesamenu.c32 vmlinuz 配置kickstart自动安装文件(ks.cfg) [root@localhost ~]# yum -y install system-config-kickstart #建议在图形化界面内安装配置[root@localhost ~]# echo $LANGen_US.UTF-8[root@localhost ~]#.UTF-8[root@localhost ~]# system-config-kickstart 图形化界面配置:(终端中运行system-config-kickstart命令)图形界面不在介绍,可设置中文,和安装的选项没什么区别(保存到/var/www/html/目录下)前面引导菜单里面指定了 作者的ks.cfg 我是通过system-config-kickstart制作的 #platform=x86, AMD64, 或 Intel EM64T#version=DEVEL# Firewall configuration firewall --disabled #禁止防火墙# Install OS instead of upgradeinstall #告知安装程序,这是一次全新安装,而不是升级# Use network installationurl --url="http://192.168.1.2/os/6"# Root passwordrootpw --iscrypted $1$H8k1EIfB$BD1WyfZ4SkDNsypX1jjgR0 #设定root的密码# System authorization informationauth --useshadow --passalgo=sha512 #设置密码加密方式为sha512 启用shadow文件# Use text mode installtext #使用文本模式安装firstboot --disable #禁止firstboot,firstboot就是我们使用图形化安装完系统,重启后有一个初始设置# System keyboardkeyboard us #使用美式键盘# System languagelang en_US #默认语言是英语# SELinux configurationselinux --disabled #禁止selinux# Installation logging levellogging --level=info #设定安装过程中的日志级别# Reboot after installationreboot #设定安装完成后重启# System timezonetimezone Asia/Shanghai #设置时区# Network informationnetwork --bootproto=dhcp --device=eth0 --onboot=on #设置安装完成后的网络# System bootloader configurationbootloader --location=mbr# Clear the Master Boot Recordzerombr #清空mbr# Partition clearing informationclearpart --all --initlabel #清空所有分区# Disk partitioning informationpart /boot --fstype="ext4" --size=200 #新建/boot分区part swap --fstype="swap" --size=2048 #新建swap分区part / --fstype="ext4" --grow --size=1 #新建swap分区%post#加上优化脚本mkdir /shellcd /shell/usr/bin/wget http://192.168.1.2/shell.tar.gz/bin/tar -zxf shell.tar.gz/bin/sh *.sh %end#安装包我选择的是Basic模式,添加了中文支持%packages@base@chinese-support@development@kde-desktop%end 注意:如果自己制作ks.cfg root的密码生成 grub-crypt #密方式为sha512生成的密码Password: rhceRetype password: rhce$6$QHOksakPohOoVUL9$CNCHfAMYDZZZzZixAGGKCWdPkK8qVvpRk9DkaDOJtrRXlJkzk5GHMZ9zqCTdr8Qiozl9qHOVT5XnbGaZKt06d0 装机测试 新建一台虚拟机,如果不是千万不要把网卡调到第一位,不然会一直重装,客户端必须能获取分配的地址 安装成功,登录界面

优秀的个人博客,低调大师

Linux Shell脚本之远程自动化部署java maven项目

脚本功能: 检查运行环境(包括运行权限、网络、DNS解析等),自动从git上获取java maven项目工程源码,在机器A上build,build完成后,备份机器B上原有的配置文件(如果存在),将Class、Lib文件和备份的配置文件等上传到机器B,重新启动机器B上的服务以便变更生效。 脚本特点: 1.(与之前的自动部署脚本相比)全新优化了脚本代码,更friendly,结构更紧凑、逻辑更加严谨 2.Public header删除了无用或者不好用的有色彩显示函数,并修正了WORKDIR不是绝对路径可能导致的bug 3.修正了域名解析判断是否正常的一个bug,该bug可能导致遇到无法解析后不断尝试解析 4.全新的通用main函数,自带文件锁和自动接受处理INT、TERM、EXIT进程信号,整个脚本更加的模块化和标准化 5.针对项目方面,增加了对java项目配置文件的备份和还原功能,增加了对docker容器的支持 使用办法: 将脚本上传到Linux任意目录,至少修改三个变量(分别是项目源码的git地址、部署对象的IP、部署对象的目标目录): project_clone="ssh://git@xxx/xxx.git" deploy_target_host_ip="xxx.xxx.xxx.xxx" project_top_directory_to_target_host="/path/to/deploy/project" 如果此项目依赖于其他项目,则修改“project_clone_depends_1”变量,如果要想使部署后自动生效,则,可以将启动脚本放在项目git源码下的bin目录下,默认名称为“startup.sh” 如果此项目部署在目标主机的docker容器内,则修改“docker_container_name”变量,以便重启容器生效。 多个容器启动的依赖关系的处理已经在TODO计划中。 首次执行需要将配置文件准确的写入项目文件中,一次写入后期无须修改,如需修改,直接修改部署对象主机上的配置文件即可。 在任意位置使用下方命令运行即可,脚本一旦运行一次,自动添加可执行权限,无须手动添加。 bash/path/to/this.sh 可以从GitHub上获取最新脚本内容:https://github.com/DingGuodong/AutomaticDeployJavaMavenProject 脚本内容: #!/bin/bash #Name:doDeploy.sh #ExecutethisshellscripttodeployJavaprojectsbuiltbyMavenautomaticallyonremotehosts. #debugoption #_XTRACE_FUNCTIONS=$(set+o|grepxtrace) #set-oxtrace #defineuserfriendlymessages header=" Function:ExecutethisshellscripttodeployJavaprojectsbuiltbyMavenautomaticallyonremotehosts. License:Opensourcesoftware " #definevariables #Wheretogetsourcecode project_clone_depends_1="" project_clone="ssh://git@xxx/xxx.git" deploy_target_host_ip="xxx.xxx.xxx.xxx" project_top_directory_to_target_host="/path/to/deploy/project" docker_container_name="" #Settinghowmanydaysdoyouwantsaveoldreleases,defaultis10days save_old_releases_for_days=10 #enddefinevariables #pretreatment test-z${project_clone_depends_1}||project_clone_target_depends_1="`echo${project_clone_depends_1}|awk-F'[/.]+''{print$(NF-1)}'`" project_clone_target="`echo${project_clone}|awk-F'[/.]+''{print$(NF-1)}'`" project_clone_repository_name=${project_clone_target} #endpretreatment #Publicheader #============================================================================================================================= #resolvelinks-$0maybeasymboliclink #learnfromapache-tomcat-6.x.xx/bin/catalina.sh PRG="$0" while[-h"$PRG"];do ls=`ls-ld"$PRG"` link=`expr"$ls":'.*->\(.*\)$'` ifexpr"$link":'/.*'>/dev/null;then PRG="$link" else PRG=`dirname"$PRG"`/"$link" fi done #Getstandardenvironmentvariables PRGDIR=`dirname"$PRG"` #echocolorfunction,smarter,learnfromlnmp.orglnmpinstall.sh functionecho_r(){ #Colorred:Error,Failed [$#-ne1]&&return1 echo-e"\033[31m$1\033[0m" } functionecho_g(){ #Colorgreen:Success [$#-ne1]&&return1 echo-e"\033[32m$1\033[0m" } functionecho_y(){ #Coloryellow:Warning [$#-ne1]&&return1 echo-e"\033[33m$1\033[0m" } functionecho_b(){ #Colorblue:Debug,friendlyprompt [$#-ne1]&&return1 echo-e"\033[34m$1\033[0m" } #endechocolorfunction,smarter #WORKDIR="`realpath${WORKDIR}`" WORKDIR="`readlink-f${PRGDIR}`" #endpublicheader #============================================================================================================================= USER="`id-un`" LOGNAME="$USER" if[$UID-ne0];then echo"WARNING:Runningasanon-rootuser,\"$LOGNAME\".Functionalitymaybeunavailable.Onlyrootcanusesomecommandsoroptions" fi command_exists(){ #which"$@">/dev/null2>&1 command-v"$@">/dev/null2>&1 } check_command_can_be_execute(){ [$#-ne1]&&return1 command_exists$1 } check_network_connectivity(){ echo_b"checkingnetworkconnectivity..." network_address_to_check=8.8.4.4 stable_network_address_to_check=114.114.114.114 ping_count=2 ping-c${ping_count}${network_address_to_check}>/dev/null retval=$? if[${retval}-ne0];then ifping-c${ping_count}${stable_network_address_to_check}>/dev/null;then echo_g"Networkto$stable_network_address_to_checksucceed!" echo_y"Note:networkto$network_address_to_checkfailedonce!maybejustsomepackagesloss." elif!iproute|grepdefault>/dev/null;then echo_r"Networkisunreachable,gatewayisnotset." exit1 elif!ping-c2$(iproute|awk'/default/{print$3}')>/dev/null;then echo_r"Networkisunreachable,gatewayisunreachable." exit1 else echo_r"Networkisblocked!" exit1 fi elif[${retval}-eq0];then echo_g"Checknetworkconnectivitypassed!" fi } check_name_resolve(){ echo_b"checkingDNSnameresolve..." target_name_to_resolve="github.com" stable_target_name_to_resolve="www.aliyun.com" ping_count=1 if!ping-c${ping_count}${target_name_to_resolve}>/dev/null;then echo_y"Namelookupfailedfor$target_name_to_resolvewith$ping_counttimes" ifping-c${ping_count}${stable_target_name_to_resolve}>/dev/null;then echo_g"Namelookupsuccessfor$stable_target_name_to_resolvewith$ping_counttimes" fi eval_md5sum_of_nameserver_config="`md5sum/etc/resolv.conf|awk'{print$1}'`" iftest${eval_md5sum_of_nameserver_config}="674ea91675cdfac353bffbf49dc593c3";then echo_y"Nameserverconfigfileisvalidated,butnamelookupfailedfor$target_name_to_resolvewith$ping_counttimes" return0 fi [-f/etc/resolv.conf]&&cp/etc/resolv.conf/etc/resolv.conf_$(date+%Y%m%d%H%M%S)~ cat>/etc/resolv.conf<<eof nameserver114.114.114.114 nameserver8.8.4.4 eof check_name_resolve else echo_g"CheckDNSnameresolvepassed!" return0 fi } functioncheckOtherDependencies(){ echo_b"Checkingotherdependenciesfordeployprocedure..." echo_b"\tCheckingusercustomizedvariables..." #Refer: #if[-z${var+x}];then #echo"varisunset";elseecho"varissetto'$var'" #fi #if["$varx"="x"];then #echo"varisempty";elseecho"varissetto'$var'" #fi #if[-z$var];then #echo"varisempty";elseecho"varissetto'$var'" #fi if[[-z${project_clone}]];then echo_r"Error:project_cloneisundefined!" exit1 elif[[-z${deploy_target_host_ip}]];then echo_r"Error:deploy_target_host_ipisundefined!" exit1 elif[[-z${project_top_directory_to_target_host}]];then echo_r"Error:project_top_directory_to_target_hostisundefined!" exit1 fi echo_g"\tCheckingusercustomizedvariablespassed!" echo_b"\tCheckingdiskspaceavailable..." disk_space_available=`df${WORKDIR}|tail-n1|awk'{print$(NF-2)}'` if[[${disk_space_available}-lt2097152]];then echo_y"Warning:Diskspaceof$WORKDIRissmallerthan2GB" #exit1 else echo_g"\tCheckingdiskspaceavailablepassed!" fi echo_g"Allrequireddependenciescheckpassed!" } functionsetDirectoryStructureOnLocalHost(){ if[-f${WORKDIR}/.capistrano_ds_lock];then echo_g"Setdirectorystructurehasbeendone,skipping." return fi echo_b"Settingdirectorystructure..." #learnfromcapistrano #Refer:http://capistranorb.com/documentation/getting-started/structure/ #Refer:http://capistranorb.com/documentation/getting-started/structure/# #├──current->/var/www/my_app_name/releases/20150120114500/ #├──releases #│├──20150080072500 #│├──20150090083000 #│├──20150100093500 #│├──20150110104000 #│└──20150120114500 #├──repo #│└──<VCSrelateddata> #├──revisions.log #└──shared #└──<linked_filesandlinked_dirs> #currentisasymlinkpointingtothelatestrelease.Thissymlinkisupdatedattheendofasuccessfuldeployment.Ifthedeploymentfailsinanystepthecurrentsymlinkstillpointstotheoldrelease. #releasesholdsalldeploymentsinatimestampedfolder.Thesefoldersarethetargetofthecurrentsymlink. #repoholdstheversioncontrolsystemconfigured.Incaseofagitrepositorythecontentwillbearawgitrepository(e.g.objects,refs,etc.). #revisions.logisusedtologeverydeployorrollback.Eachentryistimestampedandtheexecutinguser(usernamefromlocalmachine)islisted.DependingonyourVCSdatalikebranchnamesorrevisionnumbersarelistedaswell. #sharedcontainsthelinked_filesandlinked_dirswhicharesymlinkedintoeachrelease.Thisdatapersistsacrossdeploymentsandreleases.Itshouldbeusedforthingslikedatabaseconfigurationfilesandstaticandpersistentuserstoragehandedoverfromonereleasetothenext. #Theapplicationiscompletelycontainedwithinthepathof:deploy_to.Ifyouplanondeployingmultipleapplicationstothesameserver,simplychooseadifferent:deploy_topath. #Checkdirectoriesfordeploy [!-d${WORKDIR}/release]&&mkdir${WORKDIR}/release [!-d${WORKDIR}/repository]&&mkdir${WORKDIR}/repository [!-d${WORKDIR}/share]&&mkdir${WORKDIR}/share #enddirectoriesstructure #Additionaldirectoriesstructureforfulldeployoperation #forbackupremotehostconfigfile [!-d${WORKDIR}/backup]&&mkdir${WORKDIR}/backup #setadirectoriesstructurelock touch${WORKDIR}/.capistrano_ds_lock echo_g"Setdirectorystructuresuccessfully!" } functioncleanOldReleases(){ save_days=${save_old_releases_for_days:-10} if[!-d${WORKDIR}/release];then echo_b"CanNOTfindreleasedirectory,skipping." return fi need_clean=$(find${WORKDIR}/release-mtime+${save_days}-execls'{}'\;) if[!-z${need_clean}];then echo_g"Expiredreleasesfoundandwillberemovedfromproject!" find${WORKDIR}/release-mtime+${save_days}-execrm-rf'{}'\; if[$?-eq0];then echo_g"Expiredreleaseshaveremovedfromproject!" else echo_r"CanNOTremoveexpiredreleases,pleasealtertoAdminusers." fi else echo_g"Allreleasesarenotexpired,skipping." fi } #git_project_clonerepositorybranch functiongit_project_clone(){ set-oerrexit [$#-ge1]&&project_clone_repository="$1" project_clone_repository_name="`echo${project_clone_repository}|awk-F'[/.]+''{print$(NF-1)}'`" project_clone_directory=${WORKDIR}/repository/${project_clone_repository_name} iftest-n$2;then branch="$2" else branch="develop" fi iftest!-d${project_clone_directory};then echo_b"gitclonefrom$project_clone_repository" gitclone${project_clone_repository}${project_clone_directory}>>${WORKDIR}/git_$(date+%Y%m%d)_$$.log2>&1 #TODO(GuodongDing)getbranchnamesorrevisionnumbersfromVCSdata cd${project_clone_directory} gitcheckout${branch}>>${WORKDIR}/git_$(date+%Y%m%d)_$$.log2>&1 cd.. echo_g"gitclonefrom$project_clone_repositorysuccessfully!" else echo_b"gitpullfrom$project_clone_repository" cd${project_clone_directory} gitpull>>${WORKDIR}/git_$(date+%Y%m%d)_$$.log2>&1 gitcheckout${branch}>>${WORKDIR}/git_$(date+%Y%m%d)_$$.log2>&1 #TODO(GuodongDing)getbranchnamesorrevisionnumbersfromVCSdata cd.. echo_g"gitpullfrom$project_clone_repositorysuccessfully!" fi set+oerrexit } functionmaven_build_project_deprecated(){ set-oerrexit echo_b"Domvnbuildjavaproject..." check_command_can_be_executemvn [$#-ge1]&&project_clone_repository="$1" project_clone_repository_name="`echo${project_clone_repository}|awk-F'[/.]+''{print$(NF-1)}'`" project_clone_directory=${WORKDIR}/repository/${project_clone_repository_name} cd${project_clone_directory} mvninstall>>${WORKDIR}/mvn_build_$(date+%Y%m%d)_$$.log2>&1 mvncleanpackage>>${WORKDIR}/mvn_build_$(date+%Y%m%d)_$$.log2>&1 cd.. echo_g"Domvnbuildjavaprojectfinishedwithexitcode0!" set+oerrexit } functionmaven_build_project(){ echo_b"Domvnbuildjavaprojectfor`echo$1|awk-F'[/.]+''{print$(NF-1)}'`..." check_command_can_be_executemvn [$#-ge1]&&project_clone_repository="$1" project_clone_repository_name="`echo${project_clone_repository}|awk-F'[/.]+''{print$(NF-1)}'`" project_clone_directory=${WORKDIR}/repository/${project_clone_repository_name} cd${project_clone_directory} mvninstall>>${WORKDIR}/mvn_build_$(date+%Y%m%d)_$$.log2>&1 retval=$? if[${retval}-ne0];then echo_r"mvninstallfailed!Moredetailsreferto${WORKDIR}/mvn_build_$(date+%Y%m%d)_$$.log" exit1 else echo_g"mvninstallfor${project_clone_repository_name}successfully!" fi mvncleanpackage>>${WORKDIR}/mvn_build_$(date+%Y%m%d)_$$.log2>&1 retval=$? if[${retval}-ne0];then echo_r"mvncleanpackagefor${project_clone_repository_name}failed!Moredetailsreferto${WORKDIR}/mvn_build_$(date+%Y%m%d)_$$.log" exit1 else echo_g"mvncleanpackagefor${project_clone_repository_name}successfully!" fi cd.. echo_g"Domvnbuildjavaprojectfinishedfor${project_clone_repository_name}withexitcode0!" } functioncheck_ssh_can_be_connect(){ [$#-ne1]&&return1 echo_b"Checkifcansshtoremotehost$1..." check_command_can_be_executessh||return1 ssh-i/etc/ssh/ssh_host_rsa_key-p22-oStrictHostKeyChecking=noroot@$1"uname-a>/dev/null2>&1" retval=$? if[${retval}-ne0];then echo_r"Checksshtoremotehost$1failed!" exit1 else echo_g"Checksshtoremotehost$1successfully!" fi } #ssh_execute_command_on_remote_hosthostnamecommand functionssh_execute_command_on_remote_host(){ [$#-ne2]&&return1 ssh-i/etc/ssh/ssh_host_rsa_key-p22-oStrictHostKeyChecking=noroot@$1"$2">>${WORKDIR}/ssh_command_$(date+%Y%m%d)_$$.log retval=$? if[${retval}-ne0];then echo_r"sshexecutecommandonremotehost$2failed!Moredetailsreferto${WORKDIR}/ssh_command_$(date+%Y%m%d)_$$.log" return1 else echo_g"sshexecutecommandonremotehost$2successfully!" return0 fi } functionrestart_docker_container(){ echo_b"Restartingdockercontainer..." [$#-ne1]&&return1 #TODO(GuodongDing)ifweneedrestartmorerelateddockercontainer localdocker_container_name="" test-n$1&&docker_container_name="$1" ssh_execute_command_on_remote_host"dockerrestart$docker_container_name" retval=$? if[${retval}-ne0];then echo_r"restartdockercontainerfor$docker_container_namefailed!" exit1 else echo_g"restartdockercontainerfor$docker_container_namesuccessfully!" return0 fi } #scp_local_files_to_remote_hostlocal_pathremote_hostnameremote_path functionscp_local_files_to_remote_host(){ [$#-ne3]&&return1 [!-d$1-a!-f$1]&&return1 check_ssh_can_be_connect$2 scp-i/etc/ssh/ssh_host_rsa_key-P22-oStrictHostKeyChecking=no-rp$1root@$2:$3>/dev/null2>&1 retval=$? if[${retval}-ne0];then echo_r"scplocalfilestoremotehostfailed!" exit1 else echo_g"scplocalfilestoremotehostsuccessfully!" fi } #scp_remote_files_to_local_hostremote_hostnameremote_pathlocal_path functionscp_remote_files_to_local_host(){ [$#-ne3]&&return1 check_ssh_can_be_connect$1 scp-i/etc/ssh/ssh_host_rsa_key-P22-oStrictHostKeyChecking=no-rproot@$1:$2$3>/dev/null2>&1 retval=$? if[${retval}-ne0];then echo_r"scpremotefilestolocalhostfailed!" exit1 else echo_g"scpremotefilestolocalhostsuccessfully!" fi } functionbackup_remote_host_config_files(){ echo_b"backupremotehostconfigfiles..." scp_remote_files_to_local_host${deploy_target_host_ip}${project_top_directory_to_target_host}/*${WORKDIR}/backup #getconfigfiles ["$(ls-A${WORKDIR}/backup)"]&&find${WORKDIR}/backup/.-typef!-name.-a!-name'*.xml*'-a!-name'*.properties*'-execrm-f--'{}'\; #removeemptydirectory find${WORKDIR}/backup/.-empty-typed-delete #TODO(GuodongDing)improvementshere echo_g"backupremotehostconfigfilesfinished." } functionrollback_remote_host_config_files(){ echo_b"rollbackremotehostconfigfiles..." #scp_local_files_to_remote_host${WORKDIR}/backup${deploy_target_host_ip}${project_top_directory_to_target_host} saved_IFS=$IFS IFS='' cd${WORKDIR}/current forfilein${WORKDIR}/backup/*;do scp_local_files_to_remote_host${file}${deploy_target_host_ip}${project_top_directory_to_target_host} done cd${WORKDIR} IFS=${saved_IFS} #TODO(GuodongDing)ifsaveremotehostconfigfiles #someops #TODO(GuodongDing)improvementshere echo_g"rollbackremotehostconfigfilesfinished." } functiondeploy(){ [-n"$header"]&&echo"$header" #checkadirectorieslock,Note:thisisredundant if[[!-f${WORKDIR}/.lock]];then setDirectoryStructureOnLocalHost fi cleanOldReleases #dodependencieschecking check_network_connectivity check_name_resolve checkOtherDependencies check_ssh_can_be_connect${deploy_target_host_ip} #docorejob #TODO(GuodongDing)ifweneedagit_project_clone"$project_clone_depends_1"hereusingautojudgmentstatement test-z${project_clone_depends_1}||git_project_clone"$project_clone_depends_1" git_project_clone"$project_clone" test-z${project_clone_depends_1}||maven_build_project"$project_clone_depends_1" maven_build_project"$project_clone" cd${WORKDIR} #links_target_directory_to_current #Makedirectorytoreleasedirectory iftest!-d${WORKDIR}/release-o!-d${WORKDIR}/share;then echo_r"capistranodirectorystructureisbroken,makesurethefile.capistrano_ds_lockisdeletedbeforeanewdeploy!" exit1 #test-f${WORKDIR}/.capistrano_ds_lock&&\rm-rf${WORKDIR}/.capistrano_ds_lock fi new_release_just_created="$WORKDIR/release/$(date+%Y%m%d%H%M%S)" [!-d${new_release_just_created}]&&mkdir${new_release_just_created} [-d${WORKDIR}/repository/${project_clone_repository_name}/target/${project_clone_repository_name}/]&&\ \cp-rf${WORKDIR}/repository/${project_clone_repository_name}/target/${project_clone_repository_name}/*${new_release_just_created} #Makesourcecodesymboliclinktocurrent ([-f${WORKDIR}/current]||[-d${WORKDIR}/current])&&rm-rf${WORKDIR}/current ln-s${new_release_just_created}${WORKDIR}/current #backupremotehostconfigfiles backup_remote_host_config_files #scp_local_files_to_remote_host${WORKDIR}/current/${deploy_target_host_ip}${project_top_directory_to_target_host} saved_IFS=$IFS IFS='' cd${WORKDIR}/current forfilein${WORKDIR}/current/*;do scp_local_files_to_remote_host${file}${deploy_target_host_ip}${project_top_directory_to_target_host} done cd${WORKDIR} IFS=${saved_IFS} #rollbackremotehostconfigfiles rollback_remote_host_config_files #Moveconfandlogsdirectivesfromreleasetoshare [-d${WORKDIR}/release/conf]&&mv${WORKDIR}/release/conf${WORKDIR}/share/conf [-d${WORKDIR}/release/logs]&&mv${WORKDIR}/release/logs${WORKDIR}/share/logs #Makeconfandlogssymboliclinktocurrent [-d${WORKDIR}/share/conf]&&ln-s${WORKDIR}/share/conf${WORKDIR}/current/conf [-d${WORKDIR}/share/logs]&&ln-s${WORKDIR}/share/logs${WORKDIR}/current/logs #Startserviceorvalidatestatus if[[-e${WORKDIR}/current/bin/startup.sh]];then ${WORKDIR}/current/bin/startup.shstart RETVAL=$? else #TODO(GuodongDing)externalhealthcheck test-z${docker_container_name}||restart_docker_container${docker_container_name} RETVAL=$? fi #ifstartedok,thencreateaworkableprogramtoafile if[[${RETVAL}-eq0]];then #Notecatwitheofmuststartatrow0,andwitheofendonly,suchasnoblankspaces,etc cat>${WORKDIR}/share/workable_program.log<<eof ${new_release_just_created} eof echo_g"Deploysuccessfully!" echo_g"currentworkableversionis$(cat${WORKDIR}/share/workable_program.log)" #ls--color=auto-l${WORKDIR}/current #ls--color=auto-l${WORKDIR}/current/ else echo_r"Error:Deployfailed!" ${WORKDIR}/`basename$0`rollback fi } #Rollbacktolastrightconfiguration functionrollback(){ [-n"$header"]&&echo"$header" echo_b"Rollbacktolastrightconfiguration..." #Thekeyisfindlastfileswhichcanwork WORKABLE_PROGRAM=`cat${WORKDIR}/share/workable_program.log` if[[-z${WORKABLE_PROGRAM}]];then echo_r"Error:CanNOTfindworkablereleaseversion!Pleasecheckifitisfirstdeployment!" exit1 fi #Stopserviceifwehave if[[-e${WORKDIR}/current/bin/startup.sh]];then ${WORKDIR}/current/bin/startup.shstop fi #Removefaileddeploy rm-rf${WORKDIR}/current #Remakesourcecodesymboliclinktocurrent ln-s${WORKABLE_PROGRAM}${WORKDIR}/current #Remakeconfandlogssymboliclinktocurrent [-d${WORKDIR}/share/conf]&&ln-s${WORKDIR}/share/conf${WORKDIR}/current [-d${WORKDIR}/share/logs]&&ln-s${WORKDIR}/share/logs${WORKDIR}/current #Startserviceorvalidatestatus if[[-e${WORKDIR}/current/bin/startup.sh]];then ${WORKDIR}/current/bin/startup.shstart RETVAL=$? else #TODO(GuodongDing)externalhealthcheck test-z${docker_container_name}||restart_docker_container${docker_container_name} RETVAL=$? fi #ifstartedok,thencreateaworkableprogramtoafile if[[${RETVAL}-eq0]];then echo_g"Rollbacksuccessfully!" echo_g"currentworkableversionis$WORKABLE_PROGRAM" #ls--color=auto-l${WORKDIR}/current fi } functiondestroy(){ [-n"$header"]&&echo"$header" #echoaWarningmessage echo_y"Warning:Thisactionwilldestroyallthisproject,andthisisunrecoverable!" answer="n" echo_y"Doyouwanttodestroythisproject?" read-p"(Defaultno,ifyouwantpleaseinput:y,ifnotpleasepresstheenterbutton):"answer case"$answer"in y|Y|Yes|YES|yes|yES|yEs|YeS|yeS) #deleteallfileexpectforthisscriptself #find:warning:Unixfilenamesusuallydon'tcontainslashes(thoughpathnamesdo).Thatmeansthat'-name`./deploy.sh''willprobablyevaluatetofalseallthetimeonthissystem.Youmightfindthe'-wholename'testmoreuseful,orperhaps'-samefile'.Alternatively,ifyouareusingGNUgrep,youcoulduse'find...-print0|grep-FzZ`./deploy.sh''. #echo$WORKDIR/ #find-L$WORKDIR-typef!-name"$(basename$0)"-execls--color=auto-al{}\; #find-L.-typef!-name"deploy.sh"-execls--color=auto-al{}\; #find-L.-typed-execls--color=auto-al{}\; #find-L./-maxdepth1!-name"deploy.sh"!-wholename"./" #ls|grep-v"filename"|xargsrm-rf find-L${WORKDIR}-maxdepth1!-name"$(basename$0)"!-wholename"$WORKDIR"-execrm-rf'{}'\; if[$?-eq0];then test-f${WORKDIR}/.capistrano_ds_lock&&\rm-rf${WORKDIR}/.capistrano_ds_lock echo_g"Destroythisprojectsuccessfully!Nowwillexitwithstatus0." exit0 else echo_r"Error:somethinggowrong!PleasecheckoraltertoAdminuser!" exit1 fi ;; n|N|No|NO|no|nO) echo_g"destroyactioniscancel" exit0 ;; *) echo_r"Areyoukiddingme?Youareabadkid!" exit1 ;; esac } functionmain(){ lock_filename="lock_$$_$RANDOM" #lock_filename_full_path="/var/lock/subsys/$lock_filename" lock_filename_full_path="/var/lock/$lock_filename" if(set-onoclobber;echo"$$">"$lock_filename_full_path")2>/dev/null;then trap'rm-f"$lock_filename_full_path";exit$?'INTTERMEXIT #Justatestforcallitself,commentit if[[$#-ne1]];then #$0deploy [!-x${WORKDIR}/`basename$0`]&&chmod+x${WORKDIR}/`basename$0` ${WORKDIR}/`basename$0`deploy exit0 fi case$1in deploy) deploy ;; rollback) rollback ;; destroy) destroy ;; help|*) echo"Usage:$0{deploy|rollback|destroy}with$0itself" exit1 ;; esac rm-f"$lock_filename_full_path" trap-INTTERMEXIT else echo"Failedtoacquirelock:$lock_filename_full_path" echo"heldby$(cat${lock_filename_full_path})" fi } main$@ #debugoption #${_XTRACE_FUNCTIONS} 运行效果: 可以尝试使用Chrome浏览器打开该页面,右键单击,选择“在新标签页中打开图片”查看清晰大图。 推荐Windows用户使用PyCharm(5.0.x)结合Bash Support插件编辑bash shell script文件。 注:由于该脚本的大幅度更新,因此最新的运行效果图可以自行运行观察。 --end--

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册