Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CI/CD 및 코드 사이닝 개선 #136

Merged
merged 22 commits into from
Oct 6, 2024
Merged

Conversation

ShapeKim98
Copy link
Contributor

@ShapeKim98 ShapeKim98 commented Oct 5, 2024

#️⃣연관된 이슈

#135

📝작업 내용

  • development 프로파일 생성
  • hotfix 워크플로우 제거
  • 앱스토어, 외부베타용 워크플로우 생성
  • 워크플로우 트리거 수정
  • 릴리즈 노트 업데이트 워크플로우 생성

스크린샷 (선택)

💬리뷰 요구사항(선택)

리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요

development 프로파일을 새로 생성하였습니다.

  • 일단, 프로비저닝 프로파일은 인증서라기 보단 앱이 어떤기기에 실행될 수 있고, 어떻게 배포될지를 정의하는 파일이라고 합니다.(이번에 공부하면서 알게 되었습니다..)
    그렇기 때문에, 별개로 프로비저닝 프로파일에 대한 코드 서명 인증서가 필요했고, xcode에 해당 인증서가 설정이 안되어 있었습니다. (개발자 계정 사이트에 있는 Certificates 인증서)
  • 또한, 프로비저닝 프로파일은 개발용과 배포용으로 나뉩니다. Debug 빌드 시에는 말 그대로 디버깅이기 때문에, 개발용으로만 사용할 수 있고, 등록한 기기만 실행 될 수 있는데, 이러한 개발용 프로비저닝 프로파일을 새로 만들 필요가 있었습니다. (기기등록은 이전에 등록을 해놓은적이 있어서, 문제는 없을 듯 합니다.)
스크린샷 2024-10-05 23 25 52
  • xcconfig에 팀 아이디와, 프로비저닝 파일 이름, 인증서 이름들을 알맞게 등록해놓고, 프로젝트 settingsDebugRelease를 구분해서 연결하면 자동으로 프로젝트 사이닝에 등록이 됩니다.
    다만, Debug Release 둘다 적용시, 배포용 프로비저닝 파일에 개발용 인증서가 연결되는 현상이 있어 두개를 구분지어 지정해주었습니다.
// Settings+Extension.swift

import ProjectDescription

public extension Settings {
    static func settings(_ release: Configuration? = nil) -> Settings {
        var settings: Settings = .settings(
            base: [
                "OTHER_LDFLAGS": "$(inherited) -ObjC",
                "CODE_SIGN_STYLE": "Manual"
            ],
            configurations: [
                .debug(name: "Debug", xcconfig: .relativeToRoot("xcconfig/Debug.xcconfig"))
            ]
        )
        
        if let release {
            settings.configurations.append(release)
        }
        
        return settings
    }
}
// Project.swift
...
settings: .settings(
  .release(
      name: "Release",
      settings: [
          "CODE_SIGN_IDENTITY": "Apple Distribution"
      ],
      xcconfig: .relativeToRoot("xcconfig/Release.xcconfig")
  )
...
  • fastlane에 인증서와 프로비저닝 파일 받는 코드를 작성해놓았는데, 이걸 쓰면 개발자 계정 로그인 과정이 필요없을듯 합니다.. 워크플로우에선 이 명령어를 쓰는데 로그인 과정이 없었기 때문에..(테스트는 못해봄)
fastlane development_profile
fastlane appstore_profile

기존 내부 베타 배포를 외부 베타로 바꿨습니다.

  • 실제로 테스트 해보면서 외부베타 제출을 한적이 있는데, 별다른 문제 없이 잘 통과 되서, 접근성이 좋은 외부 베타를 활용하고자 합니다.
  • 워크플로우를 실행시키기 위한 트리거를 develop 브랜치 push에서 develop 브랜치에 pull request가 닫히고, 병합 되었을 때로 변경하였습니다.
  • workflow_dispatch로 깃헙 상에서 수동으로 워크플로우를 돌려볼 수 있도록 하였습니다.
on:
  pull_request:
    branches:
      - develop
    types:
      - closed

  workflow_dispatch:

jobs:
  build:
    if: ${{ github.event_name == 'workflow_dispatch' || github.event.pull_request.merged == true }}
...

앱스토어 배포 워크플로우를 새로 추가하였습니다. (테스트 필요)

  • 주의해야할 점으로, main으로 가는 pull request 발생 시 해당 워크플로우가 실행되며, 바로 앱스토어에 심사 제출이 진행됩니다.
    이렇게 한 이유로는, 심사거부 시 코드 수정이 필요한 경우 pull request내부에서 바로바로 커밋해서 새로 제출하기 위함입니다. 의견 있으시면 말씀해주세여~ (혹시나 hotfix가 필요한 경우 hotfix 브랜치에서 바로 날려주시면 됩니다)
on:
  pull_request:
    branches:
      - main
...
  • 심사 통과 확인 후 pull reqeust를 병합해주시면 됩니다.
  • fastlane/release_notes.txt파일에 앱스토어 상에 보일 릴리즈 노트를 작성해야 제출 시 함께 업로드 됩니다.
  • pull request 본문에 깃헙 릴리즈 노트 내용을 입력해주시면, 병합 시 자동으로 깃헙 릴리즈 노트로 복사가 됩니다.
  • 해당 워크플로우를 실행하면 바로 앱스토어 제출이 진행되기에.. 아직 테스트는 안해봤습니다..

릴리즈 업데이트 워크플로우를 새로 추가하였습니다. (테스트 필요)

  • main으로 가는 pull request가 닫히고 성공적으로 병합 되었을 시 실행됩니다.
  • fastlanespaceship이라는 라이브러리를 통해, Appstore Connect API를 사용할 수 있는데, 이 라이브러리를 통해 현재 앱스토어에 출시 되어 있는 버전을 파싱합니다.
...
require 'spaceship'

  api_key = app_store_connect_api_key(
  key_id: ENV['APP_STORE_CONNECT_KEY_ID'],
  issuer_id: ENV['APP_STORE_CONNECT_ISSUER_ID'],
  key_content: ENV['APP_STORE_CONNECT_API']
  )
  
  Spaceship::ConnectAPI.login(api_key: api_key)
  
  app = Spaceship::ConnectAPI::App.find("com.pokitmons.pokit")
  
  live_version = app.get_live_version
  app_state = live_version.app_store_state
  app_version = live_version.version_string
...
  • pull request를 파싱하기 위해 Github CLI를 사용하였습니다.
...
- name: Install GitHub CLI
    run: sudo apt-get install gh
...
  • 병합된 pull request의 본문을 파싱하여, 앱 버전과 함께 깃헙 릴리즈 노트를 업데이트 합니다.
...
if app_state == 'READY_FOR_SALE'
  pr_number = ENV['PR_NUMBER']
  pr_body = sh("gh pr view #{pr_number} --json body --jq '.body'")
  release_notes = pr_body.strip
  
  # GitHub 릴리즈 버전 및 릴리즈 노트 업데이트
  sh("gh release create v#{app_version} --notes '#{release_notes}'")
  end
...
  • pull request를 파싱하는 작업이 있어서, 실제로 앱스토어 제출 워크플로우를 돌려 본 후 테스트를 진행해야할 것 같습니다. (GPT가 알려준 방법이라 잘 될지 의문...)

close #135

@ShapeKim98 ShapeKim98 added Feat 기능구현 Fix 기능 수정 Setting 🛠️ Tuist, Xode, CI/CD 설정을 위한 태그 labels Oct 5, 2024
@ShapeKim98 ShapeKim98 requested a review from stealmh October 5, 2024 15:29
@ShapeKim98 ShapeKim98 self-assigned this Oct 5, 2024
Copy link
Contributor

@stealmh stealmh left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생많으셨습니다!
앱스토어 출시 시나리오는 아직 체크를 확인하지 못하는 부분이 있는 것으로 보이는데 이번 1.0.4 버전업데이트 하며 다시한번 확인해보면서 수정 거치면 될 것 같습니다.
PR너무 자세히 적어주셔서 큰 어려움없이 확인할 수 있었습니다 채고.

@ShapeKim98
Copy link
Contributor Author

고생많으셨습니다! 앱스토어 출시 시나리오는 아직 체크를 확인하지 못하는 부분이 있는 것으로 보이는데 이번 1.0.4 버전업데이트 하며 다시한번 확인해보면서 수정 거치면 될 것 같습니다. PR너무 자세히 적어주셔서 큰 어려움없이 확인할 수 있었습니다 채고.

감사합니다 ㅎㅎ 리베이스 후 xcode 버전만 다시 16으로 바꿔보고 머지 하겠습니당

@ShapeKim98 ShapeKim98 merged commit c0ab92f into develop Oct 6, 2024
1 check passed
@stealmh stealmh linked an issue Oct 29, 2024 that may be closed by this pull request
3 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Feat 기능구현 Fix 기능 수정 Setting 🛠️ Tuist, Xode, CI/CD 설정을 위한 태그
Projects
None yet
Development

Successfully merging this pull request may close these issues.

CI/CD 및 코드 사이닝 개선
2 participants