使用 Jenkins 构建 iOS 应用程序
Building an iOS app with Jenkins
我想自动化 iOS 应用程序构建过程,该过程目前在台式计算机 (Mac) 上完全是手动的。 Gnu/Linux 机器上的中央构建服务器 Hudson/Jenkins、运行 已在组织基础结构中可用。
是否可以使用 Jenkins 构建此 iOS 应用程序,使用 Jenkins distributed builds 之类的工具(并因此将 Mac 机器配置为从机)?
您有任何示例、知道执行此操作的任何技术或替代方法吗?
是的,这是可能的。我们正在这样做,而且效果很好。您可以通过选择 Xcode-plugin 在 Jenkins 中配置一个 Xcode-slave。网上有很多不错的教程。
先看看这个 one。
我终于得到了我的 Jenkins 工作,并且 运行 在我使用我能找到的唯一教程辛苦工作了比我想要的更长的时间之后,不幸的是,这些教程都是 2015 年或更早的。所以我 post 编辑了一份真正的快速清单,列出了我为在我公司的本地 Mac mini 上成功设置 Mac 从站所做的事情。与您相似@lifeisfoo 我的组织目前在外部服务器上有一个 Jenkins 实例 运行ning。
根据 2018 年设置 Mac 从站的 link 见此处。
Setting up jenkins slave on Mac OS
关于在成功创建节点后设置 Jenkins 作业并且 Launch Agent 从您的 Jenkins 实例正确连接到您的 Mac 从站,请参见下文:
- 大多数情况下设置一个新项目a.k.a。 Manage Jenkins 部分的新工作是不言自明的
- 大多数较旧的教程都是准确的,因为您需要一些插件 Git集线器、钥匙串和配置文件管理(尽管仍然不是 100% 您需要这个插件,但仍然很好,并且可以设置它) 和其他我下载并安装但从未使用过的,包括我没有在作业设置的构建部分使用 Xcode 插件。
- 起一个项目名,勾选Github项目,添加以.git/结尾的url,将此项目限制为你为[=136]创建的Node =] slave,在源代码管理中我们使用了 Git 并且我再次添加了 url (以 .git 结尾,这次没有“/”,使用我的用户名和密码创建了新的凭据, */main 在要构建的分支部分,添加了 Github hook 触发器 url 用于 GITScm 轮询到我组织的 Github 帐户 web hooks 部分
- 在 Build 中我只使用了 Execute Shell 和 cd into /Users/jenkins/path/to/file
- 目前它不是一个工作区所以命令如下执行Shell
xcrun xcodebuild -project ProjectName.xcodeproj \
-configuration Release \
-destination 'platform=iOS Simulator,name=iPhone 6s' \
-allowProvisioningUpdates \
CODE_SIGN_STYLE='Automatic'
PROVISIONING_PROFILE_SPECIFIER=${PROVISIONING_PROFILE}
CODE_SIGN_IDENTITY=${CODE_SIGNING_IDENTITY}
截至 2018 年 2 月,我已将其更改为工作区,因为需要包含一些 cocoa pod SDK,因此我现在使用以下 "Execute Shell"s.
的组合
下面的脚本是每次运行一个pod安装(因为我添加了Pods/到git忽略文件只推送Podfile和Podfile.lock到Jenkins 从中提取的存储库)
cd /Users/jenkins/Desktop/projectFileWhere.xcworkspaceExists
/usr/local/bin/pod install
下面是运行项目在另一个"Execute Shell"
中构建
xcrun xcodebuild -workspace ProjectName.xcworkspace \
-scheme NameOfScheme \
-configuration Release \
-destination 'platform=iOS Simulator,name=iPhone 6s' \
-allowProvisioningUpdates \
CODE_SIGN_STYLE='Automatic'
PROVISIONING_PROFILE_SPECIFIER=${PROVISIONING_PROFILE}
CODE_SIGN_IDENTITY=${CODE_SIGNING_IDENTITY}
注意:
- 我不确定这是否绝对必要,但我确保将最新的 GitHub 存储库克隆到我的 Mac 从属机器中,进入 .xcodeproj 之前存在的同一项目目录。
- 一开始我也愚蠢地没有意识到 .xcworkspace 没有被推送到我的 GitHub 存储库,因为 build/*.xcworkspace 仍在我的 gitignore 文件中。删除它,re-pushed 回购并克隆到 Mac slave,它全是肉汁宝贝
- 我看到 CODE_SIGN_IDENTITY 的许多变体,有些变体专门告诉我添加 DEVELOPMENT_TEAM= 和 DISTRIBUTION_TEAM= 等参数,但这些都不是必需的。
坦率地说,我不知道是否需要 -allowProvisioningUpdates 或 CODE_SIGN_STYLE='Automatic' 但它对我有用。
- 我最终选择了执行 Shell 构建步骤而不是构建参数的 Xcode 插件,因为我能够更轻松地操作构建参数并针对我遇到的错误进行测试在我的 Jenkins 实例中每个构建的控制台输出中。最后还有更多更好的文档和帮助试图理解 Xcode 使用命令行构建,这基本上就是 Execute shell 正在做的事情因此我更喜欢它。
我想写这个 post 来指出我最终做了什么来构建这个工作,我在构建它时遇到的问题很容易解决,直到最后一个在代码签名中找不到我在 Xcode 的项目文件目标和项目中使用的 certificate/team 的配置文件:
- 我没有使用 Fastlane 或任何其他程序。只需 SSH 连接到 Mac slave.
- 设置Xcode命令行工具:xcode-select active developer directory error
1) 在这个 Wiki 中,我做了标题 "Xcode project setup" 正下方段落中所述的内容。
https://github.com/cyupa/JenkinsCI-iOS
2) 您需要在 Mac Slave 上同时拥有开发和分发证书的私钥和 public 密钥,以便通过 Jenkins 构建到 Mac Slave。需要在 Mac Slave 上为每个具有正确 Bundle ID 的帐户提供配置文件。
https://blog.noser.com/streamlining-ios-development-with-jenkins-and-wireless-app-distribution-2/
3) 将开发和分发的钥匙串和证书移动到登录或您创建的任何其他唯一钥匙串,但对于每个私钥,右键单击(双指点击)私钥并获取信息 -> 访问控制 - > 允许 /usr/bin/codesign 或所有应用程序访问此项目
4) 在 Mac slave 上的 Xcode 项目的构建设置中(确保你已经从你的 repo 下载到 Mac slave 并打开它曾经在 Mac Slave 的 Xcode 应用程序上),将构建设置更改为自动 and/or 只需在目标应用程序的常规中更改它并根据需要进行测试。
5) 解决我花了 2 天的问题的最后一块拼图是简单地将我的钥匙串添加到安全列表中,这样 Xcode 就可以使用它需要的证书的配置文件.
如果您将钥匙串添加到安全列表中,我不确定我上面关于访问控制的建议是否有必要,但我保留了它并且它对我有用。也许我稍后会进行实验,看看实际需要什么和不需要什么,但就目前而言,这是关键。您可能会得到 "codesign failed with exit code 1",这是一回事。解锁的终端命令是:
security list-keychains -s ~/Library/Keychains/{login, "any other keychains you want added to security list"}.keychain
太棒了,如果您在 Jenkins 中看到任何构建错误,例如......
未找到 'com.organization.Target' 的配置文件:Xcode 找不到任何 iOS 与 'com.organization.Target' 匹配的应用程序开发配置文件
代码签名错误:SDK 'iOS 11.2'
中的产品类型 'Application' 需要代码签名
.......那么你很可能知道它很可能是一个钥匙串访问的东西,没有别的。
事后看来,我现在意识到我在其他一些 Stack posts 和一两个其他博客 posts 中看到了与下面 linked 相同的建议,但那不是' 我当时的问题,所以我完全忘记了它,现在恨自己没有阅读这些 post 的速度慢。那好吧。至少我现在得到了一个绿色圆圈。
我想自动化 iOS 应用程序构建过程,该过程目前在台式计算机 (Mac) 上完全是手动的。 Gnu/Linux 机器上的中央构建服务器 Hudson/Jenkins、运行 已在组织基础结构中可用。
是否可以使用 Jenkins 构建此 iOS 应用程序,使用 Jenkins distributed builds 之类的工具(并因此将 Mac 机器配置为从机)?
您有任何示例、知道执行此操作的任何技术或替代方法吗?
是的,这是可能的。我们正在这样做,而且效果很好。您可以通过选择 Xcode-plugin 在 Jenkins 中配置一个 Xcode-slave。网上有很多不错的教程。
先看看这个 one。
我终于得到了我的 Jenkins 工作,并且 运行 在我使用我能找到的唯一教程辛苦工作了比我想要的更长的时间之后,不幸的是,这些教程都是 2015 年或更早的。所以我 post 编辑了一份真正的快速清单,列出了我为在我公司的本地 Mac mini 上成功设置 Mac 从站所做的事情。与您相似@lifeisfoo 我的组织目前在外部服务器上有一个 Jenkins 实例 运行ning。 根据 2018 年设置 Mac 从站的 link 见此处。 Setting up jenkins slave on Mac OS
关于在成功创建节点后设置 Jenkins 作业并且 Launch Agent 从您的 Jenkins 实例正确连接到您的 Mac 从站,请参见下文:
- 大多数情况下设置一个新项目a.k.a。 Manage Jenkins 部分的新工作是不言自明的
- 大多数较旧的教程都是准确的,因为您需要一些插件 Git集线器、钥匙串和配置文件管理(尽管仍然不是 100% 您需要这个插件,但仍然很好,并且可以设置它) 和其他我下载并安装但从未使用过的,包括我没有在作业设置的构建部分使用 Xcode 插件。
- 起一个项目名,勾选Github项目,添加以.git/结尾的url,将此项目限制为你为[=136]创建的Node =] slave,在源代码管理中我们使用了 Git 并且我再次添加了 url (以 .git 结尾,这次没有“/”,使用我的用户名和密码创建了新的凭据, */main 在要构建的分支部分,添加了 Github hook 触发器 url 用于 GITScm 轮询到我组织的 Github 帐户 web hooks 部分
- 在 Build 中我只使用了 Execute Shell 和 cd into /Users/jenkins/path/to/file
- 目前它不是一个工作区所以命令如下执行Shell
xcrun xcodebuild -project ProjectName.xcodeproj \
-configuration Release \
-destination 'platform=iOS Simulator,name=iPhone 6s' \
-allowProvisioningUpdates \
CODE_SIGN_STYLE='Automatic'
PROVISIONING_PROFILE_SPECIFIER=${PROVISIONING_PROFILE}
CODE_SIGN_IDENTITY=${CODE_SIGNING_IDENTITY}
截至 2018 年 2 月,我已将其更改为工作区,因为需要包含一些 cocoa pod SDK,因此我现在使用以下 "Execute Shell"s.
的组合下面的脚本是每次运行一个pod安装(因为我添加了Pods/到git忽略文件只推送Podfile和Podfile.lock到Jenkins 从中提取的存储库)
cd /Users/jenkins/Desktop/projectFileWhere.xcworkspaceExists
/usr/local/bin/pod install
下面是运行项目在另一个"Execute Shell"
中构建xcrun xcodebuild -workspace ProjectName.xcworkspace \
-scheme NameOfScheme \
-configuration Release \
-destination 'platform=iOS Simulator,name=iPhone 6s' \
-allowProvisioningUpdates \
CODE_SIGN_STYLE='Automatic'
PROVISIONING_PROFILE_SPECIFIER=${PROVISIONING_PROFILE}
CODE_SIGN_IDENTITY=${CODE_SIGNING_IDENTITY}
注意: - 我不确定这是否绝对必要,但我确保将最新的 GitHub 存储库克隆到我的 Mac 从属机器中,进入 .xcodeproj 之前存在的同一项目目录。 - 一开始我也愚蠢地没有意识到 .xcworkspace 没有被推送到我的 GitHub 存储库,因为 build/*.xcworkspace 仍在我的 gitignore 文件中。删除它,re-pushed 回购并克隆到 Mac slave,它全是肉汁宝贝
- 我看到 CODE_SIGN_IDENTITY 的许多变体,有些变体专门告诉我添加 DEVELOPMENT_TEAM= 和 DISTRIBUTION_TEAM= 等参数,但这些都不是必需的。 坦率地说,我不知道是否需要 -allowProvisioningUpdates 或 CODE_SIGN_STYLE='Automatic' 但它对我有用。
- 我最终选择了执行 Shell 构建步骤而不是构建参数的 Xcode 插件,因为我能够更轻松地操作构建参数并针对我遇到的错误进行测试在我的 Jenkins 实例中每个构建的控制台输出中。最后还有更多更好的文档和帮助试图理解 Xcode 使用命令行构建,这基本上就是 Execute shell 正在做的事情因此我更喜欢它。
我想写这个 post 来指出我最终做了什么来构建这个工作,我在构建它时遇到的问题很容易解决,直到最后一个在代码签名中找不到我在 Xcode 的项目文件目标和项目中使用的 certificate/team 的配置文件:
- 我没有使用 Fastlane 或任何其他程序。只需 SSH 连接到 Mac slave.
- 设置Xcode命令行工具:xcode-select active developer directory error
1) 在这个 Wiki 中,我做了标题 "Xcode project setup" 正下方段落中所述的内容。 https://github.com/cyupa/JenkinsCI-iOS
2) 您需要在 Mac Slave 上同时拥有开发和分发证书的私钥和 public 密钥,以便通过 Jenkins 构建到 Mac Slave。需要在 Mac Slave 上为每个具有正确 Bundle ID 的帐户提供配置文件。
https://blog.noser.com/streamlining-ios-development-with-jenkins-and-wireless-app-distribution-2/
3) 将开发和分发的钥匙串和证书移动到登录或您创建的任何其他唯一钥匙串,但对于每个私钥,右键单击(双指点击)私钥并获取信息 -> 访问控制 - > 允许 /usr/bin/codesign 或所有应用程序访问此项目
4) 在 Mac slave 上的 Xcode 项目的构建设置中(确保你已经从你的 repo 下载到 Mac slave 并打开它曾经在 Mac Slave 的 Xcode 应用程序上),将构建设置更改为自动 and/or 只需在目标应用程序的常规中更改它并根据需要进行测试。
5) 解决我花了 2 天的问题的最后一块拼图是简单地将我的钥匙串添加到安全列表中,这样 Xcode 就可以使用它需要的证书的配置文件.
如果您将钥匙串添加到安全列表中,我不确定我上面关于访问控制的建议是否有必要,但我保留了它并且它对我有用。也许我稍后会进行实验,看看实际需要什么和不需要什么,但就目前而言,这是关键。您可能会得到 "codesign failed with exit code 1",这是一回事。解锁的终端命令是:
security list-keychains -s ~/Library/Keychains/{login, "any other keychains you want added to security list"}.keychain
太棒了,如果您在 Jenkins 中看到任何构建错误,例如......
未找到 'com.organization.Target' 的配置文件:Xcode 找不到任何 iOS 与 'com.organization.Target' 匹配的应用程序开发配置文件 代码签名错误:SDK 'iOS 11.2'
中的产品类型 'Application' 需要代码签名.......那么你很可能知道它很可能是一个钥匙串访问的东西,没有别的。
事后看来,我现在意识到我在其他一些 Stack posts 和一两个其他博客 posts 中看到了与下面 linked 相同的建议,但那不是' 我当时的问题,所以我完全忘记了它,现在恨自己没有阅读这些 post 的速度慢。那好吧。至少我现在得到了一个绿色圆圈。