Jenkins创建iOS项目自动打包

公司最近出了个打包需求,完成之后记录一下,避免忘记

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创建iOS项目自动打包_第1张图片
首页左侧系统管理


管理用户


新建用户(用户列表上admin为Jenkins管理员用户)


Jenkins创建iOS项目自动打包_第2张图片
新建用户


Jenkins创建iOS项目自动打包_第3张图片
用户ID被变为小写

由于Jenkins本身不带有用户权限功能,所以我们将使用Jenkins插件「Role-based Authorization Strategy」完成用户权限功能。选择「系统管理」->「插件管理」,标签页选择「可选插件」,右上角「过滤」中输入插件名或关键字。安装完成后重启Jenkins。

Jenkins重启:在浏览器地址栏输入命令。记得修改成自己的地址和端口号

直接安装使用命令

localhost:8080/restart

依赖tomcat使用命令

localhost:8080/jenkins/restart

Jenkins创建iOS项目自动打包_第4张图片
插件管理
Jenkins创建iOS项目自动打包_第5张图片
安装插件

Jenkins重启后,插件已经安装好了。但此时插件还没有生效,无法使用,需要再配置一些地方。

进入「系统管理」->「全局安全配置」,修改「访问控制」和「代理」


Jenkins创建iOS项目自动打包_第6张图片
全局安全配置


Jenkins创建iOS项目自动打包_第7张图片
全局安全配置修改

此时,插件生效,可以在「系统管理」中看到新的功能「Manage and Assign Roles」


插件生效

该功能中包含3个标签,分别是「Manage Roles」「Assign Roles」「Role Strategy Macros」。我们会用到前两个,第三个没有用到,不在此赘述。

Manage Roles

权限类型。可以设置不同权限类型,使用其中「Global roles」和「Project roles」,将鼠标停在每一项中会有英文提示



Jenkins创建iOS项目自动打包_第8张图片
Global roles

「Global roles」中我们关注「Overall」、「任务」和「Run」。插件会默认记录一个admin,

拥有所有权限,一般,这个权限我们留给Jenkins管理员。

在「Role to add」输入想要的Role,添加到Global roles,比如「subAdmin」和「QA」


Jenkins创建iOS项目自动打包_第9张图片
新增subAdmin和QA

subAdmin拥有增删查改项目的权限,QA拥有查看项目的权限,所以我们给subAdmin和QA分别赋予权限。最终权限为


Jenkins创建iOS项目自动打包_第10张图片
Jenkins创建iOS项目自动打包_第11张图片
Project roles

「Project roles」我们关注「任务」和「Run」。其中「Pattern」是正则表达,通过「Pattern」筛选项目。根据项目需要自行创建。比如「TestProject.*」和「TestProjectipa.*」。

「TestProject.*」意思是获得该项目权限的用户只可以在首页可以看到「TestProject」开头的项目。如:TestProject12345678900965

「TestProjectipa.*」意思是获得该项目的权限的用户只可以可以在首页看到「TestProjectipa」开头的项目。如:TestProjectipaiuhygfdsa

Jenkins创建iOS项目自动打包_第12张图片
根据Pattern创建项目


Assign Roles

用户赋权。将设置的不同权限类型赋予用户。之后的用户登陆后只能看到相应权限的按钮。

为了方便直观,我们直接将之前创建的「QALeader」和「QAUser」赋予权限。同时创建2个项目,分别叫做「TestProject」和「TestProjectipa」。



Jenkins创建iOS项目自动打包_第13张图片
赋予账号系统管理权限



Jenkins创建iOS项目自动打包_第14张图片
赋予账号项目管理权限


项目创建

按照之前的规定,创建2个自由风格项目,分别是「TestProject」和「TestProjectipa」。

在这里就可以使用「subAdmin」类型创建,不再使用「admin」。

 点击「新建项目」,输入项目名,选择「构建一个自由风格软件项目」,点击确定。


Jenkins创建iOS项目自动打包_第15张图片
新建项目

依次创建完成后「QALeader」可以看到2个项目,「QAUser」只能看到1个项目。


Jenkins创建iOS项目自动打包_第16张图片
QALeader项目权限


Jenkins创建iOS项目自动打包_第17张图片
QAUser项目权限

项目配置


Jenkins创建iOS项目自动打包_第18张图片
项目配置

项目配置中「源码管理」选择使用的管理工具,默认提供了「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

但是这样不符合要求啊。无法配置版本、切换环境,总不能每次为了打不同环境的包提交一次代码。

接下来我们追加版本和环境的配置。

勾选「参数化构建过程」,根据需求选择相应参数。如:版本号选择「字符参数」;服务器环境选择「选项参数」。

Jenkins创建iOS项目自动打包_第19张图片
参数化构建过程


其中「名称」是展示到打包前会用,也是变量必填,需要在shell脚本中使用;「默认值」额。。。就是默认值,可不填;「描述」是该参数说明,可不填。

Jenkins创建iOS项目自动打包_第20张图片
字符参数

此时再去打包,会发现原先的「Build」变成了「Build with Parameters」,点击后没有立即打包,而是进入参数配置页面。


Jenkins创建iOS项目自动打包_第21张图片
参数配置页面

外壳已经完成,下面就开始实现方法。

首先是版本号的修改。修改思路: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」,填写项目名,选择构建时机。


Jenkins创建iOS项目自动打包_第22张图片
Build other projects

啥时候有兴趣了,啥时候继续写好了。

你可能感兴趣的:(Jenkins创建iOS项目自动打包)