【网易严选】iOS持续集成打包(Jenkins+fastlane+nginx)

2023-11-16

本文来自网易云社区

作者:孙娇


严选iOS客户端的现有打包方式是通过远程连接打包机执行脚本去打包,打完包会输出相应的ipa的二维码,扫一扫二维码可以安装,但是随着测试队伍的壮大,外包同学越来越多,在打包机输入命令的方式可用度越来越低,手动输入命令的缺陷有:

1、必须手动输入分支名,和buildversion(手动计算自增)

2、远程连接打包机不稳定,经常断线,影响效率

3、切换分支不方便(还经常切换失败)

基于以上的各个问题,我决定改造一下现有的打包方式,让任何一个新来的测试同学都可以直接动手自己打包,最终定下的方案是:底层使用fastlane来执行打包(不要问我选它的原因,毕竟github上有2w的star,好处自然是多到不用说),然后使用Jenkins来执行打包脚本,最终依然生成二维码以供方便的扫码安装。


因此主要步骤分为:

1、安装fastlane,编写打包脚本(网上的教程多到数不过来,请自行搜索),主要的目录结构如下: 59fe22cd-7eab-4dd5-8491-2a164bbadbea

主要的就是Appfile和Fastfile文件,Appfile里主要存写的是app包的bundleID,teamID等内容(内容涉及app机密就不贴出来了),Fastfile里主要是存储打包的脚本,我的脚本参考:

default_platform:ios

PROJECT_FILE_PATH = "./NeteaseYanxuan.xcodeproj"PLIST_FILE_PATH = "NeteaseYanxuan/NeteaseYanxuan.plist"OUTPUT_DIRECTORY = "/usr/local/var/www/Yanxuan"platform :ios do
  before_all do |lane, options|
    git_switch_branch(branch: options[:branch])
    git_pull
  end  #debug Build
  lane :debug do |options|
    update_info_plist(
	    plist_path: "#{PLIST_FILE_PATH}",
	    display_name: "网易严选push"	
    )
    update_app_identifier(
	    xcodeproj: PROJECT_FILE_PATH,
	    plist_path: "#{PLIST_FILE_PATH}",
	    app_identifier: "com.ntes.yanxuan"
    )  
    branch_dir = options[:branch]
    version_number = options[:version]  
    increment_version_number(
    version_number: "#{version_number}"
    )
    gym(       
      clean: "true",
      scheme: "NeteaseYanxuan", 
      export_method:"enterprise",      export_options: {
        provisioningProfiles: { 
          "com.ntes.yanxuan" => "YanXuan_enterprise",          "com.ntes.yanxuan.ServiceExtension" => "yanxuan_pushextension",          "com.ntes.yanxuan.todayExtension"=> "yanxuantodayExtension"
        } 
      },
      output_directory: "#{OUTPUT_DIRECTORY}/#{branch_dir}",
      output_name: "NeteaseYanxuan.ipa"
    )
  end
end


还有一个非常好用的小工具可以推荐, 关于切换分支的一个fastlane的插件,奉上github地址:fastlane切换分支插件,安装方法和使用方法上面有很详细的介绍,但是我在安装中遇到一个坑,就fastlane install_plugins安装之后,显示安装成功,但是使用的过程中一直报错,说找不到git_switch_branch,找了好久的原因最后只能将这个插件加到gemFile里去,然后手动执行安装,具体步骤:

  • 将“gem 'fastlane-plugin-git_switch_branch”加到Gemfile里

  • 然后执行bundle install

然后再去执行fastlane  laneName去打包,就可以正常的使用这个插件了! 


2、fastlane的打包脚本只能输出ipa的iOS包,这个包是没有办法直接安装的,需要对生成对ipa包装一下,生成可以扫描的二维码,这样的二维码每个人都可以直接扫描二维码然后下载安装,具体的方法是本地写好一个静态页面,每次将新生成的ipa去替换这个静态页面里的各个参数,安装客户端所需要的plist文件我们是存放在七牛上去管理,放在哪个平台是无所谓的,全凭你的资金决定!

这部分使用shell去做的,在脚本里调用fastlane去打包,然后再去替换各个参数,具体代码参考如下:

#!/bin/bashfunction help()
{  echo "Example: sh deploy.sh  --branch=master --version=1.0.0\n"
  echo "参数说明:"
  echo "    --branch            分支,可选,不填默认为master"
  echo "    --version           大版本号,可选,不填使用代码里指定的版本"
  exit 1}if [ $# -eq 0 ]  then
    helpfi#default configbranch="master"version=""#check argumentsfor var in "$@"do
  if [[ $var == --branch=* ]]; then
    branch=${var#--branch=}
  elif [[ $var == --version=* ]]; then
    version=${var#--version=}    
  fidone#__filePath即为当前脚本存放路径__filePath=$(dirname "$0")
qiniupy=$__filePath/qbox.py
html_folder=$__filePath/html

workspace_name="NeteaseYanxuan"onlineBaseUrl="https://dn-ios-deploy.qbox.me/"testBaseUrl="https://*******" #这个地方主要是你存放数据的路径
function build_app()
{
  fastlane debug version:$version branch:$branch
  dist_dir="/usr/local/var/www/Yanxuan/$branch"}

function sync_template()
{
  
  mkdir $dist_dir/html
  cp $html_folder/app.html $dist_dir/html/$workspace_name.html
  cp $html_folder/app.plist $dist_dir/html/$workspace_name.plist
  cp $html_folder/appios8.plist $dist_dir/html/$workspace_name-ios8.plist
  cp $html_folder/version.json $dist_dir/html/version.json
  
  sed -i '' s/@@version@@/$buildVersion/g $dist_dir/html/*
  sed -i '' s/@@name@@/$name/g $dist_dir/html/*
  sed -i '' s/@@bundleId@@/$bundleId/g $dist_dir/html/*

  local html=$onlineBaseUrl/$workspace_name/$branch/app.html
  local plist=$onlineBaseUrl/$workspace_name/$branch/app.plist
  local ios8fixplist=$onlineBaseUrl/$workspace_name/$branch/app-ios8.plist
  local ipa=$testBaseUrl/$branch/$workspace_name.ipa
  
  sed -i '' s#@@html@@#$html#g $dist_dir/html/*
  sed -i '' s#@@plist@@#$plist#g $dist_dir/html/*
  sed -i '' s#@@ios8fixplist@@#$ios8fixplist#g $dist_dir/html/*
  sed -i '' s#@@ipa@@#$ipa#g $dist_dir/html/*

  python $qiniupy $dist_dir/html/$workspace_name.html $workspace_name/$branch/app.html 
  python $qiniupy $dist_dir/html/$workspace_name.plist $workspace_name/$branch/app.plist 
  python $qiniupy $dist_dir/html/$workspace_name-ios8.plist $workspace_name/$branch/app-ios8.plist

  cp $dist_dir/html/version.json $dist_dir/../version.json
}echo "**** Package Application"build_appechoecho "**** Update html/plist"sync_templateechoecho "**** Complete @ `date +"%Y-%m-%d %T"`!"

脚本里需要用到qiuniupy,所以你的机器还是要安装好python相关的环境,安装的过程中遇到缺啥就直接安装啥,但是这个过程中我也遇到了一个坑,我pip install qiniu系统提示我安装成功,import的时候一直提示没有这个module,最终还是通过系统自带的easy_install qiniu来安装成功的。

到了这一步,所有的脚本都准备完成了,可以先在命令行里执行这个打包脚本,看是否能打包成功,到这步就成功了一半啦~~


3、有了脚本,如何方便的执行脚本,这时候就是Jenkins上场的时候到啦,Jenkins的安装就不多说了,网上的资料一抓一大把,但是!但是!但是!

Mac的同学请注意!注意!意!在Mac上安装Jenkins要额外关注权限的问题,我曾经就因为这个问题耗费了好几个美妙的夜晚,抓耳挠腮的解决权限的问题,各种不能访问,各种不能执行。发生这种问题的前提是下载和安装的从jenkins官网下载的pkg安装包,安装后会直接启动jenkins的web容器,然后你会发现jenkins的目录是默认安装在/Users/Shared/jenkins的(就是共享文件夹),也就是在你的用户目录之外,好像这时候Jenkins各种权限都没有,就各种执行失败了。解决办法就是尽量使用命令行安装,然后自己创建Jenkins的配置文件去启动Jenkins,那么一切都是受你的控制啦~~

配置文件的路径:/Library/LaunchDaemons,在这个路径下创建:org.jenkins-ci.plist,配置内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>StandardOutPath</key>
    <string>/var/log/jenkins/jenkins.log</string>
    <key>StandardErrorPath</key>
    <string>/var/log/jenkins/jenkins.log</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>JENKINS_HOME</key>
      <string>/Users/leon/Documents/IOSJenkins/Jenkins/Home</string>
    </dict>
    <key>GroupName</key>
    <string>daemon</string>
    <key>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>org.jenkins-ci</string>
    <key>ProgramArguments</key>
    <array>
      <string>/bin/bash</string>
      <string>/Library/Application Support/Jenkins/jenkins-runner.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>UserName</key>
    <string>jenkins</string>
    <key>SessionCreate</key>
    <true/>
  </dict>
</plist>

其中的JENKINS_HOME 就是你的路径,我这里放在了文稿下,因为我的其他脚本也放在文稿下,避免出现其他权限问题一了百了,放在同一文件夹下,解决所有问题。

配置完成启动Jenkins,接下来创建job的步骤网上的教程很多也很简单,就直接创建一个,我这边就不多说了。

主要是配置可执行的脚本,我的配置内容如下:
75e0c4d9-19cd-48da-8af5-a6cfaa0e9d5f?imageView&thumbnail=980x0
59f62097-06bb-4eca-b42e-3f055a910315?imageView&thumbnail=980x0

到此所有打包的脚本,执行都准备完成了,包生成的文件是存放在你的打包机上的,如何让其他用户能直接通过域名访问你的打包机器来获取包的内容呢,这时候你就需要在你的机器上配置一下Nginx,Nginx的配置教程也很简单,网上的教程也很多,我这边就不赘述了 ,配置完Nginx,其他用户就可以通过域名去访问你的打包文件啦~~


最终打包生成的结构如下所示:

d6460fda-a58c-426e-88c8-c87dcbe8e785

用户打开这个html文件,就可以直接扫码二维码去安装最新的iOS测试包啦,页面效果如下:
b9a5d2a0-638f-4e3f-bcd1-55919a3ab546?imageView&thumbnail=980x0

哈哈哈哈,页面是不是很美腻啊(已经把我会写的前端代码全都用上去啦)~~~

最终我们的一键打包功能就完成了,任何一个新来的同学都可以在Jenkins上去操作打包了,只要勾选各个参数,然后去点击立即构建,等打包完去收割二维码就可以了,简单方便。。。


网易云免费体验馆,0成本体验20+款云产品!

更多网易研发、产品、运营经验分享请访问网易云社区


相关文章:
【推荐】 消息推送平台高可用实践(上)
【推荐】 在Android中使用Protocol Buffers(中篇)
【推荐】 使用QUIC

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【网易严选】iOS持续集成打包(Jenkins+fastlane+nginx) 的相关文章

随机推荐

  • LDA 学习笔记

    1 LDA算法的介绍 1 1 算法的基本知识 隐含狄利克雷分布 Latent Dirichlet Allocation LDA 和机器学习中的线性判别分析 Linear Discriminant Analysis 不一样 首先是对狄利克雷分
  • 12346678

  • TQ210烧写uboot secureCRT和minicom都没有信息输出

    前几天一直在纠结TQ210烧写uboot 串口没有信息打印信息输出 结果又是这样的 说明波特率 串口号都是正确的 开发板一上电 按住空格键 结果还是一样 本以为是这个软件是破解版 有BUG 好 切换到LINUX 使用minicom 试试 还
  • m个苹果放入n个盘子

    题目描述 把M个同样的苹果放在N个同样的盘子里 允许有的盘子空着不放 问共有多少种不同的分法 用K表示 5 1 1和1 5 1 是同一种分法 输入 每个用例包含二个整数M和N 0 lt m lt 10 1 lt n lt 10 样例输入 7
  • mybatis的环境搭建

    mybatis的环境搭建 1 创建maven工程并导入坐标 创建mybatis需要的依赖有下面几个
  • vue H5页面跳转小程序及其传参小程序并接收

    第一次做H5跳转小程序 记录一下 代码前的配置不多说看文档 目录 微信开放文档 这里我们用到开放标签 跳转小程序 wx open launch weapp 使用之前需要在入口文件pubilc目录下index html文件下引入jssdk h
  • 使用Hexo 配置自己的博客

    安装前提 在Windows下可以到git官网 推荐使用代理 或者对应的镜像网站进行下载 安装git客户端 安装node js 使用git bash 安装 cURL curl https raw github com creationix n
  • Zotero:按GB/T7714 2015引用参考文献

    欢迎关注 ManTou馒头公众号 原创不易 转载请注明出处 点赞收藏再走 主要解决引用英文文献作者超过3个时出现 等 而不是 etal 的问题 Zotero 按GB T7714 2015引用参考文献 导入China National Sta
  • 剖析vue常见问题(一)之v-for与v-if的优先级

    背景 vue中经常使用到v for和v if 那么它们的优先级是怎么样的呢 怎么才能实现性能优化呢 下面来简单分析一下 如何分析 请参考以下测试demo 以及源码中参考src compiler codegen index js demo代码
  • 棋盘覆盖问题-递归分治

    输入 3 3 4 输出 如图 x 3 y 3代表特殊方块的坐标 坐标原点在坐标系左上角 如图也就是一个 size 4 的L型骨牌的棋盘覆盖问题 include
  • maven集成cucumber,mvn test单元测试不运行

    maven集成cucumber mvn test单元测试不运行 项目已集成cucumber jacoco测试覆盖率100 在application项目添加单元测试 覆盖率下降 发现单元测试覆盖的语句覆盖率没有统计到 经试验 发现是appli
  • Java Web工程中的web.xml配置文件

    Java Web工程中的web xml配置文件 前言 1 xml文件 xml文件 Extentsible Markup Language即可扩展标记语言 是用来定义其它语言的一种元语言 其前身是SGML 标准通用标记语言 xml文件是互联网
  • vue axios 跨域,携带cookie

    前端设置 axios 跨域 const axios require axios axios defaults withCredentials true 后端设置 express app use function req res next r
  • 宏函数、普通函数、内联函数的区别

    示例代码 宏函数 define SUM x x x 内联函数 inline int sum int x return x x 普通函数 int sum int x return x x 什么是内联函数 在普通函数定义时加上 inline 关
  • TCP/IP 协议——知识集锦

    精通 TCP IP 熟练使用 Socket 进行网路编程 这句话在招聘要求里经常见 但是平时压根用不到 虽然笔者用Unity3D 如果做联网需要用到Socket通信 奈何我还没做过网络游戏 这里补下相关知识 目录 1 什么是 TCP IP
  • Java——3.字符串的替换和去除空格操作_replace ()和 trim ()方法

    程序开发中 用户输入数据时经常会有一些错误和空格 这时可以使用 String 类的 replace 和 trim 方法 进行字符串的替换和去除空格操作 ExampleAPI04 public class ExampleAPI04 publi
  • tf卡低级格式化_tf卡写保护怎么去掉 磁盘被写保护解决方法

    今天智智教大家如何去除TF卡写的保护 MicroSD 卡是一种极细小的快闪存储器卡 原本这种记忆卡称为T Flash 有时候我们会遇到tf卡写保护的情况 要解除写保护 先确认一下是否真的被写保护 鼠标右键点击移动硬盘 属性 看看你的文件属性
  • R语言中使用dplyr包进行排序与添加序号的实战

    R语言中使用dplyr包进行排序与添加序号的实战 在R语言中 dplyr是一个非常强大的数据处理包 它提供了一套简洁而一致的函数 用于对数据进行筛选 排序 汇总和变形等操作 本文将介绍如何使用dplyr包进行排序 并为数据添加序号 首先 让
  • java的反射机制Class.forName()

    Class forName 方法的作用 就是初始化给定的类 1 Class 类概念 Class 也是一个 Java 类 保存的是与之对应 Java 类的 meta信息 元信息 用来描述这个类的结构 比如描述一个类有哪些成员 有哪些方法等 一
  • 【网易严选】iOS持续集成打包(Jenkins+fastlane+nginx)

    本文来自网易云社区 作者 孙娇 严选iOS客户端的现有打包方式是通过远程连接打包机执行脚本去打包 打完包会输出相应的ipa的二维码 扫一扫二维码可以安装 但是随着测试队伍的壮大 外包同学越来越多 在打包机输入命令的方式可用度越来越低 手动输