整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

jenkins 集成 fastlane 打包 iOS

jenkins 集成 fastlane 打包 iOS 并将打包结果推送

用jenkins有将近三四个月了,为了支持iOS打包,网上有开源的工具集fastlane,就简单总结一下,使用的心得和过程中遇到的坑。。。。

一、打包

下载fastlane,就三个命令:

sudo gem update --system
sudo gem install bundler
sudo gem install fastlane

可以查看一下 fastlane -v的版本,我们打包主要用到gym和上传命令pilot,其他工具略有研究,但是未深入,还要提醒,我都是用的命令行格式,未使用官方推荐的Fastfile的方式,主要是我对ruby不够了解,因为我也是个大菜鸟。附上打包命令。

gym打包,需要讲解的不多,DEVELOPMENT_TEAM等等解释,可以详细看这里https://dpogue.ca/articles/cordova-xcode8.html
需要提醒的是 xcpretty_report_josn可以输出oclint需要的xcpretty执行之后的内容,这里可以oclint集成到一起

DEVELOPER_DIR="/Applications/Xcode.app" gym --workspace ${workspace_path} 
--scheme ${scheme} --clean true 
--configuration ${configuration} 
--xcargs "PRODUCT_BUNDLE_IDENTIFIER='${bundle_id}' DEVELOPMENT_TEAM='${DEVELOPMENT_TEAM}' PROVISIONING_PROFILE_SPECIFIER='${PROVISIONING_PROFILE_SPECIFIER}'" 
--export_method ${export_method} --archive_path ${archive_path} 
--codesigning_identity "${rightDistributionSign}" --xcpretty_report_json "${json_path}" 
--export_options ${ExoptionPlist} 
--output_directory ${ipa_path} --output_name ${ipa_name} || exit

二、集成

讲讲其他遇到的坑和解决方案。
由于主要使用fastlane中gym打包,但是这次需要注意的我们的需求是:

  • 需要分别打inhouse,adhoc,appstore的包
  • inhouse和adhoc作为内测,需要更换显示图标,加上内测字样。
  • inhouse包需要上传蒲公英(之前选择的Fir因为部分收费要求放弃了),需要跟slack对接,并且自动推送。

1、分别打三种包,对证书和rightProvision了解的不够透彻?

解决:把三种证书都从开发那里要过来,然后将自己的APPLE ID升级到开发者Admin状态,就具有了三种证书的使用权限,然后跟开发一一对接,对每个包分别对应的证书了解并整理,打包的时候一一对应上就好。这个过程中,收获的是对xcodebuild的method参数有更深的了解,其实inhouse,adhoce,appstore分别对应的打包方式是enterprise,ad-hoc,app-store。

2、需要更换inhouse的图标?

解决:之前想通过是打包的时候指向不同的target,后来的解决方案是直接替换。

for file in os.listdir(appIconPath):
 if ".png" in file:
 for appicon in os.listdir(replaceAppIconPath):
 if file==appicon:
 shutil.copy(replaceAppIconPath+'/'+appicon, appIconPath+'/'+file)

但是需要注意的是像素和尺寸需要保持一致,设计同学的帮忙很必要。

3、和slack对接

解决:其实我觉得slack真的非常好用,因为它提供了各种整合持续集成的api,这里特别佩服我们老大对这块内容的重视,slack和jenkins集成非常方便。
只是网速有点不靠谱。slack api地址:https://api.slack.com/docs/message-guidelines
附上我写的脚本,借助slack web api推送信息到slack,并且可以取出jenkins中执行者的信息:

#coding=utf-8
import sys
import time
import requests
import re
from slacker import Slacker

def send(job_url, job_name, starters, build_timestamp, workspace, build_cause, git_branch, change_log, text, userid):
 """执行结果推送slack,可选个人和channel"""
 api_token="xxxx"
 slack=Slacker(api_token, 100)
 data=[{
 "fallback": "Required plain-text summary of the attachment.",
 "color": "#36a64f",
 "fields": [
 {
 "title": "Job name",
 "value": job_name,
 "short": True
 },
 {
 "title": "Build Trigger",
 "value": starters,
 "short": True
 },
 {
 "title": "Build Time",
 "value": build_timestamp,
 "short": True
 },
 {
 "title": "Build Workspace",
 "value": workspace,
 "short": True
 },
 {
 "title": "Root Build Cause",
 "value": build_cause,
 "short": True
 },
 {
 "title": "GIT_BRANCH",
 "value": git_branch,
 "short": True
 },
 {
 "title": "Job url",
 "value": job_url,
 },
 {
 "title": "CHANGE_LOG",
 "value": change_log,
 }

 ],
 "footer": "XX公司",
 "ts": time.time()
 }
 ]
 try_times=0
 while try_times < 5:
 try:
 slack.chat.post_message(userid, text=text, attachments=data)
 return "push to slack failed"
 except Exception as e:
 time.sleep(50)
 try_times +=1
 if try_times >=5:
 raise Exception('push to slack failed')

def get_content(job_url):
 """取出console log全部内容"""
 url=job_url + "consoleText/api/json"
 headers={
 "Content-Type": "application/json",
 "Accept": "application/json"
 }
 response=requests.get(url, auth=("xx", "xx"))
 assert response.status_code==requests.codes.ok
 return response.content

def get_trigger(result):
 """取出构建者"""
 trigger_user=re.findall(r"Started by", result)
 trigger_other=re.findall(r"Triggered by", result)
 starters=""
 if len(trigger_user) > 0:
 starters=re.findall(r"Started by(.*)", result)[0].lstrip()
 elif len(trigger_other) > 0:
 starters=re.findall(r"Triggered by(.*)", result)[0].lstrip()
 return starters

if __name__=='__main__':
 if len(sys.argv) >=2:
 job_url=sys.argv[1]
 job_name=sys.argv[2]
 build_timestamp=sys.argv[3]
 workspace=sys.argv[4] 
 build_cause=sys.argv[5]
 git_branch=sys.argv[6]
 text=sys.argv[7]
 userid=sys.argv[8]
 change_log=sys.argv[9]
 result=get_content(job_url)
 starters=get_trigger(result)
 result=get_content(job_url)
 starters=get_trigger(result)
 send_userid=["#xx", userid]
 for i in send_userid:
 send(job_url, job_name, starters, build_timestamp, workspace, build_cause, git_branch, change_log, text, i)

然后构造请求,发送即可,详细不表。

4、因为我们app两个平台用的xcode版本不一致,需要升级到xcode8,需要将自动管理改为手动管理证书。

sed -i '' 's/ProvisioningStyle=Automatic;/ProvisioningStyle=Manual;/g' 
"$project_path/project.pbxproj"

5、pod install总是出现问题,分析可能是因为网络或者本机pod安装有问题。

若是pod问题,可以通过升级gem解决。

sudo gem update --system
sudo gem install -n /usr/local/bin cocoapods

最后

我知道我写的可能并不好,排版可能也不漂亮,但是是我们已经落地在用的工程,后续再加上持续集成jenkins中遇到的问题,请大家轻拍。谢谢。
再附上我们推送的截图。

.5 给图像视图添加圆角效果 [原创iOS开发-Xcode教程]

1. 双击打开之前创建的空白项目。

2. 本节课将为您演示,如何给一张矩形图片,添加圆角的效果。首先在一个空白项目中,打开视图控制器的代码文件。

3. 接着开始编写代码,实现这项功能。

4. 首先从项目中,读取一张之前添加的图片文件。

5. 初始化一个图像视图对象,用来显示读取的图片。

6. 初始化一个原点在(10, 80),宽度和高度都是300的矩形常量,作为图像视图的显示区域。

7. 设置图像视图的显示区域。

8. 接着设置图像视图层的圆角半径大小,使其半径大小等于图像视图宽度的一半。

9. 继续设置图像视图层的遮罩覆盖属性,进行边界裁切。

10. 将图像视图对象,添加到当前视图控制器的根视图。点击[编译并运行]按钮,打开模拟器预览效果。

11. 从弹出的模拟器中可以看出,您已经给图像视图添加了圆角效果。最后点击[停止]按钮,关闭模拟器,并结束本节课程。

每天几分钟,手把手带你轻松学会iOS开发

本文整理自:《互动教程 for Xcode9

& Swift4》APP, 非特殊说明,本文版权归原作者所有。

原文:http://coolketang.com/staticCoding/5a990dd8d50eee2ea302a1ef.html

文章标签: ios开发

个人分类: iOS移动开发

所属专栏: iOS开发从入门到精通

上一篇2.4 给图像视图添加边框效果 [原创iOS开发-Xcode教程] 下一篇2.6 给图像视图添加阴影效果 [原创iOS开发-Xcode教程]

code13正式版已经更新,这是Mac平台上一款专业的开发工具,Xcode 13 for Mac添加了强大的新团队开发功能,非常适合与Xcode云以及GitHub、Bitbucket和GitLab协作功能,你还能在Xcode中直接发起、审查、评论和合并拉取请求,这次的xcode mac版功能更加完善,欢迎各位来体验哦!

Xcode 13 for Mac官方介绍

Xcode 包含开发人员为 Mac、iPhone、iPad、Apple TV 和 Apple Watch 创建出色应用程序所需的一切。Xcode 为开发人员提供了统一的用户界面设计、编码、测试和调试工作流程。Xcode IDE 与 Swift 编程语言相结合,使开发应用程序变得简单而有趣。

https://mac.orsoon.com/Mac/187182.html

xcode13正式版功能特点

Xcode 包括 Xcode IDE、Swift 和 C/C++/Objective-C 编译器、Instruments 分析工具、模拟器、最新的 SDK 以及数百个强大的功能:

创新工具可帮助您创建出色的应用程序

? Swift 是一种直观的编程语言,安全、快速且现代

? SwiftUI 是一个革命性的框架,可使用声明式 Swift 语法创建用户界面

? Playgrounds 是一种试验 Swift 代码并与之交互的有趣方式

? 视图调试显示运行时所有应用程序 UI 视图层的 3D 堆栈

? 以几乎无限的方式拆分编辑器、显示预览或选择助手查看相关内容

? 实时问题会在您键入时显示错误,而 Fix-its 只需单击一下即可改进您的代码

? 源代码控制导航器和服务集成可帮助您跨团队管理代码

SwiftUI 和 Interface Builder 使设计界面变得容易

? SwiftUI 使用声明式 Swift 代码来清楚地描述您的界面

? 设计画布使用控件和修改器库以图形方式构建 UI 视图

? 以不同的屏幕尺寸、方向和字体大小预览 SwiftUI 代码或 UIKit 界面

? SwiftUI 代码始终与图形设计画布和预览完美同步

? 动画是使用简单的命令构建的,这些命令描述了您想看到的动作

专业的编辑器和调试器使您的代码保持在前端和中心

? 重构使修改 Swift、Objective-C、C 和 C++ 代码的结构变得容易

? 打开快速立即打开您项目中的任何文件

? 数据提示和快速查看可以通过在调试时将鼠标悬停在代码上来检查变量

性能分析仪器

? 随着时间的推移,将 CPU、磁盘、内存和 GPU 性能作为图形轨迹进行比较

? 确定性能瓶颈,然后深入代码以找出原因

? 直接分析您的应用程序,或以很少的开销对整个系统进行采样

? 创建具有独特可视化效果的自定义工具来分析您自己的代码和框架