你能将环境变量传递给xcodebuild吗?

时间:2016-09-13 20:59:31

标签: ios xcode jenkins xcodebuild

我有两个运行功能测试的Jenkins工作。一件事就是每当提交某些内容进行代码审查时,另一项工作就是在任何东西被推送到掌握时运行。

因为这些是功能测试,所以它们测试应用程序的整个流程,最终修改用户状态。我们遇到的问题是每个作业使用相同的帐户,因此每当两个Jenkins作业并行运行时,他们会修改同一个帐户,这会使他们处于意外状态并且无法通过测试。

我的计划是使用Jenkins的BUILD_NUMBER环境变量并对其应用一些关节,我可以为这份工作保证唯一的编号。然后可以将此唯一编号作为环境变量传递到xcodebuild,测试可以使用此编号来确保每个Jenkins都在使用一个唯一的帐户。

问题是我找不到任何方法将环境变量传递给xcodebuild。我知道您可以通过xcodebuild传递用户定义的构建设置(如果您使用的是Fastlane,则传递xcargs),但这些值似乎不能作为环境变量访问。它们可由预处理器访问,因此您可以使用它将值导出到Info.plist,然后从那里读取它。但是你已经把这些值加到你的二进制文件中了,除非你重建它并不理想,否则不能更改它。此时此刻,我可以让Jenkins写入磁盘上的文件并从中读取测试。它本质上是相同的功能,使我免于传递构建设置。

2 个答案:

答案 0 :(得分:1)

我记得使用像GCC_PREPROCESSOR_DEFINITIONS之类的东西来传递我自己的var

我不得不逃避报价。我最终把它编码到我的fastlane构建文件中。

在红宝石中它看起来像这样:

tmp_other_flags = {
  GCC_PREPROCESSOR_DEFINITIONS: '"DISABLE_PUSH_NOTIFICATIONS=1"',
  TARGETED_DEVICE_FAMILY: '1',
  DEBUG: '1'
}
other_flags = tmp_other_flags.map do |k, v|
  "#{k.to_s.shellescape}=#{v.shellescape}"
end.join ' '
puts "___ Custom Flags also know as xcargs:"
puts other_flags

gym(
  clean: true,
  silent: false,
  project: proj_xcodeproj_file,
  archive_path: "build-ios-xcarchive",
  destination: 'generic/platform=iOS',
  use_legacy_build_api: true,
  output_directory: 'build-ios',
  output_name: "MyApp.ipa",
  export_method: 'ad-hoc',
  codesigning_identity: 'iPhone Distribution: company (12345)',
  provisioning_profile_path: './dl_profile_com.company.myapp.iphone.prod_ad_hoc.mobileprovision',
  scheme: 'MyApp',
  configuration: 'Debug',
  xcargs: other_flags
)

最终在shell中调用了这样的东西:

set -o pipefail && xcodebuild -scheme 'MyApp' -project 'platforms/ios/MyApp.xcodeproj' -configuration 'Debug' -destination 'generic/platform=iOS' -archivePath 'build-ios-xcarchive.xcarchive' GCC_PREPROCESSOR_DEFINITIONS=\"DISABLE_PUSH_NOTIFICATIONS\=1\" TARGETED_DEVICE_FAMILY=1 DEBUG=1 clean archive CODE_SIGN_IDENTITY='iPhone Distribution: My Company (Blah)' | tee '/Users/andxyz/Library/Logs/gym/MyApp-MyApp.log' | xcpretty

xcodebuild - how to define preprocessor macro?

所以,也许你可以在fastlane中使用ruby来引入你自己的环境变量。将您的var添加到GCC_PREPROCESSOR_DEFINITIONS部分

ruby​​可以访问环境,例如:

ENV.fetch('TERM_PROGRAM') #returns "iTerm.app" on my machine

所以跟着上面一起:

tmp_other_flags = {
  GCC_PREPROCESSOR_DEFINITIONS: "MY_VARIABLE=#{ENV.fetch('MY_VARIABLE')}" ,
  TARGETED_DEVICE_FAMILY: '1',
  DEBUG: '1'
}

HTH

答案 1 :(得分:1)

通过@alisoftware,您可以使用xcargs传递其他变量:

gym(
  scheme: scheme,
  xcargs: {
    :PROVISIONING_PROFILE => 'profile-uuid',
    :PROVISIONING_PROFILE_SPECIFIER => 'match AppStore com.bigco.App'
  },
  codesigning_identity: "iPhone Distribution: BigCo, Inc. ()",
)

在构建过程中发出此信息:

+---------------------+-------------------------------------------------------------------------------------------------+
|                                             Summary for gym 2.53.1                                                    |
+---------------------+-------------------------------------------------------------------------------------------------+
| scheme              | Bespoke-iOS                                                                                     |
| xcargs              | PROVISIONING_PROFILE=profile-uuid PROVISIONING_PROFILE_SPECIFIER=match\ AppStore\ com.bigco.App |
…