2016-09-13 4 views
2

나는 우리의 기능 테스트를 실행하는 두 개의 젠킨스 작업을 가지고 있습니다. 코드 검토를 위해 무언가가 제출되고 무언가가 마스터 될 때마다 다른 작업이 실행될 때마다 하나의 작업이 수행됩니다.xcodebuild에 환경 변수를 전달할 수 있습니까?

이들은 기능 테스트이므로 사용자 상태를 수정하는 응용 프로그램의 전체 흐름을 테스트합니다. 우리가 옳게 생각하는 문제는 모든 업무가 동일한 계정을 사용한다는 것입니다. 그래서 두 개의 Jenkins 작업이 병렬로 실행될 때마다 예기치 않은 상태에 놓일 수있는 동일한 계정을 수정하고 테스트를 실패 할 수 있습니다.

내 계획은 Jenkins의 BUILD_NUMBER 환경 변수를 사용하고 약간의 관절염을 적용하여 작업의 고유 번호를 보장 할 수있었습니다. 이 고유 번호는 환경 변수로 xcodebuild에 전달 될 수 있으며 모든 Jenkins '가 고유 한 계정에서 작업하고 있는지 확인하기 위해이 번호를 사용할 수 있습니다.

문제는 xcodebuild에 환경 변수를 전달할 방법을 찾을 수 없다는 것입니다. xcodebuild (또는 Fastlane을 사용하는 경우 xcargs)를 통해 사용자 정의 빌드 설정을 전달할 수도 있지만 이러한 값은 환경 변수로 액세스 할 수없는 것 같습니다. 그것들은 전처리기에 의해 접근 가능하기 때문에 값을 Info.plist로 내보내고 거기에서 읽을 수 있습니다. 그런데이 값을 바이너리에 구운 후에 이상이 아니라면 다시 만들지 않으면 바꿀 수 없습니다. 또한이 시점에서 나는 젠킨스가 디스크의 파일에 글을 쓰고 테스트를 읽도록 할 수 있습니다. 기본적으로 동일한 기능이며 빌드 설정을 전달하지 않아도됩니다.

답변

1

나는 내 자신의 VAR

나는 따옴표를 탈출 쉘했다에게 전달하는 GCC_PREPROCESSOR_DEFINITIONS 같은 것을 사용하여 기억한다. 내 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 
) 

가까지이 같은 쉘 뭔가 호출하기 끝났다 :

는 루비에이처럼 보였다

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 내부에서 루비를 사용하는 자신의 환경 변수.예를 들어, 환경에 액세스 할 수 GCC_PREPROCESSOR_DEFINITIONS 섹션으로

루비 리셀러 (VAR)를 추가하여 :

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

우리는 (우리의 Fastfile '체육관에서 체계를 비슷한 사용 : 0
gym( scheme: scheme, xcargs: { :PROVISIONING_PROFILE => 'profile-uuid', :PROVISIONING_PROFILE_SPECIFIER => 'match AppStore com.bigco.App' }, codesigning_identity: "iPhone Distribution: BigCo, Inc.()", ) 

는 빌드하는 동안이 방출 [: ad_hoc, 청소 : 사실, xcargs "GCC_PREPROCESSOR_DEFINITIONS의 = '$ GIT_BRANCH = # {지점} {상속}'" ' 는 지금까지 NSProcessInfo''로 액세스 런타임 변수가 내가 맹세 할 수 있기 )이 있었다 방법 그러나 그것을 찾을 수없는 것 – tapi

+0

이것은 "필자가 발견 한 유일한 능력은 Info.plist로 출력하고 거기에서 정보를 가져올 수있는 사용자 정의 빌드 설정을 전달하는 것입니다."라고 언급 한 메커니즘입니다. Fastfile 내부에서 xcargs 매개 변수를 사용했지만 어쨌든 xcargs에 전달한 것이 환경 변수 였고 전처리 매크로에서만 액세스 할 수있는 것이 아닙니다. –

1

을 @alisoftware를 통해, xcargs을 사용하여 추가 변수를 전달할 수 있습니다.

옵션 [: 계획, 구성 : 옵션 [: 설정], use_legacy_build_api : 옵션
+---------------------+-------------------------------------------------------------------------------------------------+ 
|            Summary for gym 2.53.1             | 
+---------------------+-------------------------------------------------------------------------------------------------+ 
| scheme    | Bespoke-iOS                      | 
| xcargs    | PROVISIONING_PROFILE=profile-uuid PROVISIONING_PROFILE_SPECIFIER=match\ AppStore\ com.bigco.App | 
…