본문 바로가기
Git

Github action CI 도전 (gitignore된 파일을 사용하면서..!)

by 지금갑시다 2022. 11. 30.

 초반에는 프로젝트의 규모가 크지 않고, 서로의 Pull Request를 보며, 빌드가 제대로 되는지 혹은 문제가 있을지 어느정도 감으로 진행하며, merge 역시 한개씩 진행하고 빌드가 되는지 매 merge마다 pull을 받아 로컬에서 확인을 하는 방식으로 진행을 했으나,, 

 

 점점 프로젝트가 커지기 시작하고, merge 이후에 로컬에서 직접 pull 받아 확인하는 과정에 크고 작은 문제들(ex. 중괄호 하나 빠짐...)로 Build가 제대로 되지 않는 상황이 생기면서, 이대로 가다가는 한번 프로젝트 파일이 큰일나는 경우가 생기겠구나.. 라는 생각에 Github에서 관리되고 있는 프로젝트에 Github Action을 도입해서, 'CI(Continous Integration)을 시도해보자' 라는 이야기가 나오게 되었다!

 

 CI란, Continous Integration으로 소스코드의 빌드, 배포 외에도 소스코드의 검증을 할 수 있는 방법이라고 말한다.

 

 위에서 간추려 설명한 진행하고 있는 프로젝트의 경우에, 위의 방법을 사용하여, merge가 되기 전 Github Action을 활용해 소스코드의 빌드가 정상적으로 돌아감을 확인할 수 있다면! 상단의 문제들을 해결할 수 있기 때문에 시도해보게 되었다!

+ 추가로! 빌드가 정상적으로 돌아간다면, 빌드가 성공되었다고 초록색의 체크표시가 뜨게 되고, 실패라면 빨간색의 X표시가 떠서 간편하게 확인할 수도 있기 때문에 너무 좋은 기능이라 생각했다!

빌드 성공
빌드 실패

 

 

+ 해당 글은 해결한 방법만을 가지고 있지 않고, 위의 'CI도입을 하며 어떤 문제가 있었고 어떻게 해결했는지'도 함께 포함하고 있습니다

 

먼저 누가봐도 Repository 탭에 있는 Action탭으로 들어가서 순서대로 Action 설정을 해보자..

 

1. 이제 Github Action을 사용하기 위해 Github의 프로젝트로 들어가 Actions탭으로 들어간다.

2. 각자 개발하고 있는 언어에 맞는 키워드에 맞는 Action의 configure를 선택하면..!

 

 정말로, 당황을 안할래야 하지 않을 수 없는 확장자명이 yml인 그런 파일이 눈앞에 나오게 되고, 나 역시 무수한 당황을 했다.

 

근데 사실 뭔지 한번만 알고 나면, 두번째는 할만 한 것 같다.

 

# workflow 의 이름
name: test

on:
    # main 브랜치에 push 나 pull request 이벤트가 일어났을때 해당 workflow 를 trigger
    push:
      branches: [ main ]
    pull_request:
      branches: [ main ]

# workflow의 실행은 하나 이상의 job으로 구성 됨
jobs:
    # 이 workflow 는 "build" 라는 single job 으로 구성
    build:
    # job이 실행될 환경 - 최신 mac os
      runs-on: macos-latest
    
    # Step은 job의 일부로 실행될 일련의 task들을 나타냄
      steps:
    # uses 키워드를 통해 Github Actions에서 기본으로 제공하는 액션을 사용 가능.
    # 아래의 checkout@v3의 경우, 코드저장소로부터 CI서버로의 코드 내려받기를 간편하게 도와준다.
      - uses: actions/checkout@v3
    
    # shell 이용해서 하나의 command 수행
      - name: Start xcode build 🛠
        run: |
        # 아래의 명령어로 clean 빌드를 실행하고, iPhone 14에서 빌드를 실행해보게 된다.
          xcodebuild clean build -project 프로젝트이름.xcodeproj -scheme 프로젝트scheme -destination 'platform=iOS Simulator,name=iPhone 14'

 

 크게 이해하고 있어야 하는 줄을 추려보면 위와 같고, 기본적인 위의 틀에서 조금씩, 추가되는 로직들이 들어가는 것이다.

 

사실 위의 .yml파일을 복사 붙여넣기 하게 되면, 기본적으로 push와 pull request가 일어날때 일반 프로젝트에서는 제대로 동작을 하겠지만, 지금의 프로젝트에서는 문제가 하나 있었다.

 

 우리의 프로젝트는 프레임워크로 Firebase를 사용하고 있었고, KEY값이 외부에 노출되면 안되는 보안상의 이유로 GoogleService-Info.plist파일을 .gitignore에 추가해 사용하고 있었던 문제였다.

 

 위의 경우에는, yml 파일을 위와 같이 작성해 올려놓아도, GoogleService-Info.plist파일을 찾지 못해, CI 자체가 빌드 진행을 하며 아래와 같은 오류가 나게 된다.

 

아,, 그럼 어떻게 해야하나,,, 이거 GG~~~

 

라고 할뻔~ 방법은 있습니다..!

 

 

1. 첫번째 시도(실패)

 

 Github의 프로젝트 Setting에 들어가, Secrets -> Actions로 들어가 주고, New repository secret을 클릭해, GoogleService-Info.plist파일을 KeyValue값으로 나누어 생성해주고, 위의 yml 파일에서 secret을 활용해 GoogleService-Info.plist 파일 역할을 하게 해주면 되기 때문입니다. (이거 틀린거임 따라하지 마셈요)

 실제로 GoogleService-Info.plist 파일은 KeyValue값으로 이루어져있고(왼쪽 이미지), 문자열 형태니까 그냥 넣으면 되지 않을까? 하고 무식하게 Key Value를 다 넣어봤습니다...(오른쪽 이미지)

위에 secret에 추가한 환경 변수들을 이제 활용해 주어야 하는데요, 위에서의 yml 파일을 조금 변경해보도록 하겠습니다.

 

name: test

on:
    push:
      branches: [ main ]
    pull_request:
      branches: [ main ]

jobs:
    build:
      runs-on: macos-latest
    
      steps:
      - uses: actions/checkout@v3
    
      # Github Repository Secrets를 통해 환경 변수 파일을 생성합니다.
      - name: GoogleService file make
        run: |
        # 아래의 echo가 Secrets에 저장한 환경 변수 갯수 만큼 써 있어야 함(아래에선 2개로 축약한거임)
        # '>> GoogleService-Info.plist'를 통해 파일에 echo된 String을 write해서 append함 >>는 append >는 덮어쓰기
          echo "API_KEY=$API_KEY" >> GoogleService-Info.plist
          echo "BUNDLE_ID=$BUNDLE_ID" >> GoogleService-Info.plist
        env:
        # secrets.을 활용해 Secrets에 저장된 환경변수들을 불러와 run에서 만든 GoogleService-Info.plist파일에 값을 넣어줌
          API_KEY: ${{ secrets.API_KEY }}
          BUNDLE_ID: ${{ secrets.BUNDLE_ID }}
    
      - name: Start xcode build 🛠
        run: |
          xcodebuild clean build -project 프로젝트이름.xcodeproj -scheme 프로젝트scheme -destination 'platform=iOS Simulator,name=iPhone 14'

 

위와 같이 yml 파일도 변경이 된 상태고, 환경변수도 모두 설정이 되었습니다! 그럼 이제 CI가 제대로 진행되고 있는지 확인을 해봐야 겠죠?

main에 한번 push를 해봅시다!

띄용...???!!

 gitignore된 GoogleService파일도 yml파일에 제대로 만들어서 Github Repository Secrets의 환경변수를 활용하여 넣어주고, 제대로 동작할 것 같은데.. 빌드 오류가 뜨네요?

 오류 메시지를 한번 action에 들어가 보면, 계~~~속 GoogleService-Info.plist의 문제라고 합니다.. 저는 제대로 했는데 말이죠..

 

근데 사실은 제대로 안한 것이었습니다..

제 두번째 시도를 같이 보실래요..?ㅎ

 

2. 두번째 시도(성공)

사실 위의 방식이 제대로 동작하는 경우는 GoogleService-Info.plist파일이 정확히 KeyValue값으로만 이루어져 있을 때입니다. 

그러나, 이 파일을 텍스트 편집기로 열어보면,

위와 같이 Key Value 값으로만 이루어진 파일이 아니구나.. 라는 것을 알게 되죠..!

 

그럼 위의 파일형식을 그대로 Github repository Secrets에 넣어야 할텐데,, 어떻게 해야 할까요?

바로 base64 Encoding 형식으로 텍스트를 변환시켜 사용해 주어야 합니다!

 

GoogleService-Info.plist파일의 String값 전체를 base64로 encoding시켜 변환 값을 임의의 Key값의 Value로 환경변수를 만들어주고, Github action에서는 위의 encoding된 Value값을 다시 base64 Decoding해주어 GoogleService-Info.plist 파일로 만들어주면 되는 것입니다.

 

 제가 썼는데 정말 무슨말인지 모르겠네요..

 

 실제 실행하는 순서를 한번 볼까요?

 위에서 텍스트 편집기로 연 google.plist 파일의 내부 텍스트를 모두 복사해서, 아래의 페이지에서 encoding을 해주게 되면 괴랄한 String 값으로 변환이 됩니다. 이게 바로 저희가 Secrets에 올려놓아야 할 Value값입니다.

 

https://www.base64encode.net

 

Base64 Encode - Online Tool

Base64 encode Encode base64 string from 'base64 encoder' to 'YmFzZTY0IGRlY29kZXI='

www.base64encode.net

위의 Value값을 복사해, 다시 Github Repository Secrets에 추가해주러 갈까요?

이제 Key값은 우리가 확인할 수 있게 만들어주면 됩니다. 저는 TEST라고 하겠습니다. 

그럼 Test Key값의 Value 값은 위에서 인코딩 되어 복사한 알 수 없는 문자열이겠죠??

이게 맞나..? 싶어도 과감한 저장을 해주시고,,

다시 위에서 수정을 반복했던 yml 파일을 열어줍니다!

 

name: test

on:
    push:
      branches: [ main ]
    pull_request:
      branches: [ main ]

jobs:
    build:
      runs-on: macos-latest
    
      env:
        TEST: ${{ secrets.TEST }}
    
      steps:
      - uses: actions/checkout@v3
      - name: GoogleServieInfo make
        run: |
        # 아래의 GoogleService-Info.plist의 경로는 pbx파일에서의 plist파일의 경로와 동일해야 한다.
        # TEST를 base64로 decode 해서 '프로젝트이름과GoogleService의 경로/GoogleService-Info.plist'에 덮어씌워라!!!
          echo -n $TEST | base64 --decode > 프로젝트이름과GoogleService의 경로/GoogleService-Info.plist
    
      - name: Start xcode build 🛠
        run: |
          xcodebuild clean build -project 프로젝트이름.xcodeproj -scheme 프로젝트Scheme -destination 'platform=iOS Simulator,name=iPhone 14'

 

 추가된 사항으로는 env가 생겨 TEST의 Value값을 가져오고, 이 값을 stepsrun에서 직접 base64 decode를 진행해 다시 encoding하기 전의 알아볼 수 있는 문자열로 바뀐 파일로 만들어 GoogleService-Info.plist에 적어주는 방식이다!!

 

 

그럼 이제 CI의 가상화된 환경에서도 완벽히 gitignore되어서 Github에 올라와 있지 않은 파일인 GoogleService-Info.plist파일을 사용할 수 있는 것이죠!!!

 

main으로 가서 빌드가 되도록 변경사항을 만들어 push하고 빌드체크가 되나 확인해보자!!

 

 

와우..!!!! 기분 좋은 체크다!

 

 

끘!!!!!

 

REF: https://www.daleseo.com/github-actions-checkout/

REF: https://velog.io/@greeneryyyyy/TIL-D86

REF: https://ji5485.github.io/post/2021-06-26/create-env-with-github-actions-secrets/

 

'Git' 카테고리의 다른 글

.gitignore에 원하는 파일 추가하기!  (0) 2022.06.24