티스토리 뷰

공부

Github Actions ) Archive and export

Zedd0202 2020. 5. 25. 17:00
반응형

 

안녕하세요 :) Zedd입니다.

저번에

zeddios.tistory.com/825

 

Github Actions 시작해보기

안녕하세요 :) Zedd입니다. 아니 CAShapeLayer...ㅆ ㅣ....... 암튼 ㅎㅎ 잘 안돼서 다른거 해보겠씁니다. 요새 깃헙가면 ㅎㅎ 이거 계속 떠 빡치게;; 함 해보자 정식으로 릴리즈 된거겠죠? 그럼 일단 GitHu

zeddios.tistory.com

Github Actions 시작해보기라는 글을 썼었습니다!

Github Actions가 뭔지 모르시는 분들은 읽고 오시면 도움이 좀 될지도..ㅎ

전 그냥 써본거라서 정의(?) 같은 건 없습니다...

오늘은 조금 더 어려운 걸 해볼건데, 제가 잘 할 수있도록 많은 응원 부탁,,드리는 부분~~~

 

제가 하고싶은건 말이죠.

1. 어딘가(?)에 push가 일어난다.

2. Unit Test, UI Test 쫙 돌림.

3. Build

4. 아카이브

5. ipa만든거 Github Actions의 Artifacts에 올림. 

여기에 .ipa파일이 나오는겁니다.

아주 간단하죠.

일단 저도..다~하고 글쓰는게 좋잖아요...?

 

 

다 하는데...이틀이 걸렸군요..

이렇게 삽질해본건 진짜 또 오랜만이네요

 

결과...

함께보시죠......

 zzzzzzz하.........

진짜...이거 됐을 때 진짜 혼자 개난리침

아티팩트 다운 받으면?

뭐 이런식으로 나옵니다. 

ㅋㅋㅇㅋㄹ.ㅋ.ㅋ.ㅋㅋㅋ.ㅋ.ㅋ.ㅋ.해버렸죠?

"성.공" 해버렸죠????;;;;;;;;

 

 

그러니까 오늘의 목표는

이것입니다. 

한참 뒤의 제가..이 글만 봐도 따라 할 수 있도록 차근차근 적겠습니다.

 

⚠️⚠️그리고 혹시!!!!⚠️⚠️

아 이거 내 회사 프로젝트에 한번 적용해봐야겠다~

하고 바로 회사프로젝트에서 시작하셔도 물론 됩니다. 되는데, 

이 글은 진짜 갓 만든 프로젝트로 하는거라...또 밑에서 언급하겠지만

master에 push될 때 action이 실행됩니다.

이걸 본인에 맞게 수정해서 따라하셔도 됩니다!

 

근데 제 추천은 연습용 프로젝트로 한번 따라해보시고 

다른곳에 적용하는것을 추천드립니다.

난 말했다

 

 

 

~ 필요한 것들 ~

1. 프로젝트

제 프로젝트구요. Xcode 11.4.1로 만든 프로젝트입니다!!!!!

 

2. gpg 설치.

암호화해주는 라이브러리?라고 생각하시면 됩니다.

brew install gnupg2

터미널에 ㄱ

 

3. certificate, provisioning file다운로드.

자. 우리가 할 건 아카이브 인데요,

Configuration이 Release죠?

Distribution certificate와 Distribution Provisioning이 필요합니다. 

아카이브해서; 앱스토어에 올려야할거 아냐;

먼저 certificate를 다운받아봅시다.

Keychain에 갑니다.

제 프로젝트의 Distribution 계정(?)에 가줍니다. 

우클릭하여

내보내기를 눌러줍니다.

p12타입으로 내보내셔야하고, 이름은 아무거나 지정해주세요.

저보고 훌륭하다내요,,,ㅋ~!

 암호를 지정해줘야 할텐데, 이 암호는 꼭 기억하고 계셔야합니다!

 

+ ) 근데 keychain에 Distribution이 없을 수..있겠죠!?! 

https://developer.apple.com/account/resources/certificates/list

 

로그인 - Apple

 

idmsa.apple.com

없으시면 여기에 가셔서 Distribution용 Certificate를 만드세요. 

 

그리고 provisioning.

아마 automatic signining을 해놓으셨으면 사이트에 안뜰텐데..하나 만들어주셔야 합니다. 

다음 다음 하다보면

이제 이런게 만들어질겁니다. 다운로드 받아줍니다. 

 

자, 이제 프로젝트로 갑니다.

위 그림에서 보실 수 있듯이, 저는 Debug는 Automatic으로 두고, Release만 Manual로 바꾸어줬습니다. 

우리 방금 다운받은 프로비저닝을 누르면 알아서 설치될거에요.

Build Setting에 가서 Release Configuration의 Provisioning이 잘 설치됐는지 꼭 확인해주세요.

 

자, 저는 certificate도 가지고 있어요. Xcode에 로그인해놨으니...

즉 나는 일단 ~ 애플에서 인증받은 개발자 ~ 라는 거죠.

근데 우리의 프로젝트가 github 가상 머신에서 빌드되고 돌아갈거란 말이죠?  

github 서버는 근데 애플에서 인증받은 개발자냐?!!

ㄴㄴ아님.

 

그래서 우리는 certificate랑 provisioning을 같이 올려야합니다. 

(이거 설명 맞는지 모르겠네ㅎ)

 

근데 certificate랑 provisioning을 쌩으로;;;;;;;막;;;;;

레포에;;;같이;;;업로드;;;;;;

 

는 개쌉오바자나요 ㅜㅜ..!!!

 

그래서 아까 다운받은 p12인증서와 provisioning을 암호화해줄겁니다.

아까 설치한 gpg어쩌고 써가지구요.

아까 p12인증서와 provisioning을 다운받은 곳으로 가주시고,

gpg -c certs.p12
gpg -c GithubActions2_Distribution.mobileprovision

2개를 암호화해주세요.

위 커맨드를 치면

이런게 암호를 넣는 화면이 뜰겁니다. 각각의 암호를 꼭 기억해주세요.

나중에 복호화 할 때 필요합니다. 

 

자 그럼 우리가 기억해야하는 암호가 3가지가 생기게 됩니다.

1. 저~~ 위에서

인증서를 export할 때 썼던 암호,

그리고 방금 cert와 provisioning을 암호화 할 때 썼던 암호 2개.

그렇죠? 

 

그럼 github에 가줍니다.

그리고 우리가 actions를 돌릴 레포로 가줍니다.

Setting ㄱ ㄱ

Secrets섹션으로 가서, New secret을 눌러줍니다.

자 이제 하나씩 등록하면 돼요!

이런식으로요. 그래서 저는

이렇게 3개를 만들었습니다.

여기까지 따라오셨죠!!!!

 

자, 아까 cert랑 provisioning암호화 했으면

.gpg파일 2개가 생겼을겁니다.

이걸 레포에 넣으면 됩니다. 저는

.github > secrets(내가 만듬) 에 넣어줬습니다.

 

마지막으로 준비해야할 건 ExportOptions.plist입니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>destination</key>
	<string>export</string>
	<key>method</key>
	<string>app-store</string>
	<key>teamID</key>
	<string>팀 아이디</string>
	<key>provisioningProfiles</key>
	<dict>
		<key>번들 ID</key>
		<string>GithubActions2_Distribution</string>
	</dict>
	<key>signingCertificate</key>
	<string>Apple Distribution</string>
	<key>signingStyle</key>
	<string>manual</string>
</dict>
</plist>

복사해주시고, 자기 프로젝트에 맞게 수정해주세요. 

destination이 upload면 앱스토어에 올라가는거고, export면 ipa가 만들어지는?것 같아요.

저는 upload는 지금 안되가지구 ㅠ export로 일단 해보겠습니다. 

.plist만드셨으면, 원하는 path에 넣어주세요. 

저는 그냥 여기에 넣어줬습니다.

 

자, 이제 끝났습니다.

github > 레포 가서

workflow를 만들어봅시다.

 

1. 어딘가(?)에 push가 일어난다.

2. Unit Test, UI Test 쫙 돌림.

3. Build

4. 아카이브

5. ipa만든거 Github Actions의 Artifacts에 올림. 

 

이런식으로 한다고 위에서 말했죠?

 

먼저 테스트를 돌리는 것 까지만 해봅시다.

 

 

on: push: branches: [master]의 뜻은 master에 push가 일어났을 때 하겠다~ 이렇게 보면 됩니다. 

그리고 job안에서 쓸 환경변수들을 좀 정의해줬어요.

정의 안하고 그냥 바로 써도 되는데, 정의하는게 편합니다.

그리고 주의할 점은..

 

⚠️저는 지금 workspace가 안만들어진 상황입니다. ⚠️

그래서 

"xcodebuild test -project" 이런식인거구요.

 만약에 본인의 workspace가 있다..고 하면 -workspace가 되어야하고, 

'GithubActions2.xcodeproj'도 'GithubActions2.xcworkspace'가 되어야합니다.

앞으로 나올 모든 것에서 본인이 workspace면 자기거에 맞게 바꿔주시면 됩니다.

 

 앞으로 환경변수 개많이 추가 할 예정이니 ㅎ 헷갈리지 마세요 ㅎ..!!!

 

yml파일을 생성해준다 

-> master에 파일이 생성됨

-> master에 push가 일어남 

-> action실행. 

 그러므로 Actions에 가서 좀 기다리면

이렇게 작업이 완료된 것을 볼 수 있습니다.

만약 실패했다..? 

그럼 로그들을 볼 수 있습니다. 

이렇게 왜 실패했는지 나름 상세하게 나오니까 보고 수정하시면 됩니다.

 

자, 이제부터 해야할 작업은 조금 복잡합니다.

 

우리가 인증서와 프로비저닝 암호화한걸 업로드 했으면

github 가상 머신에서 그걸 복호화하고 걔네의 가상머신에 인증서와 프로비저닝을 설치해야합니다. 

그래서. 

 


1. 임시 키체인 생성

 

2. 인증서 및 프로비저닝 복호화

/  임시 키체인으로 인증서 가져오기  

/ Xcode가 찾을 수있는 프로비저닝 프로파일 설치 

 

3. 앱 빌드

 

4. Archive 및 export

 

5. 아티팩트 업로드 


 

이러한 과정을 거쳐야합니다..^_ㅠ

위 과정을 본격적으로 시작하기 전에, 환경변수 설정을 먼저 해주겠습니다.

 

0. 환경변수 설정.

환경변수로 만들고싶으면 만들고 아니면 아닌거라서...일단 제 환경변수를 그대로 따라할 필욘 없습니다.

일단 우리가 명시적으로 지정해줘야 하는 것들을 생각해봅시다.

 

 .gpg파일들을

여기에 뒀었죠? 가상머신이

1) 이 path로 가서,

2) 암호를 가지고 복호화를 합니다.

3) 복호화시에도 어디에 복호화할건지 path를 지정해줘야합니다.

 

그럼 일단은 우리는 6개를 알아야합니다. 

- encrypted certificate path : .github/secrets/myCert.p12.gpg

- decrypted certificate path :.github/secrets/myCert.p12

- certificate 암호화 할 때 썻던 password (export할 때 썼던 거 말고) : github > secrets 탭에 있음

=> 접근은 secrets.CERTS_ENCRYPTION_PWD 이런식으로 함. 

 

- encrypted provisioning path : .github/secrets/GithubActions2_Distribution.mobileprovision.gpg

- decrypted certificate path : .github/secrets/GithubActions2_Distribution.mobileprovision

- provisioning 암호화 할 때 썻던 password : github > secrets 탭에 있음

=> 접근은 secrets.PROVISION_ENCRYPTION_PWD 이런식으로 함. 

아까 우리가 지정해준 이름있잖아요??? secrets.이름 이런식으로 하면 됩니다. 

그냥...그냥 됩니다(?)

 

그리고 이따가

1. certificate export할 때 썼던 암호도 필요하니 이것도 환경변수로 정의해줄게요.

2. 아카이브 한거 어따놓을건데 ㅡㅡ 아카이브 path도 지정해줘야합니다.

3. export path도 지정해줘야합니다.

XC_VERSION: ${{ '11.4.1' }}
XC_PROJECT: ${{ 'GithubActions2.xcodeproj' }}
XC_SCHEME: ${{ 'GithubActions2' }}
XC_ARCHIVE_PATH:  ${{ 'GithubActions2.xcarichive' }}
XC_EXPORT_PATH: ${{ './artifacts' }}
KEYCHAIN: ${{ 'test.keychain' }}
   
DECRYPTED_CERTS_FILE_PATH: ${{ '.github/secrets/myCert.p12' }}
ENCRYPTED_CERTS_FILE_PATH: ${{ '.github/secrets/myCert.p12.gpg' }}
          
DECRYPTED_PROVISION_FILE_PATH: ${{ '.github/secrets/GithubActions2_Distribution.mobileprovision' }}
ENCRYPTED_PROVISION_FILE_PATH: ${{ '.github/secrets/GithubActions2_Distribution.mobileprovision.gpg' }}
          
CERTS_ENCRYPTION_PWD: ${{ secrets.CERTS_ENCRYPTION_PWD }}    
PROVISION_ENCRYPTION_PWD: ${{ secrets.PROVISION_ENCRYPTION_PWD }}     
CERTS_EXPORT_PWD: ${{ secrets.CERTS_EXPORT_PWD }}

그럼 환경변수는 이렇게 됩니다. keychain은 굳~~이 안해줘도 되는데..블로그에서 하길래 ㅋ 저도 함

 

1. 임시 키체인 생성

- name: Configure Keychain
  run: | 
     security create-keychain -p "" "$KEYCHAIN"
     security list-keychains -s "$KEYCHAIN"
     security default-keychain -s "$KEYCHAIN"
     security unlock-keychain -p "" "$KEYCHAIN"
     security set-keychain-settings  

 

$KEYCHAIN 은 환경변수. 달러표시($)로 환경변수에 접근합니다.

 

⚠️이건 혹시나해서 말하는데, 복붙하실 때 주의하셔야합니다.

이렇게 빨간줄이 생기면ㅁ 안되구..indent를 잘 넣어줘야함 ㅎ 

 

2. 인증서 및 프로비저닝 복호화 / 임시 키체인으로 인증서 가져오기 / Xcode가 찾을 수있는 프로비저닝 프로파일 설치 

- name : Configure Code Signing
          run: |
            gpg -d -o "$DECRYPTED_CERTS_FILE_PATH" --pinentry-mode=loopback --passphrase "$CERTS_ENCRYPTION_PWD" "$ENCRYPTED_CERTS_FILE_PATH"  
            gpg -d -o "$DECRYPTED_PROVISION_FILE_PATH" --pinentry-mode=loopback --passphrase "$PROVISION_ENCRYPTION_PWD" "$ENCRYPTED_PROVISION_FILE_PATH"  
            security import "$DECRYPTED_CERTS_FILE_PATH" -k "$KEYCHAIN" -P "$CERTS_EXPORT_PWD" -A        
            security set-key-partition-list -S apple-tool:,apple: -s -k "" "$KEYCHAIN"   
    
            mkdir -p "$HOME/Library/MobileDevice/Provisioning Profiles" 
            cd ".github/secrets"
            echo `ls *.mobileprovision`
             for PROVISION in `ls *.mobileprovision`
             do
                   echo Hello, world!
                   UUID=`/usr/libexec/PlistBuddy -c 'Print :UUID' /dev/stdin <<< $(security cms -D -i ./$PROVISION)`
                   cp "./$PROVISION" "$HOME/Library/MobileDevice/Provisioning Profiles/$UUID.mobileprovision"
            done

근데 보통 이렇게 안하고 ㅠㅠㅠㅠㅠ 쉘 스크립트 만들어서 돌립니다. 근데 저는 일단 쫙 해보고 쉘 스크립트로 돌려보려구요!

중간에 echo는 제가 디버깅한다고 넣은건데;; 뭐 그냥 빼지는 않을게요

 

3. 앱 빌드

     - name: Archive
          run: |       
                mkdir artifacts
                xcodebuild archive -project GithubActions2.xcodeproj -scheme GithubActions2 -configuration release -archivePath GithubActions2.xcarchive

 

4. Archive 및 export

 - name: Export for App Store
          run:  |  
                  xcodebuild -exportArchive -archivePath GithubActions2.xcarchive -exportOptionsPlist ExportOptions.Plist -exportPath "$XC_EXPORT_PATH"

여기서 아까 우리가 만든 

요게 쓰입니다. 

 

5. 아티팩트 업로드

- name: Upload Artifact
          uses: actions/upload-artifact@v2
          with:
            name: Artifacts
            path: ./artifacts

 actions/upload-artifact@v2는 그냥..github에서 바로 쓸 수 있는 기능(?)이라고 생각하시면 될 것 같습니다..?

 

전체코드입니다.

 

 

 

 

 

 다운받아서 Transporter로 전송..하면 됩니다!!!!!

이렇게요.

 

appstore에 업로드 걍 하면 될 것 같은데...안되네요;; ㅠㅠㅠ

xcrun altool --upload-app -t ios -f GithubActions2.ipa -u "$APPLEID_USERNAME" -p "$APPLEID_PASSWORD" --verbose

이렇게 하는거 아닌가요..!? 왜안되지...

 

아무튼...처음이거 할 때는 블로그에 분명히 나와있는데 

진짜..아니 분명히 하는 법이 나와있는데 못따라하겠는...?

몇시간 그러다가 따라하는데 또 하나가 안되고..

이게 진짜 무한반복되다가..어느순간 성공했씁니다...ㅋ키키

아마 제거를 따라하셔도 안되는 분들도 계실거고...

나름 차근차근 정리해봤는데, 이해가 안되는 부분은 댓글로 남겨주세요.

 

⚠️저는 지금 이해가 안가는 점이 있는데, 블로그에 맨~~아래 전체 코드 보면, 아카이브 하는 부분에

뒤에 OTHER_CODE_SIGN_FLAGS를 지정해주는데, 저는 이걸 하면 에러가 나더라구요;;;;;;;; ㅠㅠㅠㅠㅠㅠ

제가 지금 커스텀(?) 키체인을 만든거니까 이걸 쓰겠다라고 지정해주는게 맞는 것 같은데,

이걸 빼니까 잘 되더라구요......

진짜 이거때매.....**

혹시 이유를 아시는 분들은..댓글 달아주시면 감사하겠습니다.

 

그리고 혹시

1. 아니 이 코드 필요없는데 왜 넣음?

2. 이거 왜 이렇게함???

같은것도 말씀해주시면 감사하겠습니다.

저도 하면서 뭔가 가슴으로는 이해했지만, 머리로는 이해못한것들이 있습니다,,,,,

 

그럼 도움이 되었길 바래요!

많은 도움이 되었던 블로그..

medium.com/@karaiskc/archive-and-export-ios-app-with-github-actions-b44f676e4bf9

 

Archive and export iOS app with GitHub Actions

This post describes the process and learnings of creating a workflow to automate archiving and exporting of an iOS app. The complete…

medium.com

감사합니당

반응형