公司最近出了个打包需求,完成之后记录一下,避免忘记
1、Jenkins登陆用户拥有不同权限,用户分为「管理员」、「项目管理员」和「项目测试」。
(1)「管理员」即Jenkins管理员账户;
(2)「项目管理员」可以增删查改负责的项目;
(3)「项目测试」可以下载安装负责项目;
2、每一个项目在Jenkins上分为2个工程,一个工程负责打包,另一个工程只显示下载地址
(1)打包工程可以选择打包需要的参数,如:版本号,构建版本号,内外网环境
(2)下载工程在打包完成后发送钉钉通知
前提条件
1、Jenkins使用中文版,英文版请独立翻译或依据图标辨认;
2、以下操作默认登陆用户为Jenkins管理员,切换用户时会有特殊说明;
3、Jenkins插件手动下载地址:http://mirror.xmission.com/jenkins/plugins/
4、会shell,python,ruby脚本语言
用户权限
用户权限的首要条件,就是用户,所以我们先创建2个用户。「QALeader」和「QAUser」,其中「QALeader」当作「项目管理员」,「QAUser」当作「项目测试」。
在Jenkins主页的左侧选择「系统管理」->「管理用户」->「新建用户」,根据要求创建用户。
注意:用户ID会将英文全部按照小写处理。
由于Jenkins本身不带有用户权限功能,所以我们将使用Jenkins插件「Role-based Authorization Strategy」完成用户权限功能。选择「系统管理」->「插件管理」,标签页选择「可选插件」,右上角「过滤」中输入插件名或关键字。安装完成后重启Jenkins。
Jenkins重启:在浏览器地址栏输入命令。记得修改成自己的地址和端口号
直接安装使用命令
localhost:8080/restart
依赖tomcat使用命令
localhost:8080/jenkins/restart
Jenkins重启后,插件已经安装好了。但此时插件还没有生效,无法使用,需要再配置一些地方。
进入「系统管理」->「全局安全配置」,修改「访问控制」和「代理」
此时,插件生效,可以在「系统管理」中看到新的功能「Manage and Assign Roles」
该功能中包含3个标签,分别是「Manage Roles」「Assign Roles」「Role Strategy Macros」。我们会用到前两个,第三个没有用到,不在此赘述。
Manage Roles
权限类型。可以设置不同权限类型,使用其中「Global roles」和「Project roles」,将鼠标停在每一项中会有英文提示
「Global roles」中我们关注「Overall」、「任务」和「Run」。插件会默认记录一个admin,
拥有所有权限,一般,这个权限我们留给Jenkins管理员。
在「Role to add」输入想要的Role,添加到Global roles,比如「subAdmin」和「QA」
subAdmin拥有增删查改项目的权限,QA拥有查看项目的权限,所以我们给subAdmin和QA分别赋予权限。最终权限为
「Project roles」我们关注「任务」和「Run」。其中「Pattern」是正则表达,通过「Pattern」筛选项目。根据项目需要自行创建。比如「TestProject.*」和「TestProjectipa.*」。
「TestProject.*」意思是获得该项目权限的用户只可以在首页可以看到「TestProject」开头的项目。如:TestProject12345678900965
「TestProjectipa.*」意思是获得该项目的权限的用户只可以可以在首页看到「TestProjectipa」开头的项目。如:TestProjectipaiuhygfdsa
Assign Roles
用户赋权。将设置的不同权限类型赋予用户。之后的用户登陆后只能看到相应权限的按钮。
为了方便直观,我们直接将之前创建的「QALeader」和「QAUser」赋予权限。同时创建2个项目,分别叫做「TestProject」和「TestProjectipa」。
项目创建
按照之前的规定,创建2个自由风格项目,分别是「TestProject」和「TestProjectipa」。
在这里就可以使用「subAdmin」类型创建,不再使用「admin」。
点击「新建项目」,输入项目名,选择「构建一个自由风格软件项目」,点击确定。
依次创建完成后「QALeader」可以看到2个项目,「QAUser」只能看到1个项目。
项目配置
项目配置中「源码管理」选择使用的管理工具,默认提供了「Git」和「Subversion」(就是SVN)。根据不同需求自行解决。
「构建」中,下拉选择「Excute shell」,使用shell脚本打包。
shell脚本如下
#!/bin/sh
projectPath="下载的项目中xcodeproj绝对路径"
ipaPath="保存ipa包的绝对路径"
projectTarget="项目中需要构建的TARGETS"
targetName="项目中需要构建的TARGETS"
ipaName="不带后缀的ipa包名字"
ipafile="${ipaPath}/${targetName}/${ipaName}.ipa
cd /Users/admin/.jenkins/workspace/slots_iOS
mkdir ipaFolder
cd ${ipaPath}
mkdir "$targetName"
cd "$projectPath"
releaseDir="build/Release-iphoneos"
appfile="${releaseDir}/${projectTarget}.app"
rm -rdf "$releaseDir"
xcodebuild -target "$projectTarget" -configuration Release -sdk iphoneos11.0 clean build
/usr/bin/xcrun -sdk iphoneos PackageApplication -v "$appfile" -o "$ipafile"
rm -rdf "build
iphoneos11.0代表着打包使用的iOS SDK版本。自行查看Xcode中版本
xcodebuild -target "$projectTarget" -configuration Release -sdk iphoneos11.0 clean build
但是这样不符合要求啊。无法配置版本、切换环境,总不能每次为了打不同环境的包提交一次代码。
接下来我们追加版本和环境的配置。
勾选「参数化构建过程」,根据需求选择相应参数。如:版本号选择「字符参数」;服务器环境选择「选项参数」。
其中「名称」是展示到打包前会用,也是变量必填,需要在shell脚本中使用;「默认值」额。。。就是默认值,可不填;「描述」是该参数说明,可不填。
此时再去打包,会发现原先的「Build」变成了「Build with Parameters」,点击后没有立即打包,而是进入参数配置页面。
外壳已经完成,下面就开始实现方法。
首先是版本号的修改。修改思路:iOS项目中版本号是写在info.plist文件中,info.plist文件实际上是一堆key-value组成,那么知道了版本号的key,对应替换value就可以了。
版本号对应的key是「CFBundleShortVersionString」,找到这一行的key,替换掉下一行value,重新保存文件;服务器环境也是类似思路,不在此单独列出。脚本:
#!/usr/bin/python
# encoding: utf-8
import sys
version=sys.argv[1]
fo = open("Info.plist", "r+")
print "fileno is ",fo.fileno()
print "file name is ",fo.name
i=0
verionIndex=0
versionLine="%s \n"%version
flist=fo.readlines()
for line in flist:
i=i+1
if 'CFBundleShortVersionString' in line:
verionIndex=i
print "flist is ",flist
flist[verionIndex]=versionLine
print "new flist is ",flist
fo=open("Info.plist", "w+")
fo.writelines(flist)
fo.close()
将该脚本放到一个不会变动的文件夹中或直接放入代码文件一同上传,如果选择放入本地文件夹,请先将文件复制到info.plist所在目录。
在打包开始前,追加以下脚本以修改版本号
chmod 777 param.py
python param.py 版本号「名称」
打包完成后,需要分发给「QAUser」,但是「QAUser」并不能查看到该项目,需要将ipa包导入另一个项目中,供「QAUser」使用。在「构建后操作」选择「Build other projects」,填写项目名,选择构建时机。
啥时候有兴趣了,啥时候继续写好了。