development

xcodebuild (Xcode 8) 및 CI (Travis / Jenkins) 환경에서 자동 서명 사용

big-blog 2020. 10. 27. 22:46
반응형

xcodebuild (Xcode 8) 및 CI (Travis / Jenkins) 환경에서 자동 서명 사용


Xcode 8의 출시와 함께 Apple은 서명 구성을 관리하는 새로운 방법을 도입했습니다. 이제 두 가지 옵션 ManualAutomatic.

코드 서명에 대한 WWDC 2016 세션 (WWDC 2016-401-Xcode 앱 서명의 새로운 기능)에 따르면 Automatic서명 을 선택 하면 Xcode가 다음과 같이 진행됩니다.

  • 서명 인증서 만들기
  • 앱 ID 생성 및 업데이트
  • 프로비저닝 프로파일 생성 및 업데이트

그러나 애플이 그 세션에서 말한 바에 따르면,는 Xcode에서 생성 한 프로비저닝 프로파일 Automatic Signing을 사용할 Development signing것이며 제한 될 것입니다.

이 문제는 Automatic SigningTravis CI 또는 Jenkins와 같은 CI 환경 에서 사용하려고 할 때 발생합니다 . 자동 및 배포 용 서명을 계속 사용하는 쉬운 방법을 찾을 수 없습니다 (Xcode가 개발 및 Xcode 생성 프로비저닝 프로파일을 사용하도록 강요하므로).

내 컴퓨터에서 찾을 수 있지만 새로운 "Xcode 생성 프로비저닝 프로필"이 개발자 포털에 표시되지 않습니다. 해당 프로필을 CI 컴퓨터로 이동하고을 위해 빌드 Development하고 내 보내야 Distribution합니까? Automatic Signing사용 을 재정의하는 방법이 xcodebuild있습니까?


기본적으로 Jenkins CI와 Xcode Plugin을 사용하여 동일한 문제가 발생합니다. 결국 .NET을 사용하여 빌드 및 코드 서명 작업을 수행했습니다 xcodebuild.

0. 전제 조건

다음 단계를 성공적으로 완료하려면 필요한 프로비저닝 프로파일 및 인증서를 설치해야합니다. 즉, 코드 서명이 이미 일반적으로 작동하고 있어야합니다.

1. .xcarchive 빌드

xcodebuild -project <path/to/project.xcproj> -scheme <scheme-name> -configuration <config-name> clean archive -archivePath <output-path> DEVELOPMENT_TEAM=<dev-team-id>
  • DEVELOPMENT_TEAM: 10 자리 개발자 팀 ID (예 : A1B2C3D4E5)

2. .ipa로 내보내기

xcodebuild -exportArchive -archivePath <path/to/your.xcarchive> -exportOptionsPlist <path/to/exportOptions.plist> -exportPath <output-path>

exportOptions.plist:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>method</key>
    <string>development</string>
    <key>teamID</key>
    <string> A1B2C3D4E5 </string>
</dict>
</plist>
  • method: 중 하나입니다 development, app-store, ad-hoc,enterprise
  • teamID: 10 자리 개발자 팀 ID (예 : A1B2C3D4E5)

이 프로세스는 예를 들어 Jenkins Xcode 플러그인이 수행하는 작업보다 Xcode로 수동으로 수행하는 작업에 더 가깝습니다.

참고 : .xcarchive 파일은 항상 개발 서명이되지만 2 단계에서 방법으로 "app-store"를 선택하면 올바른 배포 서명이 수행되고 배포 프로필도 "embedded.mobileprovision"으로 포함됩니다.

도움이 되었기를 바랍니다.


몇 가지 옵션을 시도한 후 CI 서버에서 사용할 수있는 솔루션은 다음과 같습니다.

  • CI 환경에서 개발자 인증서 및 개인 키와 자동 생성 된 프로비저닝 프로파일을 포함합니다.

사용 Automatic signing힘은 당신이 사용 Developer하고 인증서를 auto-generated provisioning profiles. 한 가지 옵션은 개발 인증서 및 개인 키 (응용 프로그램-> 유틸리티-> 키 체인 액세스) 및 자동 생성 된 프로비저닝 프로파일을 CI 머신으로 내보내는 것입니다. 자동 생성 된 프로비저닝 프로파일을 찾는 방법은로 이동하여 ~/Library/MobileDevice/Provisioning\ Profiles/모든 파일을 백업 폴더로 이동하고 Xcode를 열고 프로젝트를 보관하는 것입니다. Xcode는 자동 생성 된 개발 프로비저닝 프로파일을 생성하고이를 Provisioning Profiles폴더에 복사 합니다.

xcodebuild archive ...에 대한 .xcarchive서명 이 생성 됩니다 Development. xcodebuild -exportArchive ...그런 다음 빌드를 사임 할 수 있습니다.Distribution

  • CI 환경을 구축 할 때 '자동'을 '수동'으로 바꿉니다.

호출하기 전에 xcodebuild해결 방법을의 모든 인스턴스를 대체하는 것입니다 ProvisioningStyle = AutomaticProvisioningStyle = Manual프로젝트 파일입니다. 파일 sed에서 간단한 대체 찾기에 사용할 수 있습니다 pbxproj.

sed -i '' 's/ProvisioningStyle = Automatic;/ProvisioningStyle = Manual;/' <ProjectName>.xcodeproj/project.pbxproj

@thelvis는 gem을 사용하여이를 수행 하는 Ruby 스크립트 도 만들었습니다 xcodeproj. 스크립트는 변경된 사항을 더 잘 제어 할 수 있도록합니다.

xcodebuild그런 다음 CODE_SIGN_IDENTITY프로젝트에 설정된 코드 서명 ID ( )와 프로비저닝 프로파일 ( PROVISIONING_PROFILE_SPECIFIER)을 사용합니다. 이러한 설정은 매개 변수로 제공 될 수도 있으며 xcodebuild프로젝트에 설정된 코드 서명 ID 및 / 또는 프로비저닝 프로파일을 재정의합니다.

편집 : 엑스 코드 9, xcodebuild새로운 빌드 설정 매개 변수가 CODE_SIGN_STYLE사이에서 선택을 Automatic하고 Manual있으므로 프로젝트 파일의 매뉴얼과 함께 자동으로 인스턴스를 찾아서 교체 할 필요에 대한 추가 정보가 없습니다 엑스 코드와 엑스 코드 서버에 대한 서명의 새로운 기능 WWDC 2017 세션 (403)

  • 수동 서명으로 전환

수동 서명은 사용중인 코드 서명 ID 및 프로비저닝 프로파일에 대한 전체 제어를 제공합니다. 아마도 가장 깨끗한 솔루션 일 수 있지만 자동 서명의 모든 이점을 잃는 단점이 있습니다.

Xcode 8을 사용한 코드 서명에 대해 자세히 알아 보려면이 기사 와 WWDC2016 세션 401-Xcode 앱 서명의 새로운 기능을 추천합니다.


아직 여기에서 언급하지 않은 다른 옵션을 고려하고 있습니다. 서명 설정 만 다른 두 개의 동일한 대상을 설정합니다.

  • Development Target 은 자동 서명을 사용하여 새 장치 / 개발자가 추가 될 때 이러한 모든 이점을 얻습니다.
  • CI Target 은 수동 서명을 사용합니다.

단점은 두 개의 동일한 대상을 관리해야한다는 것입니다. 장점은 개발을위한 자동 서명의 이점을 얻고 빌드 시간 직전에 프로젝트를 수정하는 잠재적으로 취약한 스크립트를 유지할 필요가 없다는 것입니다.


Xcode 8.x 및 Jenkins for CI를 사용하는 경우. 그렇다면 아마도 ""YourProjectName "에 서명하려면 개발 팀이 필요합니다. 프로젝트 편집기에서 개발 팀을 선택하십시오.

SDK 'iOS 10.1'의 제품 유형 'Application'에 대해 코드 서명이 필요합니다. ** BUILD FAILED ** 작업 실행시.

해결책은 무엇인가?.

해결책은 다음과 같습니다.

  1. Xcode 프로젝트 빌드 설정에서 프로비저닝 프로파일을 없음으로 설정하십시오.

  2. 젠킨스에서 Xcode 설정 전에 실행 쉘을 만들고 아래 명령을 작성하십시오.

    sed -i '' 's/ProvisioningStyle = Automatic;/ProvisioningStyle = Manual;/' ProjectName.xcodeproj/project.pbxproj 
    

    기억하십시오 : 젠킨스의 빌드 섹션에서 Xcode 설정 전에 실행 쉘을 유지하십시오.

작동합니다.


저에게는 아무것도 효과가 없었습니다. 이 링크에 표시된대로 Mac Mini (Jenkins가있는 CI 서버)에 설치된 Xcode 앱의 파일을 변경하여 문제를 해결했습니다.
https://www.jayway.com/2015/05/21/fixing-your-ios -build-scripts /
또한 Xcode에서 자동 서명을 해제했습니다.

다 했어요! 마침내 작동합니다!


내 Unity 빌드가 내 XCode 프로젝트에 ProvisioningStyle 키를 추가하지 않는 것으로 나타났습니다. 그런 다음 "PostProcessBuild"빌드 스크립트를 사용하여 수동으로 ProvisioningStyle을 추가하는 방법을 찾았습니다. 즉, Unity에서 IOS XCode 프로젝트를 빌드 한 후 호출되는 코드 단위입니다.

먼저 수동 프로비저닝으로 설정된 경우 project.pbxproj 파일이 어떻게 생겼는지 살펴 보았습니다.

/* Begin PBXDictionary section */
    29B97313FDCFA39411CA2CEA /* Project object */ = {
        isa = PBXProject;
        attributes = {
            TargetAttributes = {
                1D6058900D05DD3D006BFB54 /* Unity-iPhone */ = {
                    ProvisioningStyle = Manual;
                };
                5623C57217FDCB0800090B9E /* Unity-iPhone Tests */ = {
                    TestTargetID = 1D6058900D05DD3D006BFB54 /* Unity-iPhone     */;
                };
            };
        };

Then I created my code to replicate the "structure" of the file seen above. (using the XCodeEditor project found here: XCodeEditor)

[PostProcessBuild]
public static void OnPostProcessBuild(BuildTarget target, string path)
{
    // Create a new project object from build target
    XCProject project = new XCProject(path);

    if (target == BuildTarget.iOS)
    {
        //Add Manual ProvisioningStyle - this is to force manual signing of the XCode project
        bool provisioningSuccess = AddProvisioningStyle(project, "Manual");

        if (provisioningSuccess)
            project.Save();
    }
}

private static bool AddProvisioningStyle(XCProject project, string style)
{
    var pbxProject = project.project;

    var attr = pbxProject.data["attributes"] as PBXDictionary;
    var targetAttributes = attr["TargetAttributes"] as PBXDictionary;

    var testTargetIDGuid = FindValue(targetAttributes, "TestTargetID");

    if (!string.IsNullOrEmpty(testTargetIDGuid))
    {
        var settings = new PBXDictionary();
        //here we set the ProvisioningStyle value
        settings.Add("ProvisioningStyle", style);

        targetAttributes.Add(testTargetIDGuid, settings);

        var masterTest = FindValue(targetAttributes, "ProvisioningStyle");

        if (masterTest == style)
        {
            return true;
        }
    }

    return false;
}

private static string FindValue(PBXDictionary targetAttributes, string key)
{
    foreach (var item in targetAttributes)
    {
        var ma = item.Value as PBXDictionary;

        foreach (var di in ma)
        {
            var lookKey = di.Key;

            if (lookKey == key)
            {
                return di.Value.ToString();
            }
        }
    }

    return "";
}

What fixed it for me was this: http://code-dojo.blogspot.jp/2012/09/fix-ios-code-signing-issue-when-using.html

... copying certificates from Login keychain to System keychain. You might also want to set all dev certificates to 'Allow all applications to access this item' (Right-click/Get Info/Access Control).


There is a tool called fastlane which makes using xcodebuild much easier and it is maintained meaning new updates will continue to provide support for changes to xcode. It makes it much easier to create scripts and config for building and codesigning your app among many other xcode automation tools it supports. I'd recommend giving it a look into.

참고URL : https://stackoverflow.com/questions/39500634/use-xcodebuild-xcode-8-and-automatic-signing-in-ci-travis-jenkins-environmen

반응형