在Azure DevOps Server (TFS)的流水线中编译和测试Xcode移动应用(iPhone)
概述
Xcode是开发基于苹果macOS系统的桌面应用和移动应用的主要IDE工具。使用Azure DevOps Server (原名TFS)系统中的pipelines流水线功能,可以方便的集成Xcode项目,使用web浏览器在DevOps服务器上,实现一键编译、测试和发布等工作,省却测试发布过程中复杂的流程,大幅提高测试发布的效率,提高开发和测试团队之间的协作效率。
本文已经某银行的IOS手机银行移动端为例,介绍如何在Azure DevOps Server中试系Xcode项目的持续集成和测试。
前提条件
由于苹果公司技术的封闭性,开发移动应用必须在macOS系统上完成编译、调试和打包任务,因此实现Xcode项目的编译必须首先安装一个macOS的代理,否则无法完成Xcode的自动编译和打包功能。
我在博客“在macOS苹果电脑上安装Azure DevOps Server(TFS)代理”(https://www.cnblogs.com/danzhang/p/11954476.html )一文中详细介绍了安装苹果代理的操作步骤。
配置流水线
在macOS上安装的Azure DevOps Server的代理后,就可以使用流水线功能来配置自动打包和测试功能了。
可以使用yaml脚本或者传统的窗口界面来新建一条Xcode的流水线。下面的示例我们使用窗口界面,以便可以更加直观的说明Xcode的配置信息。
- 新建一条流水线,选择编译的的代码,可以使用TFVC、Azure Git、gitHu、gitLab、SVN等多种源代码库
- 选择代理池,就是我们在前提条件中配置的macOS代理池
- 选择xCode模板,Azure DevOps Server会自动添加与Xcode相关的任务,在我们的示例程序中,比较关键的操作是Xcode的打包任务(下图中的Xcode archive)


注意下面几项设置:
操作:是指Xcode中的任务,例如build、archive;这里填写archive,指的是生成打包需要的所有文件
工作区或项目路径:是指xcode项目的工作区配置文件(对于代码库来说,实际上是一个文件夹,其中包含了编译的配置文件,是编译Xcode项目的起始文件)
方案:是指Xcode项目中的具体项目;可以是移动应用,也可以是独立的库library。
签名样式:可以选择手动签名、默认签名、自动签名等;我的示例项目中选择了手动签名,实际上使用了Xcode项目中配置的签名信息。
创建应用包:选择创建应用包后,可以自动生成移动应用ipa文件 - 设置如何存储编译后的ipa文件
在我的这个项目实施过程中,由于客户需要将ipa文件发布到一个web服务器上,供测试人员点击下载。我额外配置了一台FTP服务器,使用流水线中的FTP任务,将ipa文件上传到FTP服务器,供Web浏览器下载使用。
------------------------------------------------------------
http://www.cnblogs.com/danzhang/ DevOps MVP 张洪君
------------------------------------------------------------
在Azure DevOps Server (TFS)的流水线中编译和测试Xcode移动应用(iPhone)的更多相关文章
- 在Azure DevOps Server (TFS 2019) 流水线传递参数
变量概述 在Azure DevOps Server的流水线中,变量是衔接不同任务和不通代理之间的桥梁,它可以使相对松散.各自独立的任务之间相关影响并共享数据.在流水线中使用变量,可以在各任务之间相互调 ...
- 在Azure DevOps Server (TFS)中实现VUE项目的自动打包
概述 Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.由于它在数据绑定.页面展示和使用简单方面有很大的优势,逐渐被越来越多的前端开发团队使用.本文 ...
- Azure DevOps Server (TFS) 代码库Repo管理培训
Repo是分布式代码库Git中的一个专用词,用于存储和管理开发团队中特定的源代码. 使用Git,可以协调整个团队的代码更改. 即使您只是一个开发人员,版本控制也可以帮助您在修复错误和开发新功能时保持井 ...
- 还原Azure DevOps Server (TFS)中误删除的生成流水线
流水线历史记录 DevOps Server流水线的历史记录有完善的版本日志,用户可以随时回退到修改过程中的任何一个版本,还能比较差异.这个历史记录功能可以和代码库中的版本控制媲美. 图一:生成历史记录 ...
- Azure DevOps Server (TFS)中代码文件换行问题解决方案(Git)
之前写过一篇博客"探索TFS Git 库文件换行(CRLF)的处理方式",主要是针对TFVC代码库的. 下面这篇文章说明如何在TFS的Git库中处理代码换行的问题. 概述 在Azu ...
- 集成Azure DevOps Server(TFS) 与微软Teams
1.概述 Microsoft Teams是Office 365中团队协作的中心.将团队的所有聊天.会议.文件和应用程序放在一个位置.软件开发团队可以在一个专门的协作中心中即时访问他们所需的所有内容,T ...
- 在Windows操作系统的文件管理器中集成Azure DevOps Server (TFS)工具菜单
故事场景 使用过SVN的用户,都知道在Windows的文件夹上点击鼠标右键,就会弹出Tortoise SVN的操作菜单(俗称小乌龟).通过这个功能,用户不需要打开SVN工具,可以直接在Windows的 ...
- Azure DevOps Server (TFS) 修改工作项附件大小限制
1. 问题描述 当上传工作项附件时,系统提示"附件大小限制" 2.解决方案 2.1 默认设置 默认情况下,Azure DevOps Service和Team Foundation ...
- Azure DevOps Server (TFS) 修改Git文件大小限制
签入Git的所有文件将永远保留在存储库中,限制大文件签入到代码库,可以增加磁盘使用效率,提高系统备份还原等日常维护的效率. 通过下面的设置,团队项目管理员可以阻止超过特定大小的文件进入存储库.如果推送 ...
随机推荐
- 用OC实现双向链表:构造链表、插入节点、删除节点、遍历节点
一.介绍 双向链表:每一个节点前后指针域都和它的上一个节点互相指向,尾节点的next指向空,首节点的pre指向空. 二.使用 注:跟单链表差不多,简单写常用的.循环链表无法形象化打印,后面也暂不实现了 ...
- es6入门7--Set Map数据结构
本文作为ES6入门第十三章的学习整理笔记,可能会包含少部分个人的理解推测,若想阅读更详细的介绍,还请阅读原文ES6入门 一.set数据结构 1.set不接受重复值 ES6新增了Set构造函数用于创建s ...
- python接口自动化11-pytest入门
前言 pytest是一个非常成熟的全功能的Python测试框架,适合从简单的单元到复杂的功能测试,主要特点有以下几点: 简单灵活,容易上手: 支持参数化: 能够支持简单的单元测试: 标记测试功能与属性 ...
- mysql中的replace
replace字面意思是替换,在mysql里面的运用是 如下图所示 1. replace into test values(6, 'wowowo', 'new', 'japan') 这条语句则他会正 ...
- HDU 6556 (2018CCPC吉林 B题)
### HDU 6556 题目链接 ### 题目大意: 给你四个国家的时区,告诉你 A 国家的时间,让你输出这时候在 B 国家的时间,还需要输出对于 A 国家来说这是 昨天.今天 还是 明天. 分析前 ...
- consolidate.js 一个Node.js 模板引擎的集合
consolidate是一个模板引擎的结合体.包括了常用的jade和ejs.通过配置我们就可以使用多种模板引擎. consolidate.js安装 npm install consolidate co ...
- vs未能正确加载CSharpPackage包,未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包
VS2017打开项目时提示未能正确加载CSharpPackage包, 可以使用 devenv命令工具来解决,操作如下 打开vs2017开发人员命令提示符(请使用管理员身份运行),如图 敲入 deve ...
- JDK1.8新特性——Collector接口和Collectors工具类
JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...
- JVM中优化指南
JVM中优化指南 如何将新对象预留在年轻代 如何让大对象进入年老代 如何设置对象进入年老代的年龄 稳定的 Java 堆 VS 动荡的 Java 堆 增大吞吐量提升系统性能 尝试使用大的内存分页 使用非 ...
- JS基本语法---while循环---练习
JS基本语法---while循环---练习 练习1: 求6的阶乘 var ji = 1;//存储最终的阶乘的结果 var i = 1;//开始的数字 while (i <= 6) { ji *= ...