前段时间搞自动打包,使用Jenkins时遇到了点权限问题该问题就是 jenkins.pkg安装到了 共享目录里面,并且自动创建了一个 jenkins的用户,该用户的login.keychain中没有证书),一直拖到今天,终于给搞定了,特来记录mark一下。
因为涉及到测试人员打包,就考虑布置到了Tomcat上。
xcode环境:8.3.3
Jenkins自动打包优势
- 构建项目
- 跑测试用例检测bug
- 静态代码检测
- 部署
关于这4点,实际使用中还是比较方便的:
构建项目自动化打包可以省去开发人员好多时间,重要的是,Jenkins为我们维护了一套高质量可用的代码,而且保证了一个纯净的环境。我们经常会出现由于本地配置出错而导致打包失败的情况。现在Jenkins就是一个公平的评判者,它无法正确的编译出ipa,那就是有编译错误或者配置问题。开发人员没必要去争论本地是可以运行的,拉取了谁谁谁的代码以后就不能运行了。共同维护Jenkins的正常编译,因为Jenkins的编译环境比我们本地简单的多,它是最纯净无污染的编译环境。开发者就只用专注于编码。这是给开发者带来的便利。
这个可以用来自动化测试。在本地生成大批的测试用例。每天利用服务器不断的跑这些用例。每天每个接口都跑一遍。看上去没必要,但是实际上今天运行正常的系统,很可能由于今天的代码改动,明天就出现问题了。有了Jenkins可以以天为单位的进行回归测试,代码只要有改动,Jenkins就把所有的回归测试的用例全部都跑一遍。在项目工期紧张的情况下,很多情况测试都不是很重视回归测试,毕竟很可能测一遍之后是徒劳的“无用功”。然而由于回归测试不及时,就导致到最后发版的时候系统不可用了,这时候回头查找原因是比较耗时的,查看提交记录,看到上百条提交记录,排查起来也是头疼的事情。以天为单位的回归测试能立即发现问题。测试人员每天可以专注按单元测试,一周手动一次回归测试。这是给测试者带来的便利。
这个是静态代码分析,可以检测出很多代码的问题,比如潜在的内存泄露的问题。由于Jenkins所在环境的纯净,还是可以发现一些我们本地复杂环境无法发现的问题,进一步的提高代码质量。这是给质检带来的便利。
随时部署。Jenkins在打包完成之后可以设定之后的操作,这个时候往往就是提交app到跑测试用例的系统,或者部署到内测平台生成二维码。部署中不能安装等一些低级问题随之立即暴露。测试人员也只需要扫一下二维码即可安装,很方便。这也算是给测试带来的便利。
搭建方式:Tomcat+Jenkins.war
0.JAVA环境
因为Tomcat与Jenkins都依赖于Java环境,所以要确保Java环境可用。可以先略过此步骤,如果后面报Java环境问题,可以返回此步骤安装。
下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
1.Tomcat安装与设置
下载地址:http://tomcat.apache.org/
下载完成后 ,解压,然后放到任意目录,这里我放入了 /Library
修改文件夹权限:
sudo chmod -R 777 /Library/Tomcat
Tomcat有 manager-gui 的管理页面,想要使用必须配置管理用户,不使用可以跳过此步。配置tomcat-users.xml:
vim /Library/Tomcat/conf/tomcat-users.xml
------------------------------------------------------------------------------->
//指定用户可以使用的接口为manager-gui
//用户名和密码为tomcat,在manager-gui接口使用
启动Tomcat:
/Library/Tomcat/bin/startup.sh
如果端口被占用,修改端口号后再重新启动。
例如,我修改到端口8662上:编辑/Library/Tomcat/conf/server.xml文件,找到
终端中重启Tomcat,可以先关闭后启动:
//关闭
/Library/Tomcat/bin/shutdown.sh
//启动
/Library/Tomcat/bin/startup.sh
看到如下信息
就可以在浏览输入:localhost:8662验证了,能打开,搞定Tomcat!
2.Jenkins安装与设置
下载Jenkins.war:http://mirrors.jenkins.io/war-stable/latest/jenkins.war
下载完成后,将jenkins.war包保存到Tomcat\webapps下
配置Jenkins工作路径:
#在/Library/Tomcat/bin下打到catalina.sh文件,双击打开。shell的#为注释,找到非注释行,添加此句:
export JENKINS_HOME="/Users/xxxx/Jenkins"
重启Tomcat:
//关闭
/Library/Tomcat/bin/shutdown.sh
//启动
/Library/Tomcat/bin/startup.sh
Jenkins也会一并启动,首次启动会展开jenkins.war, 慢一些。
在浏览器中输入:localhost:8662/jenkins/,顺利打开Jenkins!
3.Jenkins启动配置
1.解锁Jenkins
打开终端,复制红色字路径,VI命令打开(我用Finder的前往文件夹没进去??估计是权限原因),复制出内容,粘贴到下面输入框中,确定。
2.安装插件,就按推荐的安装就行。
3.建立Jenkins用户,完成后就可以进入Jenkins管理页了。
3.建立打包任务
1.新建任务。
输入项目名称,选择自由风格。
2.接着设置源码管理。
个人用的SVN,配置svn路径,用户名与密码。
3.参数化构建。
这里可以配置一些可选参数,以后打包起项目来更为方便。如配置targets、schemes、configrations、exportPlist路径等等等。
有输入框,下拉选择器、checkBox等样式,根据需要自主添加。例:我们添加了choice类型,后来打包时显示为:
4.构建触发器设置
有两个配置还是需要是配置的
Poll SCM (poll source code management) 轮询源码管理
需要设置源码的路径才能起到轮询的效果。一般设置为类似结果:
H/30 * * * * 每30分钟轮询一次
Build periodically (定时build)
一般设置为类似:
00 20 * * * 每天 20点执行定时build 。当然两者的设置都是一样可以通用的。
具体使用介绍可以点输入框右侧问号查看:
This field follows the syntax of cron (with minor differences). Specifically, each line consists of 5 fields separated by TAB or whitespace:
分MINUTE 时HOUR 天DOM 月MONTH 周DOW
MINUTE Minutes within the hour (0–59)
HOUR The hour of the day (0–23)
DOM The day of the month (1–31)
MONTH The month (1–12)
DOW The day of the week (0–7) where 0 and 7 are Sunday.
Examples:
# every fifteen minutes (perhaps at :07, :22, :37, :52)
H/15 * * * *
# every ten minutes in the first half of every hour (three times, perhaps at :04, :14, :24)
H(0-29)/10 * * * *
# once every two hours at 45 minutes past the hour starting at 9:45 AM and finishing at 3:45 PM every weekday.
45 9-16/2 * * 1-5
# once in every two hours slot between 9 AM and 5 PM every weekday (perhaps at 10:38 AM, 12:38 PM, 2:38 PM, 4:38 PM)
H H(9-16)/2 * * 1-5
# once a day on the 1st and 15th of every month except December
H H 1,15 1-11 *
5.构建
使用的是shell命令打包(当然你也可以选择其它方式),不需要安装任何别的插件来辅助。
附赠打包命令:
xcodebuild clean
Date="$(date +"%Y%m%d_%H%M%S")"
#例scheme、exportlistPath等由参数化构建传入值,使用时直接${scheme}
#如果有些奇葩scheme名中间带有空格,必须加"${scheme}"
xcodebuild archive \
-workspace "${JENKINS_HOME}/workspace/xxxx/xxxx.xcworkspace" \
-scheme "${scheme}" \
-configuration "Release" \
-archivePath "${JENKINS_HOME}/workspace/Packages/xxxx/xxxx.xcarchive" -quiet|exit
xcodebuild \
-exportArchive \
-archivePath "${JENKINS_HOME}/workspace/Packages/xxxx/xxxx.xcarchive" \
-exportPath "${JENKINS_HOME}/workspace/Packages/xxxx" \
-exportOptionsPlist "${exportlistPath}/xxxx.plist"
#改名
mv ${JENKINS_HOME}/workspace/Packages/xxxx/xxxx.ipa ${JENKINS_HOME}/workspace/Packages/xxxx/xxxx${Date}.ipa
exportOption.plist内容。
值得一提的是,xcode9以后,又新增了一项provisioningProfiles。现内容如下:
6.开始构建
点击项目名称,进入项目配置
由于我们配置了参数化构建,这里的显示是这样的
点build with parameters进去,开始构建。
console output可以查看执行信息,有错误打包失败什么的就来这里核查。
备注一下我目前用的shell脚本
参数化配置Target/Scheme/Configuration
Date="$(date +"%m%d_%H%M")"
Day="$(date +"%m%d")"
workspace_path=$WORKSPACE/$TargetName
archive_path=$JENKINS_HOME/workspace/Packages/$TargetName
cd $workspace_path
pod install
cd $TargetName.xcodeproj
# 我的项目中有配置bugly的脚本,打包时会上传DSYM,影响打包速度。
# 打包给测试使用时,用不到,所以使用perl正则找到配置bugly的脚本,替换为空字符串。
cat project.pbxproj | perl -pe "s/(?<=shellScript = \").*UPLOAD_DSYM_ONLY=1.*(?=(\"))//" > 999.pbxproj
mv -f 999.pbxproj project.pbxproj
xcodebuild archive \
-workspace "$workspace_path/$TargetName.xcworkspace" \
-scheme $Scheme \
-configuration $Configuration \
-archivePath $archive_path/$TargetName.xcarchive
xcodebuild \
-exportArchive \
-archivePath $archive_path/$TargetName.xcarchive \
-exportPath $archive_path \
-exportOptionsPlist $WORKSPACE/AutoPackage/ExportOptions.plist
#删除旧xcarchive
rm -rf archive_path/$TargetName.xcarchive
#改名
IpaName="${Scheme}_${Configuration}_${Date}.ipa"
mv $archive_path/$TargetName.ipa $archive_path/$IpaName
#上传到共享
#ssh -p 22 [email protected] "mkdir -p /data0/zwcapp/ios/wqcpz/v1.4.7/${Day}/ &"
#scp -r ${JENKINS_HOME}/workspace/Packages/DIDI/${IpaName} [email protected]:/data0/zwcapp/ios/wqcpz/v1.4.7/${Day}/${IpaName}
if [ $UP_PGY == true ]
then
IPA="$archive_path/$IpaName"
PGYUSERKEY="b8e62ce1360d57fca07d69359eaddf05"
PGYAPIKEY="53d1bc7bc665f55f76dd093b606302a7"
#PGYDESC="Jenkins自动打包"
#自动上传到蒲公英
curl -F "file=@$IPA" \
-F "uKey=$PGYUSERKEY" \
-F "_api_key=$PGYAPIKEY" \
-F "updateDescription=$PGYDESC" \
"https://qiniu-storage.pgyer.com/apiv1/app/upload"
fi
发送邮件
#!/usr/bin/env python
#coding: utf-8
# sendEmail title content
import sys
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = '[email protected]'
receiver = '[email protected]'
smtpserver = 'smtp.qq.com'
username = '[email protected]'
password = '88888888'
def send_mail(title, content):
try:
msg = MIMEText(content,'plain','utf-8')
if not isinstance(title,unicode):
title = unicode(title, 'utf-8')
msg['Subject'] = title
msg['From'] = sender
msg['To'] = receiver
msg["Accept-Language"]="zh-CN"
msg["Accept-Charset"]="ISO-8859-1,utf-8"
msg['CC'] = '[email protected];'
smtp = smtplib.SMTP_SSL(smtpserver,465)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
print "邮件发送成功!"
return True
except Exception, e:
print str(e)
print "邮件发送失败!"
return False
send_mail('ios_' + 'DIDI' + '打包成功', '新包成功,请注意查收!')
新增优秀插件
- Git Parameter插件处理分支切换
此插件连接git服务器,打包前会down下远程git所有分支,供我们选择,非常方便。
插件管理内,安装Git Parameter后,需要配置添加参数化构建:
git配置分支:
使用后样子: