Flutter 앱 Codemagic CI/CD 자동 배포 세팅 완벽 가이드

개발렬·2026년 3월 15일

Flutter

목록 보기
9/10
post-thumbnail

main 브랜치 push → 자동 빌드 → Google Play / App Store 제출까지
직접 삽질하며 정리한 세팅 방법을 공유합니다.


들어가며

매번 수동으로 빌드하고 스토어에 올리는 과정이 번거로워 Codemagic으로 CI/CD 파이프라인을 구축하게 되었습니다.

세팅하면서 꽤 많은 에러를 만났는데, 같은 시행착오를 겪을 분들을 위해 최대한 자세히 정리했습니다.


전체 흐름

main push
  → Codemagic 자동 빌드
  → 스토어 심사 제출
  → 심사 통과 후 배포 당일 수동 태그 push
  → GitHub Release Notes 자동 생성

1. codemagic.yaml 구성

대시보드 방식 대신 codemagic.yaml을 레포에 포함시키면 버전 관리가 가능하고 팀원과 설정을 공유하기 편합니다.

워크플로우 구조

두 워크플로우는 트리거 조건이 달라 동시에 실행되지 않습니다.

workflows:
  submit-to-stores:      # main 브랜치 push 시에만 실행
  create-release-notes:  # release/* 태그 push 시에만 실행

Android Signing

Distribution 탭에 keystore를 등록한 뒤 yaml에서 참조합니다.

android_signing:
  - upload-keystore.jks

iOS Signing

Distribution 탭 설정과 자동 연동됩니다.

ios_signing:
  distribution_type: app_store
  bundle_identifier: com.example.yourapp

App Store 제출 필수 항목

app_store_connect:
  submit_to_app_store: true
  whats_new:
    ko: "일부 버그를 수정하고 전반적인 사용 편의성을 개선했습니다."
    en-US: "Bug fixes and general improvements."
  uses_non_exempt_encryption: false

2. Distribution 탭 세팅

환경변수 그룹 없이 Distribution 탭에서 대부분을 처리할 수 있습니다.

항목설정 위치
Android keystoreDistribution > Android code signing
iOS certificate / provisioningDistribution > iOS code signing
App Store Connect API keyDistribution > App Store Connect
Google Play service accountDistribution > Google Play

Distribution에 등록하면 $GCLOUD_SERVICE_ACCOUNT_CREDENTIALS 등 환경변수가 자동으로 주입됩니다.


3. 환경변수 그룹

별도로 필요한 환경변수는 github_credentials 그룹 하나뿐입니다.

변수명
GITHUB_TOKENGitHub PAT (repo 권한)
GITHUB_OWNER조직 또는 유저명
GITHUB_REPO레포명

GitHub PAT 발급 경로
GitHub > Settings > Developer settings > Personal access tokens > Tokens (classic) > repo 체크


4. Google Play 크리덴셜 세팅

처음 세팅할 때 가장 많이 헤맸던 부분입니다.

⚠️ 구 Play Console API 메뉴 사라짐

예전에는 Google Play Console 내에서 직접 API 키를 발급할 수 있었지만, 현재는 해당 메뉴가 제거되었습니다. 검색하면 여전히 옛날 방식으로 설명한 블로그가 많아 헤매기 쉽습니다.

현재는 반드시 아래 순서로만 진행해야 합니다.

1. Google Cloud Console에서 서비스 계정 생성 + JSON 키 발급
2. Google Play Console에서 해당 서비스 계정에 권한 연결

Step 1. Google Cloud Console — 서비스 계정 생성

  1. Google Cloud Console 접속
  2. IAM 및 관리자 > 서비스 계정 이동
  3. 서비스 계정 만들기 클릭 후 이름 입력
  4. 생성된 계정 클릭 → 키 탭 > 키 추가 > JSON 선택
  5. .json 파일 다운로드 → 이 파일이 Codemagic에 등록할 크리덴셜 키입니다.

Step 2. Google Play Console — 권한 연결

  1. Google Play Console 접속
  2. 설정 > API 액세스 이동
  3. Google Cloud 프로젝트와 연결 (최초 1회)
  4. 서비스 계정 목록에서 생성한 계정 확인 → 액세스 권한 부여
  5. 권한은 릴리즈 관리자 이상으로 설정

Cloud 프로젝트와 Play Console이 연결되어 있지 않으면 서비스 계정 목록 자체가 표시되지 않습니다.

Step 3. Codemagic — JSON 키 등록

  1. Codemagic 대시보드 → Distribution > Google Play
  2. 다운로드한 .json 파일 업로드

등록 후 yaml에서 별도 환경변수 없이 자동으로 연동됩니다.

헤매기 쉬운 포인트

실수결과
Play Console 권한 부여를 빠뜨림권한 에러 발생
Cloud-Play Console 연결 전 서비스 계정 연결 시도서비스 계정 목록이 안 보임
옛날 블로그 따라 Play Console에서 직접 API 키 발급 시도메뉴 자체가 없음

5. 버저닝 전략

날짜 기반 태그를 사용합니다: release/yymmdd

빌드 날짜 ≠ 배포 날짜 문제

앱 심사에 보통 1~3일이 소요되기 때문에 빌드 시점과 실제 배포일이 달라집니다. 아래 방식으로 해결했습니다.

  1. main push 시 빌드 자동 실행 (심사 제출)
  2. 심사 통과 후 배포 당일에 수동으로 태그 생성
git tag release/260314
git push origin release/260314

태그를 push하면 이전 태그 이후의 커밋 메시지를 기반으로 GitHub Release Notes가 자동 생성됩니다.


6. 겪었던 에러들

공식 문서만으로는 원인을 파악하기 어려웠던 에러들을 정리했습니다.

Given final block not properly padded

  • 원인: keystore 비밀번호에 특수문자가 포함된 경우 오입력 발생
  • 해결: Codemagic 대시보드에서 비밀번호 재입력

Feedback Email required

  • 원인: App Store Connect의 TestFlight Test Information 미입력
  • 해결: App Store Connect > TestFlight > Test Information에서 피드백 이메일 등록

whatsNew attribute required

  • 원인: yaml에 whats_new 항목 누락
  • 해결: 아래 항목 추가
whats_new:
  ko: "일부 버그를 수정하고 전반적인 사용 편의성을 개선했습니다."
  en-US: "Bug fixes and general improvements."

uses non exempt encryption

  • 원인: 암호화 규정 관련 설정 누락
  • 해결: 아래 항목 추가
uses_non_exempt_encryption: false

마치며

처음 세팅할 때는 에러 메시지 하나하나가 낯설어서 시간이 꽤 걸렸지만, 한 번 구축해두니 배포 부담이 크게 줄었습니다.

특히 codemagic.yaml을 레포에서 관리하는 방식은 팀 프로젝트에서 설정을 공유하고 히스토리를 추적하는 데 매우 유용했습니다.

비슷한 세팅을 준비 중이시라면 도움이 되길 바랍니다. 🚀

profile
Flutter

0개의 댓글