美文网首页CI自动化打包自动化与单元测试
iOS Jenkins CI 集成上传fir、AppStore

iOS Jenkins CI 集成上传fir、AppStore

作者: 轻拂丶肩上雪 | 来源:发表于2017-07-09 22:36 被阅读775次

    iOS Jenkins CI 集成上传fir、AppStore

    背景:由于我司的App比较多,为了方便测试人员测试,所以配置Jenkins去自动打包。

    集成步骤

    下载dmg

    在Jenkin官网下载Jenkins的安装包 Jenkin官网下载

    选择相应系统下的安装包

    安装

    采用Jenkins安装包的方式安装就比较傻瓜式了,只需要点击继续就可以了

    点击继续 点击同意 点击安装 输入用户登录密码并点击安装软件开始安装Jenkins 正在安装 安装成功 这时候会多了一个jenkins用户

    等Jenkins启动成功后会看到下面这个页面, 去到 '/Users/Shared/Jenkins/Home/secrets' 目录下

    如果没有权限打开这个文件夹,就打开secrets的简介,修改这个文件夹的属性。

    修改secrets文件夹的属性后就可一看到这些文件,打开终端执行 sudo more /Users/Shared/Jenkins/Home/secrets/initialAdminPassword命令(也可以直接在编辑器中打开文件)

    执行命令结束后会拿到一串密码复制后粘贴在浏览器中点击continue就可以了

    建议选择左侧的选项,安装jenkins推荐的插件就可以了

    开始安装插件 创建管理员账户

    至此 Jenkins 安装已经结束下面我们开始配置我们的 Jenkins

    Jenkins 配置

    在配置 Jenkins 时,我们首先要做的就是安装关于 iOS 的插件,在我们使用
    xcode 打包的时候需要配置证书和描述文件,所以 Jenkins 用户需要一个和电脑用户中间的一个媒介来管理证书我描述文件。我们需要安装 Keychains and Provisioning Profiles Management 插件。

    选择系统管理然后选择插件管理 在可选插件中选择Keychains and Provisioning Profiles Management插件点击直接安装

    新建任务

    Jenkins 首页的右上角选择新建 -> 输入项目的名称(推荐选择 构建一个自由风格的软件项目选项 )-> 保存后会到项目的配置页面

    在源码选项下有 NoneGitSubversion 三个选项。由于我司的代码是在
    git 下托管的,所以我配置的也是 git。不相同的同学简单配置下,步骤应该差不多。

    说明:这里遇到一个小坑,在输入代码的URL会有一个上面所示的红色错误,是讲没有权限连接远程仓库,我就把自己电脑上的git私钥添加到Jenkins上(图中点击Credentials选项后面的add按钮,不会的同学下面会有图文教程)。当我把私钥添加到git服务器上后,事实告诉我然并卵。


    解决办法:因为在构建的时候是 Jenkins 去构建,所以应该是在 Jenkins 用户下去生成 git 的公钥和私钥。那么:

    // 1.首先我们要为 Jenkins 用户设置一个登陆密码(初始密码就是之前的那一串很长的密码)
    $ sudo dscl . passwd /Users/jenkins passWord---(同学,不要全部复制好吗password是要设置的密码)
    // 2.登陆Jenkins用户
    $ sudo su jenkins ----之后输入刚才设置的Jenkins的登陆密码
    // 3.生成Jenkins的git公钥和私钥
    $ ssh-keygen -t rsa -C "你的邮箱标识" -f ~/.ssh/jenkins
    

    公钥和私钥生成

    公钥和私钥就生成完毕

    至此Jenkins用户下的 git 公钥和私钥就生成完毕,去到/Users/Shared/Jenkins 修改.ssh文件的权限(不会的同学,看下面的图)

    修改目前登陆用户的权限

    这时打开.ssh文件就可以看到刚才生成的公钥和私钥

    公钥和私钥
    //  修改权限后打开终端运行 
    $ sudo more /Users/Shared/Jenkins/.ssh/jenkins.pub
    
    // 将公钥上传到 `git` 服务器
    // 同上运行,查看公钥
    $ sudo more /Users/Shared/Jenkins/.ssh/jenkins 
    
    // 得到 Jenkins 的 git 私钥如下图:
    
    Jenkins 的 git 私钥
    • 添加私钥


      粘贴进来后点击下方的add即可

    这时刚才的错误已经不见了,恭喜老铁

    如果打包的时候只需要打某一个分支的ipa,只需要修改branches to build 选项中的分支名即可。

    点击立即构建,这时我们需要等待几分钟。累了的同学可以下去抽支烟

    几分钟后我们会看到:

    这时代码已经拉取到我们Jenkins目录下,有兴趣的同学可以去看一下

    这时我们的Jenkins配置基本上结束了,下面就是进行打包的配置。


    针对iOS自动化打包的配置

    1.上传钥匙串。选择 系统管理 -> `Keychains and Provisioning Profiles Management

    点击上传login.keychain

    login.keychain在 /Users/用户名/Library/Keychains/login.keychain 目录下,选中 login.keychain 点击 upload 即可,而 Provisioning Profiles Directory Path 就是本机安装的描述文件的目录是在 /Users/用户名/Library/MobileDevice 目录下的。配置结束后点击 Save 按钮即可

    说明:当点击 upload 按钮后在 /Users/Shared/Jenkins/Home/kpp_upload 目录下的 login.keychain 就是刚刚上传的 钥匙串 。如果在 /Users/Shared/Jenkins/Library/MobileDevice 目录下没有 Provisioning Profiles 文件,就从 /Users/admin/Library/MobileDevice 目录下拷贝一份放过去。不然就会打包失败, 失败的日志如下图:


    打包前xcode中项目配置

    achieve项目配置如下图:

    屏幕快照 2017-07-10 上午9.45.52.png

    说明:因为我们要去脚本中指定证书,所以在xcode中我们不做任何证书方面的处理
    补充:在 xcode 的菜单栏选中 product -> Scheme -> Manage Schemes 查看对要打包的 scheme 后面的shared 勾有没有打上,不然打包的时候会报 scheme not found 的错误导致打包失败

    export ipa 项目配置:
    我们需要在项目中配置一个plist来告诉xcodebuild下面的信息
    metmod : 常用的值 developmentapp-storead-hoc
    teamID: 就是打包证书名称括号里的那一串字符串拷贝一下就可以了
    compileBitcode: Boolean 值, 推荐使用 yes, 这样打出来的包体积计较小
    附exportPlist配置图:


    打包脚本

    JENKINS_USERS=root
    APP_NAME=""
    CONFIGURATION="Debug"
    Scheme=""
    #描述文件udid
    PROVISIONING_PROFILE_SPECIFIER="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx" 
    #打包证书名称
    CODE_SIGN_DISTRIBUTION=""
    #exportplist的路径
    EXPORTPLIST_PATH=""
    #读取项项目的信息
    project_infoplist_path="./${APP_NAME}/Info.plist"
    bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${project_infoplist_path}")
    bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" "${project_infoplist_path}")
    DATE="$(date +%Y%m%d)"
    IPANAME="${APP_NAME}_V${bundleShortVersion}_${DATE}.ipa"
    IPA_PATH="$HOME/${IPANAME}"
    security unlock-keychain -p "这里写上用户登录密码 解锁钥匙串" "${HOME}/Home/kpp_upload/login.keychain" || failed "unlock-keygen"
    #没有使用cocoapod的打包方式
    scheme "${APP_NAME}"  -configuration '{$CONFIGURATION}' clean
    xcodebuild archive -project "${APP_NAME}.project" -configuration "${Configuration}" -scheme "${Scheme}" -archivePath "$HOME/${APP_NAME}_V${bundleShortVersion}_${DATE}" CODE_SIGN_IDENTITY="${CODE_SIGN_DISTRIBUTION}" PROVISIONING_PROFILE_SPECIFIER="${PROVISIONING_PROFILE_SPECIFIER}"
    xcodebuild -exportArchive -archivePath "$HOME/${APP_NAME}_V${bundleShortVersion}_${DATE}.xcarchive" -exportOptionsPlist "${EXPORTPLIST_PATH}" -exportPath "${HOME}"
    #使用cocoapod的打包方式
    xcodebuild -workspace "${APP_NAME}.xcworkspace" -scheme "${APP_NAME}"  -configuration '{$CONFIGURATION}' clean
    xcodebuild archive -workspace "${APP_NAME}.xcworkspace" -configuration "${Configuration}" -scheme "${Scheme}" -archivePath "$HOME/${APP_NAME}_V${bundleShortVersion}_${DATE}" CODE_SIGN_IDENTITY="${CODE_SIGN_DISTRIBUTION}" PROVISIONING_PROFILE_SPECIFIER="${PROVISIONING_PROFILE_SPECIFIER}"
    xcodebuild -exportArchive -archivePath "$HOME/${APP_NAME}_V${bundleShortVersion}_${DATE}.xcarchive" -exportOptionsPlist "${EXPORTPLIST_PATH}" -exportPath "${HOME}"
    
    if [ CONFIGURATION=="Debug" ]
    then
    #上传至fir.im 日志可以看到内测app的链接
    fir publish 这里是打包结束的ipa的路径 -T这里是fir.im上的token -c "${commit_msg}"
    
    else if [ CONFIGURATION=="Release" ] 
    then
    #上传appStore
    altoolPath="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"
    "${altoolPath}" --validate-app -f "${IPA_PATH}/"${APP_NAME}".ipa" -u 开发者账号 -p 账号密码 -t ios --output-format xml
    "${altoolPath}" --upload-app -f "${IPA_PATH}/"${APP_NAME}".ipa" -u xxf@开发者账号 -p 账号密码 -t ios --output-format xml
    fi
    

    补充:上传 ipaappStore 的时候报说 altool file not found ,需要给 altool 建立软链接 打开终端执行

    ln -s /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms /usr/local/itms
    

    至此,iOS端的jenkins自动化集成就配置基本结束了,刚开始配的时候也踩了不少坑,也请教了很多大牛。所以小白整理了一下,有不正确的地方欢迎大牛们指正,感谢~~~~

    相关文章

      网友评论

      • Zz7777777:现在Mac 10.13.4 已经不存在login.keychain了 现在只存在login.keychain-db文件 结果上传保存 后来我用copy一份改名login.keychain 上传 也是没法弄到
        轻拂丶肩上雪:@HelloKids 这个我就不知道了 我最近也没看这个 :cry:
      • Zz7777777:打包脚本的脚本放在哪块执行
        轻拂丶肩上雪:@HelloKids 就在shell那里啊 文章里写了的 你再看一下
      • Zz7777777:sudo dscl . passwd /Users/jenkins passWord
        Password:
        passwd: Invalid Path
        <dscl_cmd> DS Error: -14009 (eDSUnknownNodeName)
        jiangpengdeMacBook-Pro:~ jiangpeng$ sudo dscl . passwd /Users/jenkins passWord
        passwd: Invalid Path
        <dscl_cmd> DS Error: -14009 (eDSUnknownNodeName)
      • 热血足球2016:请问你有QQ吗?想请假一些问题,谢谢大佬
      • 瘦了就是帅哥:请问构建失败的控制台输出怎么看呢?好像提示我FATAL: String index out of range: 15
        瘦了就是帅哥:@又忆江南 提示java lang字符串数组越界,怀疑是工程配置问题,昨天重新配置了三遍,还是不好使
        瘦了就是帅哥: @又忆江南 是配置出了问题,但是不知道哪出的问题
        轻拂丶肩上雪:@瘦了就是帅哥 是看不懂日志还是什么意思?

      本文标题:iOS Jenkins CI 集成上传fir、AppStore

      本文链接:https://www.haomeiwen.com/subject/fwvehxtx.html