2017.09.28 更新:
关于 xcode9 升级后, 关于打包报错的修复:
Error Domain=IDEProvisioningErrorDomain Code=9 ""Dandanjia.app" requires a provisioning profile with the Push Notifications feature."UserInfo={NSLocalizedDescription="Dandanjia.app"requires a provisioning profile with the Push Notifications feature., NSLocalizedRecoverySuggestion=Add a profile to the"provisioningProfiles" dictionary in your Export Options property list.}
** EXPORT FAILED **
具体解决在 第四步, 新建构建项目 5. 构建 中
2017.08.24 更新:
有朋友说 post build script plugin 链接失效了, 贴个网盘吧
链接: https://pan.baidu.com/s/1gfkshSB 密码: pdua
本人处女文章就奉献在这了, 我的第一次啊......
做人嘛就得懒, 只有你想懒的时候才能想出懒人解决问题的方法. 最近真是被打包搞烦了, 因为本人特别懒, 连切个分支打个包这么简单的活都不想干, 所以找到了 Jenkins 这个神器. 真是懒人必备神器, 妈妈再也不用担心我同时为多人打包了. 废话不多说, 开始教程.
网上也是先找了一些教程, 但多多少少还是遇到了一些坑. 所以想把自己整个流程写在这里吧.
第一步, 安装 Jenkins
两种方法, 1. 下载安装包, 2. 命令行
推荐命令行, 因为安装包直接运行有可能什么反应都没有, 命令行起码还有一些输出信息方便找问题.
方法 1:
下载地址: http://jenkins-ci.org/
我的版本是 2.60.2
1
2
3
运行 Jenkins:
open /Applications/Jenkins/Jenkins.war
ps: 我本着省事原则一开始用的方法一, 但是后来发现缺少 java, 就先安装了 brew, 然后又安装了 java
安装 Java 环境:
brew cask install java
或者: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
方法 2:
安装 home-brew(安装指导 http://blog.csdn.net/crazyzhang1990/article/details/46007939 )
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装 Jenkins
$ brew install jenkins
运行 Jenkins
$ jenkins
ps: 这里可能提示你先安装 java, 安装完了 java, 接着安装 jenkins
安装总结: 这里因为我是本地有其他服务环境所以占用了 8080 端口, 所以运行 jenkins 的时候提示我端口占用, 解决方法在这里:
java -jar 路径 --httpPort = 端口号
我这里用的是方法一安装的路径, 没用命令行安装的 Jenkins, 命令行只是确保安装了 Jenkins 需要的必要环境.
所以我的命令如下:
java -jar /Applications/Jenkins/Jenkins.war --httpPort=8787
具体帖子参考:
http://blog.csdn.net/bosbear/article/details/43307899
第二步, 运行并使用 Jenkins
1. 浏览器输入: http://localhost:8787/(我的是 8787, 没占用应该是 8080)
初始化的图忘截取了... 反正大概的意思就是输入一个从命令行获取的密码, 随时去看一下命令行就对了, 然后把这个一长串的密码记在小本本上, 以后可能会用. 然后就是自定义插件还是系统默认插件, 当然选择默认插件, 插件后续还能改. 然后就进入了下图:
1
ps: 恭喜恭喜, 离成功只剩下一大步了.
第三步, 安装插件和配置
系统管理 -> 插件管理
1
我们要用到的插件
1.Xcode integration(xcode 打包用)
2.Git plugin(git 管理, svn 类似)
3.Post-Build Script Plug-in(用来构建 ipa 后执行脚本传到 fir 或其它平台的)
4.github plugin(这个 github 的我应该没用到)
多说一句, 在某个版本之后 Post-Build Script Plug-in 这个插件被下架了, 我是废了好大劲找到了
贴个地址:(地址无效可以私信我)
http://www.filewatcher.com/m/postbuildscript.hpi.659688-0.html
这个安装方式比较特殊: 系统管理 -插件管理 里面的高级选项卡 下的上传插件, 选择 hpi 即可.
第四步, 新建构建项目
前戏刚刚结束, 这才是真正的开始, 慢慢享受.
构建分 6 个块:
1.General
这部分主要就是对一些基本信息填写, 项目名称, 描述基本选择, 我这里选项都没选, 直接上图,
1
2. 源码管理
这部分主要是从哪获取代码, SVN 或者 GIT, 这里我是 GIT
输入 GIT 仓库地址,
然后选择一个认证 (credentials),
然后选择分支
2
这里划重点:(看文字和下图 3)
这里重点说一下 credentials, 这个不是随便建个用户名就行的, 是要和当初配置 GIT 一样, 正常应该是 SSH 的,
下面图里选择 SSH Username with privatekey
Username 应该不是随便添的, 反正我是 GIT 的账号名字
PrivateKey 就是在 ssh 目录下获取的, 目录是~/.ssh/id_rsa, 把中间一段复制进来
Passphprase 就是当时生成 PrivateKey 时的密码, 如果不填, 稍后拉分支代码时会在命令行提示 Enter passphrase for key.
3
PS: 到这里保存完了, 构建项目正常应该可以拉到代码了.(保存返回上个页面点击立即构建)
但这里肯能会有个小问题, 就是 10 分钟超时, 如果项目过大, 10 分钟拉不下来就超时失败了, 看下错误信息如果 timeout, 那么可以这么改, 在图 2, 源码管理选项卡中, 点击 "add", 点击 "Advanced clone behaviours", 然后设置 Timeout (in minutes) for clone and fetch operation 单位分钟.
3. 构建触发器
说明: 这个可以根据需求来设置或不设置
这里在网上粘了一段关于 pull scm 时间设置的:
This field followsthesyntaxofcron (withminor differences). Specifically,eachlineconsistsof5fields separatedbyTABorwhitespace:
MINUTE HOUR DOM MONTH DOW
MINUTE Minuteswithinthehour (0-59)
HOUR The houroftheday (0-23)
DOM The dayofthemonth (1-31)
- MONTH The month (1-12)
- DOW The dayoftheweek (0-7) where0and7are Sunday.
To specify multiple valuesforonefield,thefollowing operators are available. Intheorderofprecedence,
*'*'can be usedtospecify all valid values.
*'M-N'can be usedtospecifyarange, suchas"1-5"*'M-N/X'or'*/X'can be usedtospecify skipsofX''svaluethroughtherange, suchas"*/15"intheMINUTE fieldfor"0,15,30,45"and"1-6/2"for"1,3,5"*'A,B,...,Z'can be usedtospecify multiple values, suchas"0,30"or"1,3,5"Emptylinesandlinesthat startwith'#'will be ignoredascomments.
In addition, @yearly, @annually, @monthly, @weekly, @daily, @midnight, @hourly are supported.
举两个例子:
// every minute** ** *// every 5 mins past the hour5* ** *
4
4. 构建环境
我没做什么配置...
5. 构建
如果是 xcode9 请看一 否则 请看二
一 :xcode9 版本
构建点增加构建步骤, 选 excute shell
然后增加一段打包脚本:
- #!/bin/bash -l
- SHCEME=xxxxxxx
- CONFIGURATION=Debug
- WORKSPACE_PATH=${WORKSPACE}/xxxx.xcworkspace
- #PROFILE_NAME="xxxx adhoc"
- #CODE_SIGN="iPhone Distribution: xxx xxx (xxxxxxxx)"
- EXPORT_OPTIONS=${WORKSPACE}/ExportOptions.plist
ArchivePath=${WORKSPACE}/build/xxxxx.xcarchive
PacktName=${WORKSPACE}/build/xxxxx.ipa
- #CODE_SIGN_IDENTITY="$CODE_SIGN" PROVISIONING_PROFILE_SPECIFIER="$PROFILE_NAME"
- #xcodebuild clean -project xxxxx.xcodeproj -scheme $SHCEME -configuration $CONFIGURATION -alltargets
xcodebuild archive -workspace ${WORKSPACE_PATH} -scheme ${SHCEME} -configuration ${CONFIGURATION} -sdk iphoneos -archivePath ${ArchivePath}
xcodebuild -exportArchive -archivePath ${ArchivePath} -exportPath ${PacktName} -exportOptionsPlist ${EXPORT_OPTIONS}
重点在于 ExportOptions.plist 是要自己放在指定目录里的, 否则就会报错.
这个文件可以自己 archive 然后 export 一个, 也可以照着下面图做一个
1
二: xcode8.3.3 及以下
Target 与 Xcode 项目中 Target 名字对应
Clean before build 设置为 YES
Configuration Release 的时候 Archive
.ipa filename pattern 随便起个名字不带后缀
Outout directory 为 ipa 的输出路径, 我这里是 ${WORKSPACE}/build/
这里说下 ${WORKSPACE} 这个环境变量:
我这里代表的是:/Users / 用户名 /.jenkins/workspace
5
6
上图的 Team ID 在下图这里找到
7
PS: 如果使用了 cocoapods, 需要配置 Advanced Xcode build options
Workspace File(不用加. xcworkspace)
xcode workspace file 的路径:
我这里的绝对路径是:/Users / 用户名 /.jenkins/workspace/build_ipa/test.workspace
build_ipa 是上面填写的项目名称, 所以我这里填写 test 就可以了
8
以上保存, 然后构建正常应该可以生成 ipa 了. 现在还差最后一步, 传 fir 或者做别的事情.
6. 构建后操作
上传 fir:
1)fir 插件
这个我用了, 但是一直报错: Can not found mapping or dysm file, 谁成功了, 说下咋弄的, 谢啦.
但也说下我的步骤吧, 安装插件: http://blog.fir.im/jenkins/
安装完了, 构建后操作会有 upload to fir:
9
2) 执行脚本上传
执行脚本之前需要安装 fir 上传用的命令:
sudo gem install -n /usr/local/bin fir-cli --no-ri --no-rdoc
上面的命令来自 fir.im 的工具 fir-cli, 这是他们的官方使用说明官方工具 fir-cli 使用说明 https://github.com/FIRHQ/fir-cli/blob/master/README.md
还记得上面装的 Post-Build Script Plug-in 插件么, 这次派上用场了,
点击 add generic script, 然后 content 里输入
#!/bin/sh
fir p ipa 路径 -T fir 的 token -Q
我这里的 ipa 路径是./Build/xxx.ipa
10
到这里应该就可以完美的构建并上传到 fir 上了.
参考文章:
http://www.jianshu.com/p/13e34671788f
2017.09.01 更新:
用了一段时间发现, 虽然根据教程弄完方便多了, 但是因为懒嘛, 总想着更自动化, 所以发现了参数化构建, 让我们变得更懒吧! 下面说说参数构建:
参数构建 1
1. 配置工程:
General 下选中 参数化构建过程, 然后点击下面添加参数, 里面有很多选项, 我这里选的是 String Parameter, 更多的等我研究一下, 目标是没有 copy 和 paste. 但有参数构建已经很方便了目前.
这里说个题外话, 如果有朋友关心如何通过 Develop 和 Release 来控制测试服务器和线上服务器的话, 请先参考一篇文章 www.jianshu.com/p/51a2bbe877aa
其实就是通过类似 ifdef(DEBUG) 或者 ifdef(RELEASE) 来控制的, 而 Develop 和 Release 和就是环境参数, 不懂的在来问我吧.
参数构建 2
2. 使用添加的变量:
就是在要用到的地方写 ${branch}
branch 是变量名, 定义了什么就用什么
3. 用参数构建:
参数构建 3
参数构建 4
来源: http://www.jianshu.com/p/ac1de2cb95fa