Jenkins环境搭建 iOS

前段时间搞自动打包,使用Jenkins时遇到了点权限问题该问题就是 jenkins.pkg安装到了 共享目录里面,并且自动创建了一个 jenkins的用户,该用户的login.keychain中没有证书),一直拖到今天,终于给搞定了,特来记录mark一下。
因为涉及到测试人员打包,就考虑布置到了Tomcat上。
xcode环境:8.3.3

Jenkins自动打包优势

  1. 构建项目
  2. 跑测试用例检测bug
  3. 静态代码检测
  4. 部署

关于这4点,实际使用中还是比较方便的:

  1. 构建项目自动化打包可以省去开发人员好多时间,重要的是,Jenkins为我们维护了一套高质量可用的代码,而且保证了一个纯净的环境。我们经常会出现由于本地配置出错而导致打包失败的情况。现在Jenkins就是一个公平的评判者,它无法正确的编译出ipa,那就是有编译错误或者配置问题。开发人员没必要去争论本地是可以运行的,拉取了谁谁谁的代码以后就不能运行了。共同维护Jenkins的正常编译,因为Jenkins的编译环境比我们本地简单的多,它是最纯净无污染的编译环境。开发者就只用专注于编码。这是给开发者带来的便利。

  2. 这个可以用来自动化测试。在本地生成大批的测试用例。每天利用服务器不断的跑这些用例。每天每个接口都跑一遍。看上去没必要,但是实际上今天运行正常的系统,很可能由于今天的代码改动,明天就出现问题了。有了Jenkins可以以天为单位的进行回归测试,代码只要有改动,Jenkins就把所有的回归测试的用例全部都跑一遍。在项目工期紧张的情况下,很多情况测试都不是很重视回归测试,毕竟很可能测一遍之后是徒劳的“无用功”。然而由于回归测试不及时,就导致到最后发版的时候系统不可用了,这时候回头查找原因是比较耗时的,查看提交记录,看到上百条提交记录,排查起来也是头疼的事情。以天为单位的回归测试能立即发现问题。测试人员每天可以专注按单元测试,一周手动一次回归测试。这是给测试者带来的便利。

  3. 这个是静态代码分析,可以检测出很多代码的问题,比如潜在的内存泄露的问题。由于Jenkins所在环境的纯净,还是可以发现一些我们本地复杂环境无法发现的问题,进一步的提高代码质量。这是给质检带来的便利。

  4. 随时部署。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  
------------------------------------------------------------------------------->  
<role rolename="manager-gui"/> //指定用户可以使用的接口为manager-gui  
<user username="tomcat" password="tomcat" roles="manager-gui"/> //用户名和密码为tomcat,在manager-gui接口使用 

启动Tomcat:

/Library/Tomcat/bin/startup.sh

如果端口被占用,修改端口号后再重新启动。
例如,我修改到端口8662上:编辑/Library/Tomcat/conf/server.xml文件,找到<Connector port="8080" ....../>等代码,将8080改为自己想改的端口。

端口修改.png

终端中重启Tomcat,可以先关闭后启动:

//关闭
/Library/Tomcat/bin/shutdown.sh
//启动
/Library/Tomcat/bin/startup.sh

看到如下信息

Tomcat启动.png

就可以在浏览输入: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

解锁Jenkins.png

打开终端,复制红色字路径,VI命令打开(我用Finder的前往文件夹没进去??估计是权限原因),复制出内容,粘贴到下面输入框中,确定。
2.安装插件,就按推荐的安装就行。


推荐安装.png

3.建立Jenkins用户,完成后就可以进入Jenkins管理页了。

3.建立打包任务

1.新建任务。


新建任务.png

输入项目名称,选择自由风格。
2.接着设置源码管理。
个人用的SVN,配置svn路径,用户名与密码。

源码管理.png

3.参数化构建。
这里可以配置一些可选参数,以后打包起项目来更为方便。如配置targets、schemes、configrations、exportPlist路径等等等。


参数化构建.png

有输入框,下拉选择器、checkBox等样式,根据需要自主添加。例:我们添加了choice类型,后来打包时显示为:

image.png

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。现内容如下:


image.png

6.开始构建
点击项目名称,进入项目配置

项目列表.png

由于我们配置了参数化构建,这里的显示是这样的

项目面板.png

点build with parameters进去,开始构建。

当前构建.png

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 sixtech@192.168.16.242 "mkdir -p /data0/zwcapp/ios/wqcpz/v1.4.7/${Day}/ &"
#scp -r ${JENKINS_HOME}/workspace/Packages/DIDI/${IpaName} sixtech@192.168.16.242:/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 = '826276259@qq.com'
receiver = '861080114000@qq.com'
smtpserver = 'smtp.qq.com'

username = '826276259@qq.com'
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'] = '826276259@qq.com;'

        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' + '打包成功', '新包成功,请注意查收!')

新增优秀插件

  1. Git Parameter插件处理分支切换
    此插件连接git服务器,打包前会down下远程git所有分支,供我们选择,非常方便。
    插件管理内,安装Git Parameter后,需要配置添加参数化构建:
    添加git parameter插件

    git配置分支:
    选择分支参数

    使用后样子:
    打包页面
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容