前言
在开发过程中,总是被其他同事(开发,测试,产品等)要求临时打个包。恰巧之前配置的是一套本地用Python命令的自动化打包工具,但是仍然无法避免的要贮藏当前分支的代码,然后切换分支在本机上打包。一来一回,很耽误时间,更不用说如果用的手动打包方式该有多浪费时间了。
那么如何提高工作效率呢?
把打包权限开放给测试,产品运维等同事,让他们随时可以打最新的包,让他们使用工具。我们只负责开发和提交代码,让测试来打包,让产品或运维来提审。其实最好就是部署devops平台(不了解的自己查资料),开发之后的流程与我们无关,一切的目的还是为了让自己能按时下班。
jenkins安装
代码语言:javascript复制brew install jenkins
安装完成后,开启jenkins服务或者每次手动开启jenkins(一般用第一种比较方便)
代码语言:javascript复制 #启动jenkins
brew services start jenkins
#停止jenkins
brew services stop jenkins
#重启jenkins
brew services restart jenkins
#直接启动jenkins
jenkins
打开浏览器,输入localhost:8080
,去相关路径找到密码复制进去即可
配置打包工程
首先检查有没有安装Git插件,如果没有,就在Plugin Manager
安装一下即可。
新建一个打包空工程
拉到Source Code Management
,输入你工程的gitlab http地址和想要打包的分支。第二行是要配置Credentials
,点击add,直接使用默认的类型Username with password
,然后输入你的gitlab用户名和密码即搞定。
接下来配置触发器Build Triggers
, 我这里是配置的一个命令触发和每天定时打包。还可以配置其他的各种触发条件,比如想要配置gitlab推送代码这种方式触发,那还需要去gitlab配置api token
,jenkins还要配置git lab connection
,Gitlab Jenkins搭建持续集成系统[1]
然后配置Build Environment
,我这里的样例是配置了获取git提交日志,但是后面用fastlane获取提交日志也行,没有采用这个。
最后一步,Build
,这里只写了fastlane ios agent_dev
,其实就是执行fastlane脚本。
fastlane配置
讲讲我这里为什么使用fastlane,网上有些人是直接在jenkins上配置构建命令或者
xcode build
脚本的,我试过是可以的,但是其实在配置过程中,繁琐又容易踩很多坑。所以最后还是用了fastlane
,只需要配置文件即可,以后也方便迁移修改,始终觉得无论什么工具,越简单越好。
fastlane安装
话不多说,直接开始,先更换ruby源
代码语言:javascript复制$ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
$ gem sources -l
https://gems.ruby-china.com
# 确保只有 gems.ruby-china.com
安装fastlane
代码语言:javascript复制$ sudo gem install fastlane -NV
fastlane配置
cd 到项目的目录里,然后执行fastlane init
在这给大家推荐一个好用的工具
Go2Shell
,安装打开后,在finder
上会出现一个笑脸按钮,点击后可以直接cd到当前目录,配合iTerm
更好用哦。
如下,这里选择4(自定义配置)。2和3是TestFilght和App Store配置,我这里暂时用不上,所以不选,后续也可以自己加上。
当命令执行到 bundle update
可能会卡住,需要打开项目目录下新增的文件GemFile
,修改一下ruby源。保存后,继续在当前目录下执行bundle update
即可。
#旧
#source "https://rubygems.org"
#新
source "https://gems.ruby-china.com"
FastLane编写
准备工作做完了,打开项目的目录,会发现新增了FastLane文件夹,里面有个Fastfile
文件。在里面配置打包脚本即可,以下是我的配置,修改后可以拿来直接用。在当前目录里执行fastlane
即可测试本地打包是否能成功。
default_platform(:ios)
platform :ios do
desc "Description of what the lane does"
before_all do
changelog_from_git_commits(
# commit message 范围:自上次成功提交至当前最新提交
between: [ENV['GIT_PREVIOUS_SUCCESSFUL_COMMIT'] || "HEAD^", "HEAD"],
# 格式化,%s 代表 commit message,%an 代表提交人名
pretty: "n iOS n - %s (%an)",
# 忽略 Merge 信息
merge_commit_filtering: 'exclude_merges',
)
# faselane中pod install的操作
targetName = "Backend" #项目名称
cocoapods
end
#-----------------------------------------------------------------------DEV配置
lane :agent_dev do|options|
currentTime = Time.new.strftime("%Y-%m-%d %H: %m: %S")
gym(
scheme:"Backend_debug",
configuration: "Release", #Release 或者 debug
clean:true, #清除上次构建
workspace:"AgentBackend.xcworkspace", # 项目入口文件名 如果是工作控件请换成:workspace: "xxx. workspace"
export_method:"ad-hoc", #打包的类型 ad-hoc 或者App Store等
output_directory:"/Users/XXX/Downloads/Backend_DEV#{currentTime}", #打包输出路径 我写的是时间,防止文件夹生成相同报错
output_name:"Backend_DEV", #生成的ipa文件名
export_xcargs: "-allowProvisioningUpdates"
)
puts "开始上传蒲公英"
pgyer(api_key: "b599c64357f6b8404c152a30caXXX", user_key: "819c717f5bd0d3123e248a1e431XXX",update_description:lane_context[SharedValues::FL_CHANGELOG])
puts "开始上传FIR"
firim(firim_api_token: "e69b09d037ca9979007e545a2b67XX",app_changelog:lane_context[SharedValues::FL_CHANGELOG])
end
changelog_from_git_commits
是为了在打包前获取git提交信息,然后在上传到蒲公英的时候取出来,作为更新信息填入进去。
cocoapods
命令是在打包前执行pod install
,如果需要这个命令,还需要在上面之前提到的Gemfile
里增加一行gem "cocoapods"
才能生效。
还需要注意workspace
,这个看你项目是使用.xcworkspace
还是.xcodeproj
,之前没注意写错了,一直报错找不到pod的三方库。
上传到蒲公英或Fir
以下是安装两个插件的命令,然后去平台上找到相应的key即可
代码语言:javascript复制fastlane add_plugin pgyer
#安装fir
fastlane add_plugin firim
通知相关人员
打包完成后需要通知到相关人员,可以通过邮件或企业微信,钉钉等其他方式。我用的是推到企业微信,在fastlane上可以配置,但是我这里直接在蒲公英上配置webhook的,fir同理。关于webhook,在企业微信或钉钉的群里,可以增加一个机器人,然后会生成一个webhook。
总结
以上流程算是比较简单快捷的,最多几个小时就配置好了,当然这只是一个简单示例,还可以配置相当多的东西,比如上传到商店等。整个过程中可能会出现很多问题,大部分都能在网上找到,如果实在找不到,可以评论留言,可能我也遇到过。
jenkins开始打包大概率会报的两个错
出现fastlane requires your locale to be set to UTF-8.警告
环境变量里面设置 export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8
,我在jenkins的环境配置和本机的.zshrc
和.bash_porfile
文件里都有设置。
出现 fastlane: command not found
这个情况一般是由于 jenkins 没有设置正确的 PATH,在命令行输入
代码语言:javascript复制echo $PATH
记录下输出的结果 在 jenkins 中系统管理-系统设置中,找到 环境变量(Environment variables) 在 key 中填写 PATH,在 value 中填写第一步中输出的结果 保存即可。如下图所示
参考资料
[1]
Gitlab Jenkins搭建持续集成系统: https://rorschachchan.github.io/2018/05/25/Gitlab-Jenkins搭建持续集成系统/