Macos配置Jenkins自动打包环境-iOS篇
最近准备着手搭建一些方便团队开发工作顺利进行的工具平台,首先就从Jenkins打包开始吧。其实关于ios的自动化打包文章在网上已经有N篇了,但我还是决定要写下这边文章,不是为了庆祝自动打包成功,而是为了记录在成功之前遇到的所有问题的梳理和总结,能够直接或者间接的帮助到需要的客官。
ok,那我们就开始正经的扯淡。
1. 安装Jenkins
此过程将一笔带过,毕竟安装起来还是很简单的,这个时候要有两种安装方式看起来比较厉害一种是Jenkins War包下载 ;另一种是利用Homebrew命令安装;
方式一:Jenkins War包 安装:(此种方式没有实际尝试,有问题的童鞋欢迎一起讨论)
命令录入:(此时注意Jenkins war包的路径问题,8080为端口号 也就是浏览器打开的地址:http://localhost:8080)
$ java -jar jenkins.war --httpPort=8080
方式二:Homebrew安装:
执行安装的命令
$ brew install Jenkins
Updating Homebrew...
==> Downloading https://homebrew.bintray.com/bottles-portable-ruby/portable-ruby-2.3.7.leopard_64.bottle.tar.gz
######################################################################## 100.0%
.... ... ...
🍺 /usr/local/Cellar/jenkins/2.143: 7 files, 75.4MB, built in 3 minutes 43 seconds
出现上述内容,则证明安装完成
然后,链接 launchd 配置文件 形成了一个替身到指定目录中
$ ln -sfv/usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents
launchctl是一个统一的服务管理框架,启动、停止和管理守护进程、应用程序、进程和脚本
在这里利用launchctl来启动Jenkins,启动方式如下:
$ launchctl load~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
当然,可以启动,就可以关闭Jenkins,关闭方式如下:
$ launchctl unload~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
番外篇:(如果理解的不正确还请各位大神只交)
注意,这里的路径出现的可能较为混乱
1. 通过brew安装的Jenkins的目录为 /usr/local/Cellar/jenkins/2.143
2. 而我们在形成配置文件替身到LaunchAgents文件中的时候目录使用的usr/local/opt/jenkins
可以看到的是Cellar和opt目录下均存在了Jenkins,实际上:
通过Homebrew安装的程序会存放在Cellar目录中,同时也会被同步到opt目录中,可能有人会想到变量属性中的strong,也就是任何修改都会同步进行。
找到usr/local/opt/jenkins/*.plist 文件,可以看到指向的war包路径为opt/jenkins/libexec目录中,所以上面的形成的配置文件替身也指向了这里。
与此同时,为了让全局能够使用安装的程序,系统会生成软连接至/usr/local/bin目录下。
既然使用上面的启动命令将指向opt中的jenkins目录,并启动程序,那么Cellar目录中的jenkins是否也可以被调起?怀着这种想法,我在终端录入了:
$ jenkins
Running from: /usr/local/Cellar/jenkins/2.143/libexec/jenkins.war
如我所愿,果然调起了Cellar中的jenkins,通过此方式也证明了bin目录存在的意义;
而后经过两种启动方式的验证,账户和Jenkins里面的创建的Task和配置 均存在,也证明了任何修改均在Cellar和opt目录中会同步进行。
2. Jenkins的准备工作
(因为此篇文章是在Jenkins准备工作完成之后写的,为了偷懒,就直接用文字描述带过了,此过程相对简单;)
此时此刻,我们就可以开启有趣的Jenkins之旅了。打开浏览器,输入神圣的地址
http://localhost:8080
不过这个时候并没有出现欢迎的页面,而是让我们去配置密码(Administrator Password),根据页面上的路径的提示,在终端录入命令 cat + 路径 就可以得到一个密码串,把此密码复制粘贴到页面的输入框内
$ cat /Users/xxx/.jenkins/secrets/initialAdminPassword
接下来将需要去下载安装Jenkins插件,可以直接选择建议安装,当所有的插件都安装完毕之后再进行后续操作。
最后在配置一个admin user就万事大吉了。
在这个时候,我们期待的欢迎页面就出现了
3. 安装插件
各位客官可根据自己的需求去安装想要的插件,比如Gitlab插件、xcode integration插件等
4. 配置证书(重头戏-前奏)
配置Keychains和Provisioning
选择 系统管理-Keychains and Provisioning Profiles Management
通过命令可以找到我们想要的keychains文件,上传login.keychain文件到网页中,如果没有此文件的也可将-db结尾的文件复制一份,删除“-db”即可上传
$ cd ~/Library/Keychains
$ ls
login.keychain-db login.keychain
xxx xxx xxx(others files)
然后上传证书的描述文件,可通过 访达 - 前往 - 前往文件夹 来录入描述文件的路径来找到
不过,通过网页选择文件进行上传无法直接跳转到目标路径,那么我们只能一级一级的寻找,但是当我们找到资源库这一级别的时候,却发现找不到相关文件,那么这个时候就要使用快捷键将隐藏文件显示出来 shift+command+. 即可看到。
注意,可能电脑中存放了很多描述文件,一定要选择我们将要使用的文件,如果不放心,可以选择删除所有,重新下载必要的,以免弄混。
5. 新建任务(重头戏)
选择“新建任务” - “输入名称” - “构建一个自由风格的软件项目” 随后会进入配置页面
此节我们重点介绍 构建 的部分
源码管理
我选择了git作为项目源,在配置用户的时候先点击 钥匙图标的按钮添加git的用户名和密码,然后成功之后再选择你添加的用户,可能会有一下延迟,可等待一会
构建环境
配置Keychains and Code Signing Identities
配置Mobile Provisioning Profiles,选择和项目中相同的描述文件
构建(最后才到重头戏)
#写在最前面,一定要保证线上的项目证书是正确的和匹配的,因为现在每次构建都会下载最新代码到本地,我一开始以为不会,所以一直在修改本地项目的证书,结果很多次都在提示证书有问题,bundle id不匹配等,所以如果大家碰到了这种失败原因,请检查证书问题是否匹配
# 项目中target的名字,大家应该都很熟悉
TARGET_NAME="LKGesturePasswordProject"
# app的名称,作为最后输出app和ipa包的名称
APPDISPLAY_NAME="LKGesturePasswordProject"
# 项目中使用的证书的名称,和上面配置的描述文件一定要一致
CODE_SIGN="iPhone Developer: xx xx (xxxxxx)"
# build的路径
BUILD_DIR="${WORKSPACE}/build"
# ipa存放的路径
IPA_DIR="${WORKSPACE}/ipa"
# 之前碰到过一个fail 找不到LKGesturePasswordProject.xcodeproj文件,所以添加了cd命令进入到项目中
cd "${WORKSPACE}/LKGesturePasswordProject"
# clean-build-archive(项目中的三个过程)
# 注意:下文中用到了-project 和 .xcodeproj 字样,适用于没有用pods的项目,如果使用了pods请使用-workspace和.xcworkspace进行替换
# clean - 注意这里直接配置了Release(我们可以再工程中根据API环境的切换来配置多个在这里进行切换)
xcodebuild clean -project $TARGET_NAME.xcodeproj -scheme $TARGET_NAME -configuration Release
# 设置build号
xcrun agvtool new-version -all ${BUILD_NUMBER}
# 其次,执行build:(一个fail,报错找不到描述文件,所以我添加了PROVISIONING_PROFILE声明,不知道上面的配置如何生效)
xcodebuild -project $TARGET_NAME.xcodeproj -scheme $TARGET_NAME -configuration Release build BUILD_DIR=$BUILD_DIR BUILD_ROOT="${WORKSPACE}/buildRoot" CODE_SIGN_IDENTITY="$CODE_SIGN" PROVISIONING_PROFILE="xx-xx-xx-xx-xx"
# 创建输出目录
mkdir -p $IPA_DIR
cp -f -r $BUILD_DIR/Release-iphoneos/$TARGET_NAME.app.dSYM $IPA_DIR
# 最后,将app打包为ipa
/usr/bin/xcrun -sdk iphoneos PackageApplication -v $BUILD_DIR/Release-iphoneos/$APPDISPLAY_NAME.app -o ${WORKSPACE}/ipa/$APPDISPLAY_NAME${BUILD_NUMBER}.ipa
# fail - begin :PackageApplication找不到,也就是xcode中缺少了此文件
# 可自行搜索此文件并且下载放到此目录中 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/
# 执行命令
# $ sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer/
# $ chmod +x /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication
# fail - end
至此,就可以点击保存,进行构建了,成功之后将会看到我们期待已久的ipa包了。
持续更新中,向着成熟化进发。(欢迎各位大佬指点迷津)