Skip to content

Google Play 내부 테스트 트랙 배포 자동화 #852

Closed as not planned

Description

@OnlyReadOneBook

배경

#735와 Draft PR #741은 Play App Signing, 출시 런북, AAB 검증을 준비하지만 Google Play에 실제로 올리는 CD는 포함하지 않는다. Console·계정·서명 준비가 끝난 뒤 production 자동 승격 없이 내부 테스트 트랙만 자동화한다.

선행·관련

범위

  • play-internal 전용 GitHub Environment와 required reviewer를 구성한다.
  • Play App Signing을 활성화하고 upload key와 app signing key의 보관·회전 책임을 분리한다.
  • Android Publisher API용 최소 권한 service account를 앱 단위로 연결한다.
  • 가능하면 GitHub OIDC/WIF로 단기 credential을 발급하고 Play 권한은 Firebase service account와 분리한다.
  • 처음에는 workflow_dispatch + 승인 방식으로 signed AAB를 내부 테스트 트랙에만 업로드한다.
  • versionCode가 모든 배포에서 단조 증가하도록 repository 정책을 정하고 중복 code를 build 전에 차단한다.
  • commit/issue 기반 release note와 source SHA·AAB digest를 남긴다.
  • API edit 생성 → bundle upload → track update → commit 결과를 확인하고 실패 시 미완료 edit를 정리한다.
  • 실제 내부 tester 설치·업데이트 1회를 검증한다.

완료 조건

  • 승인된 run 한 건이 검증된 AAB를 internal track에 게시하고 Console에서 동일 versionCode·digest를 확인한다.
  • 같은 versionCode 재업로드, 잘못된 서명, 권한 부족, API commit 실패가 명확히 실패한다.
  • Firebase App Distribution은 기존 QA 채널로 유지되고 Play internal과 목적·rollback 절차가 문서화된다.
  • production/open/closed track으로의 자동 promote 권한과 step이 없다.
  • Play Console 또는 계정 준비가 안 된 동안에는 이슈를 blocked 상태로 두되 credential을 임시로 우회하지 않는다.

비범위

  • production 자동 출시
  • 자동 단계 승격
  • Play Integrity 서버 판정 구현

근거

Activity

  1. changed the title [-]release(cd): Google Play 내부 테스트 트랙 배포 자동화[/-] [+]Google Play 내부 테스트 트랙 배포 자동화[/+] on Aug 28, 2026
  2. added
    release배포·릴리스 파이프라인 및 산출물 작업
    area:platformCI·빌드·릴리스·저장소 운영 영역
    and removed
    enhancementNew feature or request
    on Aug 28, 2026
  3. added
    pr-open이 이슈를 구현하는 PR 이 열려 있다 — base 가 기본 브랜치가 아니어도 드러낸다
    on Aug 30, 2026
  4. OnlyReadOneBook commented on Aug 30, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    자동화 쪽은 세웠고, 남은 건 웹 UI 작업이다 — PR #1593

    이 이슈에서 Play Console 없이 만들 수 있는 부분을 먼저 세웠다. 되돌리기 어려운 외부 작업(실제 Play 업로드, 서비스 계정 생성, 시크릿 등록)은 하지 않았다.

    실측한 현재 상태

    축 실측
    versionCode 모든 빌드에서 1 고정 (build-logic/src/main/kotlin/VersionCode.kt의 DEFAULT_AFTERNOTE_VERSION_CODE)
    AFTERNOTE_VERSION_CODE 주입 워크플로 0건 — resolve-play-version-code.mjs는 dd09f66에 들어왔지만 부르는 곳이 없었다
    Play로 나가는 워크플로 0건 (release-distribution.yml은 Firebase App Distribution APK 경로)
    GitHub environment release-distribution, copilot 둘뿐 — play-internal 없음
    Play 관련 secret 없음

    세운 정책

    • 로컬·CI 검증·Firebase 빌드는 계속 1. 이 채널은 versionCode로 빌드를 구분하지 않아 올릴 이유가 없다.
    • Play로 나가는 값만 움직인다 — run_number * 100 + run_attempt. Play로 가는 경로가 새 워크플로 하나뿐이라 run_number만으로 단조 증가가 성립하고, 재실행은 run_attempt로 갈린다.
    • 판정은 빌드 전에. 업로드된 bundle + 모든 트랙의 release에서 Play가 아는 최대 versionCode를 읽어, 산출값이 그보다 크지 않으면 AAB를 만들기도 전에 멈춘다.
    • 중복은 두 겹으로 막는다 — 업로드 전 bundle 목록 대조, 그리고 Play가 돌려준 versionCode가 빌드한 값과 다르면 트랙을 건드리지 않는다.

    만든 것 (PR #1593)

    • .github/workflows/release-play-internal.yml — main에서 수동 실행 + play-internal environment 승인으로만 도는 경로. production/open/closed 트랙으로 가는 step은 없다.
    • .github/scripts/play-internal-track.mjs — Android Publisher v3 edit 수명주기(생성 → 업로드 → internal 트랙 → commit), 실패 시 미완료 edit 정리.
    • 정책 테스트 + 단위 테스트 — 순서·권한·트랙 제한·자격 분리를 파일로 고정.
    • docs/play-release.md / docs/release/distribution.md — versionCode 정책, 사전 준비, 실행, 실패 모드, 롤백, Firebase 채널과의 경계표.

    사용자가 눌러야 하는 것

    하나라도 비면 워크플로 첫 스텝이 누락된 이름을 출력하고 멈춘다. 빌드를 40분 돌린 뒤 죽지 않는다.

    1. Play Console — 앱 등록 (play.google.com/console)

    1. 개발자 계정 생성(등록비 1회). 조직 계정이면 D-U-N-S 번호 필요.
    2. 모든 앱 → 앱 만들기 — 이름 Afternote, 기본 언어 한국어, 유형 앱, 무료.
    3. 정책 및 프로그램 → 앱 콘텐츠 — 개인정보처리방침 URL, 광고, 콘텐츠 등급, 타겟층, 데이터 보안. 내부 테스트도 이게 비면 릴리스를 만들 수 없다.
    4. 테스트 및 출시 → 테스트 → 내부 테스트 → 테스터 — 테스터 이메일 목록 생성.

    2. Play Console — 첫 AAB 수동 업로드 (API 제약)

    Android Publisher API는 Console에서 최소 한 번 수동 업로드된 앱에만 업로드를 허용한다. 자동화의 선행 조건이다.

    • ./scripts/verify-play-release-bundle.sh로 만든 AAB를 테스트 및 출시 → 내부 테스트 → 새 버전 만들기에서 직접 올린다.
    • AFTERNOTE_VERSION_CODE 없이 빌드해 versionCode 1을 쓴다 → 워크플로의 첫 값 101이 안전하게 크다.
    • 이 업로드에서 Play App Signing 방식이 확정된다. 되돌릴 수 없으니 docs/play-release.md의 「Play App Signing 키 결정」을 먼저 읽는다.

    3. Google Cloud (console.cloud.google.com)

    1. API 및 서비스 → 라이브러리 → Google Play Android Developer API 사용 설정.
    2. IAM 및 관리자 → 서비스 계정 → 서비스 계정 만들기 — 이름 예 play-internal-publisher. 프로젝트 IAM 역할은 주지 않는다.
    3. Firebase 배포용 SA를 재사용하지 않는다(이 이슈의 「Play 권한은 Firebase service account와 분리」 조건).
    4. Workload Identity 제휴 — 기존 provider 재사용, 새 SA에 roles/iam.workloadIdentityUser를 이 저장소로 한정해 부여.

    4. Play Console — service account 최소 권한

    설정 → API 액세스에서 위 GCP 프로젝트 연결 → 사용자 및 권한 → 사용자 초대로 SA 이메일 추가.

    • 앱 범위: Afternote 하나만.
    • 체크: 앱 정보 보기, 테스트 트랙에 출시.
    • 해제: 프로덕션 트랙에 출시, 재무·주문 관리, 사용자 관리.

    5. GitHub — play-internal environment

    Settings → Environments → New environment → play-internal

    항목 위치 값
    Required reviewers Deployment protection rules 배포 담당자(최소 1명)
    Deployment branches Deployment branches and tags Selected branches → main
    GCP_WORKLOAD_IDENTITY_PROVIDER Environment secrets projects/<번호>/locations/global/workloadIdentityPools/<pool>/providers/<provider>
    GCP_PLAY_SERVICE_ACCOUNT Environment secrets play-internal-publisher@<프로젝트>.iam.gserviceaccount.com
    RELEASE_STORE_FILE_B64 Environment secrets upload key keystore base64
    RELEASE_STORE_PASSWORD Environment secrets keystore 비밀번호
    RELEASE_KEY_ALIAS Environment secrets key alias
    RELEASE_KEY_PASSWORD Environment secrets key 비밀번호
    PLAY_PACKAGE_NAME Environment variables com.afternote.afternote_fe

    KAKAO_NATIVE_APP_KEY·GOOGLE_WEB_CLIENT_ID·GOOGLE_SERVICES_JSON_B64는 이미 저장소 secret으로 있어 그대로 쓴다.

    6. 첫 실행

    Actions → Release Play Internal Track → Run workflow → 브랜치 main. 승인 뒤 job이 시작된다.


    Firebase App Distribution과의 경계 (뭉개지 않는다)

    Firebase App Distribution Play 내부 테스트 트랙
    목적 개발·기획·디자인·QA 내부 확인 출시 전 Play 설치 경로 검증
    산출물 release APK release AAB
    트리거 main push 자동 main 수동 실행 + 승인
    versionCode 1 고정 run마다 단조 증가
    롤백 이전 빌드 재배포 릴리스 중단 후 더 큰 versionCode로 재배포

    Play 출시 이후에도 Firebase는 기존 QA 채널로 유지한다. release-distribution.yml은 이 PR에서 한 글자도 바뀌지 않았다.

    #1539 해제 조건

    이 워크플로가 실제로 한 번 성공해 Play에 1보다 큰 versionCode가 올라간 시점부터 강제 업데이트 배선이 기준값을 가질 수 있다. 위 1~6이 그 선행 조건이다.

  5. removed
    pr-open이 이슈를 구현하는 PR 이 열려 있다 — base 가 기본 브랜치가 아니어도 드러낸다
    on Aug 31, 2026
  6. OnlyReadOneBook commented on Sep 6, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    콘솔 쪽 사전 준비 상태 (2026-09-06 실측)

    개발자 계정 초대를 받아 콘솔에 들어가 봤습니다. 워크플로(release-play-internal.yml)는 서 있고, 남은 것은 전부 콘솔과 자격 쪽입니다. 지금은 그중 첫 칸에서 막혀 있습니다.

    확인한 것 상태
    개발자 계정 개인 계정으로 존재
    신원 확인 Google 심사 중. 문서 업로드됨, 며칠 소요 안내
    연락처 전화번호 인증 미완료. 계정 소유자만 가능
    앱 등록 버튼 잠김. "새 앱을 만들려면 계정 확인을 완료하세요"
    패키지 이름 등록 같은 사유로 불가
    초대받은 FE 계정 권한 "사용자 및 권한" 이 "권한이 필요함" 으로 막힘, API 액세스 경로도 안 열림

    이슈 본문의 사전 준비 1번(앱 등록)부터 대기라 2~5번이 전부 그 뒤에 있습니다. 신원 확인은 기다리는 것 말고 할 일이 없고, 전화번호 인증과 서비스 계정 권한 부여는 계정 소유자 몫입니다.

    FE 쪽에서 미리 만들어 둘 수 있는 것도 지금은 없습니다. 첫 AAB 는 release keystore 가 있어야 하는데 그 자격은 배포 담당자만 갖고 있고, 없으면 :app:bundleRelease 가 checkReleaseSigningForRelease 에서 끊깁니다.

    실측 내용은 러너북에 반영했습니다: #1909 (Closes #1908). 확인 경로를 같이 적어 뒀으니 다음에 상태를 볼 때 같은 화면을 다시 찾지 않아도 됩니다.

    계정 확인이 끝나면 앱을 만들고 App integrity 에서 Play App Signing 등록 상태와 Automatic integrity protection 제공 여부를 보는 것이 다음 칸입니다. 첫 AAB 수동 업로드에서 서명 방식이 확정되므로 그 전에 러너북의 "Play App Signing 키 결정" 을 읽고 골라야 합니다.

  7. OnlyReadOneBook commented on Sep 13, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    실측 기록 (2026-09-13, origin/develop 7d87aa3)

    이 이슈에서 지금 코드로 뗄 독립 범위가 없어 기록만 남깁니다. 저장소 몫은 이미 develop 에 서 있고, 남은 항목은 전부 Play Console 과 자격입니다. 그 사이에 versionCode 대역 작업이 이 이슈의 첫 업로드 숫자를 바꿔 놓았습니다. 다음에 잡는 사람이 이미 있는 것을 다시 만들거나 낡은 숫자로 시작하지 않도록 네 가지를 적습니다.

    1. 저장소 몫이 어디까지 닫혔나

    7d87aa3 기준으로 파일과 줄을 짚습니다. 재구현 대상이 아닙니다.

    .github/workflows/release-play-internal.yml (288줄)

    줄 서 있는 것
    L12-13 트리거가 workflow_dispatch 단독
    L33 environment: play-internal
    L47-53 main 이 아닌 ref 에서 실행 거부
    L58-84 연결값 3종 누락 검사, PLAY_PACKAGE_NAME 을 applicationId 와 대조
    L120-145 조회용 토큰 발급, Play 현재 최댓값 조회, 빌드 전 versionCode 확정
    L147-174 main 병합 PR 본문에서 릴리스 노트 생성
    L193-224 서명 검증, attest, digest 재확인
    L228-253 업로드 직전 토큰 재발급 후 게시
    L255-273 track, versionCode, source SHA, digest, attestation, edit id 기록
    L276-288 산출물과 서명 설정 정리

    .github/scripts/play-internal-track.mjs (281줄) 의 publishInternalBundle (L158-214) 이 edit 생성, 최댓값 재조회, 업로드, internal track 갱신, commit 과 실패 시 edit 정리를 담습니다. L10 의 INTERNAL_TRACK = "internal" 말고 production, open, closed 경로는 파일 어디에도 없습니다.

    완료 조건 2 의 네 실패 모드는 이미 테스트로 고정돼 있습니다.

    • 같은 versionCode 재업로드: play-internal-track.test.mjs L157, 그리고 L174-197 의 파라미터 케이스 3종(더 큰 bundle, 같은 track 값, 다른 track 의 더 큰 값)
    • 권한 부족 403: 같은 파일 L199
    • API commit 실패: 같은 파일 L257
    • 잘못된 서명: scripts/verify-play-release-bundle.sh L52-57 의 jarsigner -strict 비트 판정, release-aab-negative-fixtures.test.mjs L106 이 그 판정을 무력화하는 변이를 거부

    잠그는 테스트는 release-play-internal-policy.test.mjs 16건과 play-internal-track.test.mjs 16건입니다(후자 중 하나가 3케이스로 펼쳐집니다). 여기에 play-publish-guards-mutation.test.mjs 가 변이 9종으로 그 테스트들이 실제로 잡는지까지 확인합니다.

    2. GitHub 쪽 실태 (0913 API 실측)

    항목 실측값
    environment play-internal 존재
    protection rules required_reviewers = 1hyok, prevent_self_review = false
    deployment branch policy main 한 개
    variables PLAY_PACKAGE_NAME = com.afternote.afternote_fe, app/build.gradle.kts:39 의 applicationId 와 일치
    environment secrets 0건

    워크플로가 필요로 하는 secret 은 여섯 개(GCP_WORKLOAD_IDENTITY_PROVIDER, GCP_PLAY_SERVICE_ACCOUNT, RELEASE_STORE_FILE_B64, RELEASE_STORE_PASSWORD, RELEASE_KEY_ALIAS, RELEASE_KEY_PASSWORD)이고 그중 하나도 등록돼 있지 않습니다. 저장소 secret 은 KAKAO_NATIVE_APP_KEY, GOOGLE_WEB_CLIENT_ID, GOOGLE_SERVICES_JSON_B64 세 개뿐이라 이 여섯 개를 덮지 못합니다.

    여기서 오해하기 쉬운 자리가 두 군데입니다. 첫째, 같은 이름 다섯 개(RELEASE_* 넷과 GCP_WORKLOAD_IDENTITY_PROVIDER)가 release-distribution environment secret 으로 존재하지만 다른 environment 이므로 play-internal job 에서는 보이지 않고, GitHub API 가 값을 돌려주지 않아 복사도 자동화도 불가능합니다. 값을 쥔 사람이 직접 재입력해야 합니다. 둘째, GCP_PLAY_SERVICE_ACCOUNT 는 저장소 어디에도 없습니다. release-distribution 에 있는 것은 GCP_FIREBASE_SERVICE_ACCOUNT 이고, 이 이슈 범위가 Play 권한을 Firebase service account 와 분리하라고 못박고 있으므로 그 값을 가져다 쓰는 것은 범위 위반입니다. 새 service account 를 만들어야 합니다.

    즉 0906 코멘트의 서술이 일주일 뒤에도 그대로입니다. 항목과 위치, 값 형식은 docs/play-release.md 의 "자동화 사전 준비" 5절 표가 정본입니다.

    3. versionCode 대역이 이 이슈의 첫 업로드 절차를 바꾼다

    열린 PR #2073 (Closes #2062, base 는 #2060 의 docs/1865-version-code-policy) 이 version-code-bands.mjs 를 새로 만들고 PLAY_BAND_FLOOR = 1_000_000_000n 을 Play resolver 에 더합니다. 산출식이 PLAY_BAND_FLOOR + run_number * 100 + run_attempt 가 되므로 워크플로가 만드는 첫 값이 101 에서 1000000101 로 바뀝니다.

    부트스트랩 업로드 자체는 그대로입니다. AFTERNOTE_VERSION_CODE 없이 빌드해 versionCode 1 로 수동 업로드하는 절차는 유효하고, 단조 증가 조건도 자동으로 만족합니다. 다만 이 이슈 0831 코멘트의 "워크플로의 첫 값 101" 은 #2073 이 머지되는 순간 거짓이 됩니다. PR #2073 은 러너북만 고치고 이슈 코멘트는 고칠 수 없으므로, 콘솔이 열려 첫 수동 업로드를 할 사람은 이 이슈가 아니라 갱신된 docs/play-release.md 를 보십시오.

    이슈 범위의 "versionCode가 모든 배포에서 단조 증가" 중 Firebase 채널 몫도 이 이슈가 아닙니다. #1865 로 갈라져 나가 #2062 가 resolve-firebase-version-code.mjs 신설로 닫습니다(#2062 의 blocked_by 는 #1989 와 #1865). #852 에서 다시 손대면 중복 착수입니다. 열린 PR 62건의 본문을 훑었고 #852 를 물고 있는 PR 은 0건입니다.

    4. 완료 조건 5 의 blocked 상태를 표현할 수단이 없다

    0913 기준 이 이슈의 REST dependencies 는 blocked_by, blocking 모두 0건이고, 저장소 라벨에 blocked 계열이 없습니다(awaiting-author 하나뿐). 차단자가 GitHub 이슈가 아니라 외부(Google 신원 심사, 계정 소유자의 전화번호 인증)라 blocked_by 로 걸 대상 자체가 없습니다. 의존성 그래프를 뒤져도 나오지 않으니 이 코멘트를 상태로 보시면 됩니다.

    5. 본문과 기존 코멘트에서 develop 실태와 어긋나는 항목

    본문은 고치지 않았습니다. 아래 항목은 완료 조건을 좁히는 편집이 아니라 현재 상태 서술이고, #2062 계열이 아직 머지되지 않아 범위 이관을 본문에 박기에도 이릅니다. 정정만 적어 둡니다.

  8. OnlyReadOneBook commented on Oct 5, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    콘솔 상태 갱신 (2026-10-05 실측)

    0906·0913 코멘트에서 첫 칸이던 계정 확인이 풀렸습니다. 지금은 앱 등록부터 할 수 있습니다. 초대받은 FE 계정으로 읽기만 했고 아무것도 만들거나 제출하지 않았습니다.

    항목 0913 1005
    연락처 전화번호 인증 미완료 완료(연락처·개발자 이메일도 인증됨)
    Google 신원 확인 심사 중 개발자 계정 화면에 심사 중·확인 요구 배너가 없음. 「확인 완료」 문구를 직접 본 것은 아니고, 앱 생성이 열린 것으로 통과를 판단함
    앱 만들기 잠김 잠금 안내가 사라지고 생성 양식(앱 이름·패키지 이름·기본 언어)이 열림
    등록된 앱 0 0. 그래서 App integrity·Play App Signing 화면은 아직 없음
    FE 계정의 사용자 및 권한 권한이 필요함 그대로 권한이 필요함
    play-internal environment secrets 0/6 0/6

    화면 캡처는 확인한 로컬 세션에만 있어 여기 붙이지 못했습니다.

    남은 순서

    1. 앱 등록은 PM 몫입니다. FE 는 손대지 않습니다. 패키지 이름은 com.afternote.afternote_fe(app/build.gradle.kts 의 applicationId, environment 변수 PLAY_PACKAGE_NAME 과 같은 값)여야 워크플로의 대조 검사를 통과하고, 등록 뒤에는 바꿀 수 없습니다.
    2. 첫 AAB 수동 업로드. 이 업로드에서 Play App Signing 방식이 확정되고 되돌릴 수 없으니 docs/play-release.md 의 「Play App Signing 키 결정」을 먼저 읽습니다. release keystore 가 있어야 빌드가 되므로 배포 담당자가 할 칸입니다.
    3. 서비스 계정 초대. FE 계정은 사용자 및 권한에 들어가지 못하므로, 계정 소유자가 직접 초대하거나 FE 계정에 관리자 권한을 줘야 합니다.
    4. 시크릿 6개 등록(docs/play-release.md 「자동화 사전 준비」 5절 표).

    저장소 코드로 할 일은 여전히 없습니다. 이 이슈는 1번 앱 등록을 기다립니다. 1~4가 끝나면 워크플로 첫 실행으로 완료 조건 1을 확인합니다.

  9. OnlyReadOneBook commented on Oct 5, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    계정 소유자와 연락이 닿지 않아 Play Console 쪽 남은 칸(앱 등록, 서비스 계정 초대)을 진행하지 않기로 했습니다. 서비스 계정이 Play Console 에 초대되지 않으면 시크릿을 채워도 워크플로가 업로드 단계에서 권한 부족으로 멈추므로, FE 쪽에서 더 할 수 있는 일이 없어 보류로 닫습니다.

    저장소 몫(release-play-internal.yml, play-internal-track.mjs, 정책 테스트, docs/play-release.md)은 develop 에 그대로 둡니다. 다시 열 조건은 계정 소유자가 앱을 등록하고 서비스 계정 초대(또는 FE 계정에 관리자 권한 부여)를 할 수 있게 되는 것이고, 그때 순서는 바로 위 1005 코멘트의 1~4 입니다.

    다시 열 때 하나 더 필요합니다(2026-10-05 gcloud 로 읽기만 해서 확인). docs/play-release.md 는 기존 Workload Identity provider 를 재사용하라고 적고 있는데, 그 provider 의 attribute condition 이 workflow_ref 를 firebase-wif-canary.yml·release-distribution.yml 로만 허용합니다. release-play-internal.yml 이 빠져 있어 같은 provider 경로를 play-internal 시크릿에 넣어도 토큰 교환이 거부됩니다. 조건에 이 워크플로를 더하거나 Play 전용 provider 를 따로 만들어야 합니다.

  10. OnlyReadOneBook commented on Oct 5, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    GCP 쪽 준비를 끝냈습니다 (2026-10-05)

    바로 위 코멘트에서 다시 열 때 하겠다고 적은 GCP 설정은 계정 소유자와 무관해서 지금 처리했습니다. 남은 것은 Play Console 칸(앱 등록, 첫 AAB 업로드, 서비스 계정 초대)과 keystore 시크릿 4개입니다.

    항목 결과
    Google Play Android Developer API afternote-android 에서 사용 설정
    Play 전용 서비스 계정 play-internal-publisher@afternote-android.iam.gserviceaccount.com 생성, 프로젝트 IAM 역할 없음
    provider afternote-fe attribute condition workflow_ref 허용 목록에 release-play-internal.yml 추가(다른 설정은 그대로)
    Play 계정의 roles/iam.workloadIdentityUser attribute.workflow_ref/Afternote/Afternote-FE/.github/workflows/release-play-internal.yml@refs/heads/main 하나에만 부여
    Firebase 계정 afternote-ci 의 같은 역할 저장소 전체(attribute.repository)에서 release-distribution.yml@main, firebase-wif-canary.yml@main, firebase-wif-canary.yml@develop 셋으로 좁힘

    마지막 줄은 provider 에 Play 워크플로를 더하면서 생긴 구멍을 막은 것입니다. 저장소 전체로 묶여 있으면 Play 워크플로가 Firebase 계정도 빌릴 수 있어 두 채널의 자격 분리가 깨집니다.

    확인이 남은 점: afternote-ci 를 좁힌 뒤 Firebase 배포가 실제로 도는지는 다음 main push 의 release-distribution.yml 인증 단계에서 드러납니다. 실패하면 principalSet://iam.googleapis.com/projects/918752702102/locations/global/workloadIdentityPools/github-actions/attribute.repository/Afternote/Afternote-FE 를 같은 역할로 다시 더하면 원래대로 돌아갑니다.

    시크릿 값 중 비밀이 아닌 두 개(GCP_WORKLOAD_IDENTITY_PROVIDER, GCP_PLAY_SERVICE_ACCOUNT)는 1Password 항목 Afternote GCP Workload Identity 에 적어 두었습니다. docs/play-release.md 3절 4번(기존 provider 재사용) 문구는 조건 추가와 워크플로 단위 바인딩을 반영해 따로 고칩니다.

  11. added
    pr-open이 이슈를 구현하는 PR 이 열려 있다 — base 가 기본 브랜치가 아니어도 드러낸다
    and removed
    pr-open이 이슈를 구현하는 PR 이 열려 있다 — base 가 기본 브랜치가 아니어도 드러낸다
    on Oct 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

area:platformCI·빌드·릴리스·저장소 운영 영역release배포·릴리스 파이프라인 및 산출물 작업

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions