怎么把 python 脚本加入进 jenkins执行python,就是在构建前先执行脚本

Jenkins+cocoapods+pgy+多版本 持续集成
日期: 17:05:59
来源:ITeye
Jenkins+cocoapods+pgy+多版本 持续集成
持续集成?
持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
先看下我的需求
持续集成,
使用cocoapod管理第三方控件,
使用pgy分发,
同时管理三个版本(内测版,开发版,AppStore上线版),并且每个版本都要做到尽量高自动化的持续集成
再来看看思路
使用Jenkins进行持续集成
使用多Scheme管理多版本,并通过配置Jenkins编译不同的Scheme做到多版本自动化持续集成
当然持续集成的前提是单元测试尽量覆盖全面
有了思路就一步一步做吧。
1. 准备好xcode项目scheme配置,做到各个版本分离
添加两个scheme
我们在项目里需要有两个 Scheme. 这两个 Scheme 在 Debug 时候的行为是一样的, 但在 Archive 的时候, 一个用于 Staging 版本发布内部测试, 一个用于 App Store 发布.
Scheme 的设置入口在菜单上: “Product” -& “Scheme” -& “Manage Schemes”.
添加新的编译配置 ForBeta
设置scheme对应的编译配置
对应 App Store 的 Scheme 设置里, Run 和 Test 的 Build Configuration 都使用 Debug, Profile 和 Archive 使用 Release.
对应 Staging (Beta) 的 Scheme 设置里, Run 和 Test 也用 Debug, Profile 和 Archive 使用 ForBeta.
不同的版本使用不同的icon
接着就是 Icon. 现在大家应该都用 Xcode 5 了吧! 既然用了, 那就多用用新功能, Icon 设置这块我使用了 Media Assets. 如果你的老项目还没有启用, 那就麻烦你在对应 Target 的 General 下启用一下.
在 Media Assets 中 (在项目中的默认名字应该是 Images.xcassets), 点击菜单 “Editor” -& “New App Icon”, 建立两个新的 App Icon, 分别对应 Debug 和 Staging 版本. 然后把之前准备好的图标分别拖进去. 如图:
设置好 Media Assets 后, 还要在对应 Target 的 Build Settings 里分别设置不同版本使用不同的 App Icon. 如图:
这样设置好, 不同版本的应用就拥有了各自不同的图标了.
再下来就是按照我们前面定义的 Bundle ID 和各个版本的对应关系来进行设置了.
我们需要在 Build Settings 中定义一个变量. 入口在: “Editor” -& “Add Build Setting” -& “Add User-Defined Setting”.
然后在对应 Target 的 Info 里把 Bundle ID 设置为我们刚才定义的变量.
这样, 项目在使用不同的配置文件编译的时候就能分别利用不同的 Bundle ID 了.
设置了图标, 如果觉得有必要把应用名称也顺便区分一下的话, 也是可以的.
我们需要在 Build Settings 中再定义一个变量. 比如我是这么定义的:
然后在应用名称的设置那里使用这个变量:
到此为止,我们就可以选择不同的scheme进行编译不同的版本了,下面做持续集成
因为 Jenkins 的pkg安装包默认安装位置为shared文件夹,需要权限修改,pod install 无法执行sudo命令,所以放弃pkg安装。
安装之前由于运行Jenkins时会自动寻找home路径,提前设置好JENKINS_HOME
在/etc/profile 添加一行 export JENKINS_HOME="/Users/yourname/jenkins"
直接下载war包放到个人目录
/Users/yourname/jenkins
使用命名 java -jar jenkins.war --httpPort=8008 &
安装并运行
打开localhost:8008 进入到jenkins-&系统管理-&管理插件安装两个插件 cocoapod 和 xcode,一个是用来管理依赖库的,一个是进行xcode编译选项设置的
这里有一个选项 xcode schemes file,你可以选择填写你在项目利配置好的 xxxx-Beta 这样就可以打包不同版本的ipa了
.ipa filename pattern
ipa文件名称,写到跟jenkins项目名一样,便于区分,而且下面python脚本也会用到定位该文件
target -&Configuration 这里可以根据配置写ForBeta ,Debug, Release
添加构建步骤 Execute Shell 进行单元测试
先安装插件,生成jenkins可见的测试报告,然后添加shell if [-d "test-reports"]
rm -rf test-reports
xcodebuild test -workspace yourProject.xcworkspace -scheme yourscheme -sdk iphonesimulator | ocunit2junit
使用python脚本进行pgy上传和通知邮件发送
添加构建步骤 Excute Shell
python ${JENKINS_HOME}/workspace/pgyUpload/pgyDevUpload.py
中可以做如下修改,进行不同的版本分辨上传道不同的pgy上 if 'jenkins-MNCats-Dev' in jenkins_build_number:
uKey = '开发key'
_api_key = '开发api'
projectName = '与你在jenkins中写的项目名称相同,例:xxx-Dev'
print projectName
if 'jenkins-MNCats-Alpha' in jenkins_build_number:
uKey = 'alphakey'
_api_key = 'alphaapi'
projectName = '与你在jenkins中写的项目名称相同,例:xxx-Alpha'
print projectName
if 'jenkins-MNCats-AppStore' in jenkins_build_number:
uKey = 'AppStore版本pgy key'
_api_key = 'AppStore版本api key'
projectName = '与你在jenkins中写的项目名称相同,例:xxx-AppStore'
print projectName
def get_ipa_file_path():
ipa_file_workspace_path = '/Users/yourname/jenkins/workspace/'+projectName+'/build/'+projectName+'.ipa'
if os.path.exists(ipa_file_workspace_path):
return ipa_file_workspace_path
ok,到此位置我们基本达成了我们的目的,每天鼠标一点,就可以交版本下班了~
本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
1 、EditText输入的文字为密码形式的设置 (1)通过.xml里设置:
把该EditText设为:android:password="true" // 以”.”形式显示文本 (2)在代码里设置: 通过设置EditText的setTransformationMethod()方法来实现隐藏密码或这显示密码。 editText.setTransformationMethod(PasswordTransformationMethod.getInstance());//设置密码为不可见。 2 、(1)Edi
摘要 本文和大家重点学习一下五类CSS选择器,我们不必通篇给每一个元素定义类(class)或ID,通过合适的组织,可以用最简单的方法实现同样的效果。 最常用的五类CSS选择器 一些新手朋友对选择器一知半解,不知道在什么情况下运用什么样的选择器,这是一个比较头疼的问题,针对新手朋友,对CSS选择器作一些简单的说明,希望能对大家的学习工作有一定的帮助。 准确而简洁的运用CSS选择器会达到非常好的效果。我们不必通篇给每一个元素定义类(class)或ID,通过合适的组织,可以用最简单的方法实现同样的效果。在实际工
简介 Toast是一种向用户快速提供少量信息的视图。当它显示时,它会浮在整个应用层的上面,并且不会获取到焦点。它的设计思想是能够向用户展示些信息,但又能尽量不显得唐突。本篇我们来研读一下Toast的源码,并探明它的显示及隐藏机制。 源码解析 Toast 我们从Toast的最简单调用开始,它的调用代码是: Toast.makeText(context, "Show toast" ,Toast.LENGTH_LONG).show(); 在上面的代码中,我们是先调用 Toast 的静态方法来创建一个 Toast
Android解析JSON数据详解 JSON(JavaScript Object Notation) 定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 – Json.org JSON的结构: (1) Name/Value Pairs(无序的):类似所熟知的Keyed list、 Hash tab
实验器材 硬件 树莓派板子一块; 5V/1A 电源一个; microUSB 线一根; USB-TTL 串口线一根( FT232RL 芯片或 PL2303 芯片)。 PC ( Windows/MacOS/Linux )一台; 以太网线一根; 路由器一台
软件 PC 上的 USB-TTL 串口线配套的驱动程序; PC 上的串口终端软件 putty 实验步骤 给出各项测试所用的 C 代码和产生的汇编代码情况,并解释汇编代码 (1) 生成了 Thumb 指令还是 ARM 指令:如何通过编译参数改变,相同的程序
对于游戏项目,透明是很消耗资源的一个操作,在Unity的Profile 中可以很直观的看到透明所消耗的系统资源。 在Unity的表面着色器 Surface Shader 中,我们可以很方便的创建一种全透明的效果。如草的表面。这一节学习 通过在 #pragma 语句中添加 alpha 参数 来使用透明功能。 这一节我使用了下面这张贴图作为球 的表面纹理。 这张 512x 512 的图片分为了 4个色块区域。分别是 Green 、Red、White、Blue。 Green:就是 G通道为1,R、B 通道为0
2016年Qcon大会首日,阿里巴巴资深总监、淘宝移动平台、阿里百川负责人庄卓然宣布移动端高性能动态化方案Weex即时内测,并将于6月开源。此消息一出,群情汹涌,在座的程序猿、攻城狮们纷纷拿起手机扫码,以期第一时间感受Weex的神奇之力。 在第二天的主题分享会上,阿里巴巴前端开发专家赵锦江和技术专家徐凯对Weex进行了深入的解析。以下为演讲速记整理后的成文。 阿里怎么看待移动开发? 目前的移动开发者面临的最大痛点就是面对极其复杂的环境,对此,庄卓然给出一个公式,移动开发的复杂度=应用数量×平台数量×要适配
生活是一面镜子,你对它笑,它就对你笑;你对它哭,它也对你哭。——萨克雷 在正文开始之前,我先抛一个脑洞大开的题目给大家:商人以45元一双进购了2双鞋子,然后亏本30一双出售。某个顾客给了他100买了2双鞋子,商人没零钱找于是拿着这100找邻居换了100的零钱,后来邻居发现这100是假的,商人只得陪了邻居100真的。。。 请问商人亏了多少?? 相关文章: Android自定义View之Path解析 一、Paint与Canvas 绘图需要两个工具,笔和纸。这里的 Paint 相当于笔,而 Canvas 相当于
为什么(用Visual Studio)? 有许多IDE可用于Babylon.js开发, Visual Studio是其中之一. 通过Visual Studio你将能够将库和你的代码一起编译,而且能测试两者(库和你的代码). 编译模式 在深入之前,你需要明白有两种编译模式可用来编译Babylon.js. 发布模式 你可以使用 Gulp 脚本来创建主发布文件(babylon.js, babylon.max.js, babylon.d.ts) , 它们将被存储到 之前的路径里 . 这个模式通常用来创建一个快速发
ZXing简介:
ZXing是谷歌的一个开源项目,用Java实现多种格式的ID/2D条码图像处理库,它包含了联系到其他语言的端口。 Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码。 其实ZXing 项目里的Android实现太过复杂多余东西太多,好多用不到,可以对其进行简化。简化过程可以参看:http://www.oschina.net/question/ 自己需要新建一个项目,把需要的类,包抽取出来放到这个新项目中 在修改的过程中,有很多是关于R 资源的问题,在此
Copyright (C)
ITfish.net执行Shell脚本的4种方法及区别介绍
  这篇主要介绍了执行Shell脚本的4种方法及区别介绍,本文讲解了相对路径方式、绝对路径方式、bash命令调用、相对或绝对方式以及说下几种方式的区别,需要的朋友可以参考下
  执行shell脚本有以下几种方式
  1、相对路径方式,需先cd到脚本路径下
  代码如下:
  [root@banking tmp]# cd /tmp
  [root@banking tmp]# ./ceshi.sh
  脚本执行成功
  2、绝对路径方式
  代码如下:
  [root@banking tmp]# /tmp/ceshi.sh
  脚本执行成功
  3、bash命令调用
   代码如下:
  [root@banking /]# bash /tmp/ceshi.sh
  脚本执行成功
  4、. (空格) 相对或绝对方式
   代码如下:
  [root@banking /]# . /tmp/ceshi.sh
  说下几种方式的区别
  第一种和第二种没有什么区别,两种方式都需要提前赋予脚本以执行权限。
  第三种是把脚本当做bash的调用来处理,所以,脚本不需要有执行权限就可以执行。
  前三种方式都是在当前shell中打开一个子shell来执行脚本内容,当脚本内容结束,则子shell关闭,回到父shell中。
  第四种是使脚本内容在当前shell里执行,而不是单独开子shell执行。
  开子shell与不开子shell的区别就在于,环境变量的继承关系,如在子shell中设置的当前变量,不做特殊通道处理的话,父shell是不可见的。
  而在当前shell中执行的话,则所有设置的环境变量都是直接生效可用的。
  验证:
  代码如下:
  [root@banking /]# cat /tmp/ceshi.sh
  1、前三种执行方式下的pstree显示
  代码如下:
  ├─sshd─┬─sshd───bash───bash───top
  │ └─sshd───bash───pstree
  2、第四种执行方式下的pstree显示
  代码如下:
  ├─sshd─┬─sshd───bash───top
  │ └─sshd───bash───pstree
  3、验证环境变量设置的继承关系及可见关系
  建立两个脚本,father.sh和subshell.sh。其中father.sh调用subshell.sh
   代码如下:
  [root@banking /]# cat /tmp/father.sh
  v_ceshi='father'
  #-------父shell中定义变量
  echo "以子shell方式调用脚本"
  /tmp/subshell.sh
  echo "输出v_ceshi值为${v_ceshi}"
  echo ""
  echo "在当前shell中执行脚本"
  . /tmp/subshell.sh
  echo "输出v_ceshi值为${v_ceshi}"
  [root@banking /]#
  [root@banking /]# cat /tmp/subshell.sh
  v_ceshi=son
  [root@banking /]#
  执行结果为
   代码如下:
  [root@banking /]# /tmp/father.sh
  以子shell方式调用脚本
  输出v_ceshi值为father
  在当前shell中执行脚本
  输出v_ceshi值为son在Jenkins的Python脚本中模拟用户输入
这个需求很少见,但是好不容易试验成功了,所以要记录下来备忘。
我们使用Jenkins+TexturePacker进行资源的自动打包和转换。
TexturePacker首次运行需要在命令行中输入agree进行版权声明的用户确认。而Jenkins的环境是独立于桌面系统的,所以在Jenkins里面要再一次输入agree。于是就有了一个非常恶心的情况,Jenkins里面运行TexturePacker命令行没有给用户输入agree的地方。
幸好有万能的python脚本。它可以模拟用户的输入。这样只需要在Jenkins里面执行一下这个脚本(建立一个Job,Execute Shell里面运行如下脚本)
#!python.exe
import subprocess
halls = subprocess.Popen([r'D:\Workspace\TexturePacker\bin\TexturePacker.exe'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
result = municate(input=r'agree')[0]
print halls.returncode
municate()用户名:极速前行
文章数:110
评论数:25
访问量:34124
注册日期:
阅读量:1297
阅读量:3317
阅读量:457225
阅读量:1141871
51CTO推荐博文
前言:jenkins自动发布代码平台是我2014年6月搭建的,截止目前已经有50多个项目的dev、beta、 生产环境都接入了jenkins,公司开发team中大部分是用GIT管理代码,也有一部分是用svn管理代码。我的实现原理是,通过jenkins构建新版本代码,然后用python脚本发布到生产环境。用户在jenkins界面上点击构建,即完成在线更新发布代码并邮件通知相关人员发布成功。一、Jenkins安装部署1,部署java环境。(这里用的是jdk7和tomcat7)mkdir&-p&/data/webserver
cd&/data/webserver
rpm&-ivh&jdk-7u55-linux-x64.rpm
tar&zxvf&apache-tomcat-7.0.53.tar.gz
cat&&&/etc/profile.d/development.sh&&&EOF
export&JAVA_HOME=/usr/java/jdk1.7.0_55
export&JRE_HOME=$JAVA_HOME/jre
export&CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export&PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
source&/etc/profile.d/development.sh2,部署jenkins项目从官网下载jenkins程序包,上传到服务器的程序目录,删除tomcat/webapps目录下的所有文件,然后修改tomcat配置文件指定程序目录即可&Host&name="localhost"&&appBase="/data/www/jenkins"
&&&&&&&&&&&&unpackWARs="true"&autoDeploy="true"&启动tomcat:&& ./startup.sh浏览器访问:二、Jenkins项目构建1,安装maven插件,由于部分开发team使用了maven管理,这里需要安装maven插件,安装的是3.2.2版本;2,私服配置,如下vim&/root/.m2/settings.xml
&?xml&version="1.0"&encoding="UTF-8"&standalone="no"?&
&settings&xmlns="http://maven.apache.org/SETTINGS/1.0.0"&xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
&&&&&&&&&&xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0&http://maven.apache.org/xsd/settings-1.0.0.xsd"&
&&&&&!--将此文件放在目录(~/.m2)下做为maven的设置文件--&
&&&&&servers&
&&&&&&&&&server&
&&&&&&&&&&&&&id&snapshots&/id&
&&&&&&&&&&&&&username&deployment&/username&
&&&&&&&&&&&&&password&deployment&/password&
&&&&&&&&&/server&
&&&&&&&&&server&
&&&&&&&&&&&&&id&releases&/id&
&&&&&&&&&&&&&username&deployment&/username&
&&&&&&&&&&&&&password&deployment&/password&
&&&&&&&&&/server&
&&&&&/servers&
&&&&&mirrors&
&&&&&&&&&mirror&
&&&&&&&&&&&&&id&nexus&/id&
&&&&&&&&&&&&&mirrorOf&*&/mirrorOf&
&&&&&&&&&&&&&name&internal&nexus&repository&/name&
&&&&&&&&&&&&&url&http://172.20.135.19:8080/nexus/content/groups/public/&/url&
&&&&&&&&&/mirror&
&&&&&/mirrors&
&&&&&profiles&
&&&&&&&&&profile&
&&&&&&&&&&&&&id&nexus&/id&
&&&&&&&&&&&&&repositories&
&&&&&&&&&&&&&&&&&repository&
&&&&&&&&&&&&&&&&&&&&&id&central&/id&
&&&&&&&&&&&&&&&&&&&&&url&http://nisabi&/url&
&&&&&&&&&&&&&&&&&&&&&releases&
&&&&&&&&&&&&&&&&&&&&&&&&&enabled&true&/enabled&
&&&&&&&&&&&&&&&&&&&&&/releases&
&&&&&&&&&&&&&&&&&&&&&snapshots&
&&&&&&&&&&&&&&&&&&&&&&&&&enabled&true&/enabled&
&&&&&&&&&&&&&&&&&&&&&/snapshots&
&&&&&&&&&&&&&&&&&/repository&
&&&&&&&&&&&&&/repositories&
&&&&&&&&&&&&&pluginRepositories&
&&&&&&&&&&&&&&&&&pluginRepository&
&&&&&&&&&&&&&&&&&&&&&id&central&/id&
&&&&&&&&&&&&&&&&&&&&&url&http://nisabi&/url&
&&&&&&&&&&&&&&&&&&&&&releases&
&&&&&&&&&&&&&&&&&&&&&&&&&enabled&true&/enabled&
&&&&&&&&&&&&&&&&&&&&&/releases&
&&&&&&&&&&&&&&&&&&&&&snapshots&
&&&&&&&&&&&&&&&&&&&&&&&&&enabled&true&/enabled&
&&&&&&&&&&&&&&&&&&&&&/snapshots&
&&&&&&&&&&&&&&&&&/pluginRepository&
&&&&&&&&&&&&&/pluginRepositories&
&&&&&&&&&/profile&
&&&&&/profiles&
&&&&&activeProfiles&
&&&&&&&&&activeProfile&nexus&/activeProfile&
&&&&&/activeProfiles&
&/settings&3,在jenkins操作界面---系统管理---插件管理中,安装git、go插件,svn已经默认安装,由于开发项目有用到go语言,这里需要安装go插件;4,在jenkins操作界面新建一个项目,可以选择自由风格软件项目或maven项目,在配置中填写源码管理地址、授权帐号、Branches to build(分支名)、pom.xml(根据具体项目来写)、add-post-build-step-----5,在execute shell框中填写服务器脚本地址,保存即可三、Python发布脚本#!/usr/bin/python
#coding=utf-8
Created&on&
@author:&huangyishan
import&re,sys,os,time,datetime
import&pexpect
import&hashlib
import&smtplib
from&email.mime.text&import&MIMEText
from&email.mime.multipart&import&MIMEMultipart
prompt&=&'[$#&]'
ssh_newkey='Are&you&sure&you&want&to&continue&connecting'
rsync_prompt='total&size.*'
ip_list=["0.0.0,1","0.0.0.2"]
user="omadmin"
password="password"
local_path="/root/.jenkins/jobs/passport/workspace/wasabi-web-front/target/ROOT.war"
target_path="/data/program/front/ROOT.war"
log_path="/data/tmplog/passport/master/fabu_"
command="md5sum&%s"&%(target_path)
server_script_exec="sh&/data/sh/program_update.sh"
cur_time&=&time.strftime('%Y_%m_%d_%H_%M')
log_file_name&=&log_path&+&cur_time&+&".log"
recipientas_list=[""]
itheme=&'帐号中心生产环境版本更新发布'
email_server_IP='x.x.x.x'
mail_user="product_"
mail_pass="password"
def&send_email_succeed(recipientas_list,addresser,itheme,email_server_IP,log_file_name,server_ip,local_file_md5,target_file_md5):
&&&&msg&=&MIMEMultipart()
&&&&msg['Subject']&=&itheme
&&&&msg['From']&=&addresser
&&&&msg['To']&=&";".join(recipientas_list)
&&&&html_succeed&=&"""\
&&&&&&&&&html&
&&&&&&&&&head&&/head&
&&&&&&&&&META&http-equiv=Content-Type&content="text/&charset=utf-8"&
&&&&&&&&&body&
&&&&&&&&&p&Hi,各位伙伴&br&
&&&&&&&&&&&&&font&color="green"&size=5&&&====服务器IP&%s&====&&&帐号中心生产环境版本更新发布成功.&/font&&br&&br&&br&
&&&&&&&&&&&&&font&size=5&&如发现版本有问题,请及时联系黄怡善,电话:&/font&&font&color="green"&size=5&&&137XXXX6716&/font&&br&&br&&br&
&&&&&&&&&&&&&font&size=5&&本地版本文件MD5:&&/font&&font&color="green"&size=5&&%s&/font&&br&
&&&&&&&&&&&&&font&size=5&&服务器版本文件MD5:&&/font&&font&color="green"&size=5&&%s&/font&&/font&&br&
&&&&&&&&&/p&
&&&&&&&&&/body&
&&&&&&&&&/html&"""%(server_ip,&local_file_md5,&target_file_md5)
&&&&part1&=&MIMEText(html_succeed,&'html',_charset="utf-8")
&&&&#fp&=&open(log_file_name,&'rb')
&&&&#part2&=&MIMEText(fp.read(),&'plain',_charset="utf-8")
&&&&#fp.close()
&&&&msg.attach(part1)
&&&&#msg.attach(part2)
&&&&&&&&s&=&smtplib.SMTP()
&&&&&&&&s.connect(email_server_IP)
&&&&&&&&s.login(mail_user,mail_pass)
&&&&&&&&s.sendmail(addresser,&recipientas_list,&msg.as_string())
&&&&&&&&s.quit()
&&&&except&Exception,&e:
&&&&&&&&print&str(e)
&&&&&&&&return&False
def&send_email_fail(recipientas_list,addresser,itheme,email_server_IP,log_file_name,server_ip,local_file_md5,target_file_md5):
&&&&msg&=&MIMEMultipart()
&&&&msg['Subject']&=&itheme
&&&&msg['From']&=&addresser
&&&&msg['To']&=&";".join(recipientas_list)
&&&&html_succeed&=&"""\
&&&&&&&&&html&
&&&&&&&&&head&&/head&
&&&&&&&&&META&http-equiv=Content-Type&content="text/&charset=utf-8"&
&&&&&&&&&&body&
&&&&&&&&&p&Hi,各位伙伴&br&
&&&&&&&&&&&&&font&color="red"&size=5&&&====服务器IP&%s&====&&帐号中心生产环境版本更新发布失败,&/font&&font&size=5&&附件有详细发布日志,请查看.&/font&&br&&br&&br&
&&&&&&&&&&&&&font&color="red"&size=5&&请及时联系黄怡善,电话:&/font&&font&color="green"&size=5&&&137XXXX6716&/font&&br&&br&&br&
&&&&&&&&&&&&&font&color="red"&size=5&&本地版本文件MD5:&&/font&&font&color="green"&size=5&&%s&/font&&br&
&&&&&&&&&&&&&font&color="red"&size=5&&服务器版本文件MD5:&&/font&&font&color="green"&size=5&&%s&/font&&br&
&&&&&&&&&/p&
&&&&&&&&&/body&
&&&&&&&&&/html&
&&&&&&&&"""%(server_ip,&local_file_md5,&target_file_md5)
&&&&part1&=&MIMEText(html_succeed,&'html',_charset="utf-8")
&&&&#fp&=&open(log_file_name,&'rb')
&&&&#part2&=&MIMEText(fp.read(),&'plain',_charset="utf-8")
&&&&#fp.close()
&&&&msg.attach(part1)
&&&&#msg.attach(part2)
&&&&&&&&s&=&smtplib.SMTP()
&&&&&&&&s.connect(email_server_IP)
&&&&&&&&s.login(mail_user,mail_pass)
&&&&&&&&s.sendmail(addresser,&recipientas_list,&msg.as_string())
&&&&&&&&s.quit()
&&&&except&Exception,&e:
&&&&&&&&print&str(e)
&&&&&&&&return&False
for&server_ip&in&ip_list:
&&&&log_file&=&open(log_file_name,&"a")
&&&&child=pexpect.spawn("/usr/bin/rsync&-e&'ssh&-p&22222'&-avzcP&%s&%s@%s:%s"&%(local_path,&user,&server_ip,&target_path))
&&&&child.logfile=log_file
&&&&index&=&child.expect([ssh_newkey,&'password:&',&pexpect.EOF,&pexpect.TIMEOUT])
&&&&if&index&==&0:
&&&&&&&&child.sendline('yes')
&&&&&&&&child.expect&('password:&')
&&&&&&&&child.sendline(password)
&&&&&&&&child.expect(rsync_prompt,timeout=None)
&&&&elif&index&==&1:
&&&&&&&&child.sendline(password)
&&&&&&&&child.expect(rsync_prompt,timeout=None)
&&&&elif&index&==&2:
&&&&&&&&print&"%s&rsync:&%s&EOF&ERROR&%s"&%('#'*10,&server_ip,&'#'*10)
&&&&elif&index&==&3:
&&&&&&&&print&"%s&rsync:&%s&TIMEOUT&ERROR&%s"&%('#'*10,&server_ip,&'#'*10)
&&&&log_file.close()
&&&&child.close()
&&&&time.sleep(5)
&&&&log_file&=&open(log_file_name,&"a")
&&&&child=pexpect.spawn("/usr/bin/ssh&-p&22222&%s@%s"&%(user,&server_ip))
&&&&child.logfile=log_file
&&&&index&=&child.expect([ssh_newkey,&'password:&',&pexpect.EOF,&pexpect.TIMEOUT])
&&&&if&index&==&0:
&&&&&&&&child.sendline('yes')
&&&&&&&&child.expect&('password:&')
&&&&&&&&child.sendline(password)
&&&&&&&&child.expect&(prompt)
&&&&&&&&child.sendline(command)
&&&&&&&&child.expect&(prompt)
&&&&&&&&child.sendline('exit')
&&&&elif&index&==&1:
&&&&&&&&child.sendline(password)
&&&&&&&&child.expect&(prompt)
&&&&&&&&child.sendline(command)
&&&&&&&&child.expect&(prompt)
&&&&&&&&child.sendline('exit')
&&&&elif&index&==&2:
&&&&&&&&print&"%s&ssh:&%s&EOF&ERROR&%s"&%('#'*10,&server_ip,&'#'*10)
&&&&elif&index&==&3:
&&&&&&&&print&"%s&ssh:&%s&TIMEOUT&ERROR&%s"&%('#'*10,&server_ip,&'#'*10)
&&&&log_file.close()
&&&&child.close()
&&&&os.system("md5sum&%s&|&awk&'{print&$1}'&&&/data/tmplog/passport/master/upload_file_local.log"&%(local_path))
&&&&os.system("grep&%s&%s&|&awk&'{print&$1}'&|&egrep&-v&'md5sum|omadmin'&|&tail&-n&1&&&&/data/tmplog/passport/master/upload_file_remote.log"&%(target_path,&log_file_name))
&&&&for&localmd5&in&open("/data/tmplog/passport/master/upload_file_local.log"):
&&&&&&&&local_file_md5&=&localmd5
&&&&for&remotemd5&in&open("/data/tmplog/passport/master/upload_file_remote.log"):
&&&&&&&&target_file_md5&=&remotemd5
&&&&if&target_file_md5&==&local_file_md5:
&&&&&&&&log_file&=&open(log_file_name,&"a")
&&&&&&&&child=pexpect.spawn("/usr/bin/ssh&-p&22222&%s@%s"&%(user,&server_ip))
&&&&&&&&child.logfile=log_file
&&&&&&&&index&=&child.expect(['password:&',&pexpect.EOF,&pexpect.TIMEOUT])
&&&&&&&&if&index&==&0:
&&&&&&&&&&&&child.sendline(password)
&&&&&&&&&&&&child.expect&(prompt)
&&&&&&&&&&&&child.sendline(server_script_exec)
&&&&&&&&&&&&child.expect&(prompt)
&&&&&&&&&&&&child.sendline('exit')
&&&&&&&&elif&index&==&1:&
&&&&&&&&&&&&print&"%s&script&exec:&%s&EOF&ERROR&%s"&%('#'*10,&server_ip,&'#'*10)
&&&&&&&&elif&index&==&2:
&&&&&&&&&&&&print&"%s&script&exec:&%s&TIMEOUT&ERROR&%s"&%('#'*10,&server_ip,&'#'*10)
&&&&&&&&send_email_succeed(recipientas_list,addresser,itheme,email_server_IP,log_file_name,server_ip,local_file_md5,target_file_md5)
&&&&&&&&send_email_fail(recipientas_list,addresser,itheme,email_server_IP,log_file_name,server_ip,local_file_md5,target_file_md5)此脚本的功能说明如下:1,将构建好的代码包,用rsync同步到生产环境服务器中转目录program;2,通过ssh登录生产环境服务器,调用program_update.sh脚本,将中转目录program下的代码更新到站点程序目录,更新完之后如果站点访问有BUG,那么可以将program下的前一个版本代码进行回滚;3,构建的代码包和上传到生产环境的代码包通过md5校验一致性;4,项目构建发布成功后,发邮件给项目相关人员;5,执行此脚本的日志输出到文件,可以进行查看问题;关于jenkins平台的项目构建操作很简单,希望我的文章可以给大家有所帮助,如有问题可以咨询我,也希望大家给予建议!本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
23:21:07 19:30:50 22:27:17 22:58:48 16:36:30 22:33:53 17:42:05

我要回帖

更多关于 jenkins python脚本 的文章

 

随机推荐