preview
현재 어플 출시를 위한 비공개 테스트인데 어플이 업데이트될 때마다 매번 aab 파일을 올리기 번거로워 자동 배포가 필요했다. 젠킨슨 같은 CICD 툴은 출시 예정인 어플에 비해 너무 무겁고 러닝커브가 높을 것 같아 일단 깃헙 액션으로 진행해 보려고 한다.
일단 현재 내 상황은
- 이미 내부 테스트 및 비공개 테스트 진행 중
- 파이어 베이스와 연결된 데이터베이스를 사용 중(사실 이건 중요하지 않음)
- 가벼운 어플, 소규모 제작
yaml파일은 다른 분들의 코드를 많이 참고 했다.
action secrets에 서명키 등록하기
우선 빌드를 위해 로컬에서 빌드할 때 사용했던 서명 키가 필요하다(참고로 나는 디버그 키와 릴리즈 키가 동일하다..). 이때 keystore가 사용되며 이 키는 내 레포지토리의 secrets에 등록해서 사용해야 한다. 특히 서명키는 보안상 유출이 되면 안 되기 때문에 secrets에 등록하기 전 base64로 인코딩하는 과정이 필요하다.
우선 secrets은 해당 페이지에서 확인할 수 있다.


해당 페이지에 들어가면 다음처럼 새로운 secret을 만들 수 있는 버튼과 페이지가 뜬다

여기에 우리는 base64로 인코딩된 keystore와 key의 alias, password, keystore의 alias를 모조리 등록해야 한다.

keystore을 base64로 인코딩하려면 openssl을 설치해야 하는데(window 기준) git bash로도 설치 없이 가능하다. 나는 git bash 터미널을 통해 설치 없이 바로 변경했다.
openssl base64 -in [keystore file path] -out [base64 file path]
play store 서비스 계정 key 등록
앱 빌드를 위한 키를 등록 했으면 이제 playstore에 연결할 서비스 계정의 api 키를 가져와야 한다. 이 키가 있어야 플레이 스토어에 배포를 할 수 있다. 나는 처음에 이게 파이어베이스 연동 키 google-service.json인줄 알고 냅다 집어넣었는데(당연히 될 리가 없다) 관리자 권한이 필요한 서비스 계정의 api키가 필요하다.

Google 클라우드 플랫폼
로그인 Google 클라우드 플랫폼으로 이동
accounts.google.com
클라우드 플랫폼 콘솔에 들어가면 API 및 서비스가 있다 들어가보자
사용자 인증 정보 > 서비스 계정 > 서비스 계정 관리

들어가면 서비스 계정 목록이 뜬다


이미 내부 테스트 후 비공개 테스트를 진행 중인 상태이며 이미 계정이 존재한다.(난 이미 존재하는 계정의 키를 가져와야 하는 줄 알고 여기서 좀 해맸다) 여기서 key의 json파일을 가져와야 하는데 json 파일은 한 번 다운 받으면 나중에 다운받을 수 없으므로 서비스 계정을 새로 만들어야 한다. 그리고 그 새로운 서비스 계정의 키의 json파일을 가져와야 함
이때 등록한 이메일을 잘 기억하자 플레이 스토어 콘솔에서 권한 등록을 따로 해줘야함

우선 서비스 계정의 키를 발급해주자.

키 관리 > 키 추가에 들어가면 json으로 만들 수 있다 다운로드해주자
이제 내가 출시한 어플의 플레이스토어 콘솔창에 들어가주자 뭐가 되게 많은데 그냥 검색하면 된다 들어가서 검색창에 users and permissions을 검색해줌. (콘솔창부터는 내 실제 어플이라 영문으로 되어 있다. 출시할 때 은근 한국어 자료가 없기 때문에 영문으로 바꿔놓는 것도 꿀팁.. 검색하기 쉬움.)

저기 들어가서 invite user 버튼이 파란색으로 눈에 띄게 있을 것이다 클릭하면 다음 페이지가 나온다

아까의 서비스 계정 이메일을 저기 등록해주고 권한을 admin으로 바꿔서 확인을 눌러주면 끝!
이제 아까 받은 json을 빌드 시 등록했던 키 정보처럼 secret에 등록해주면 된다!
yaml 파일 작성
이제 기본적인 secret 등록은 끝났다! 이제 workflow에 yaml을 작성해주자 이건 내가 작성한 yaml 파일이다
name: Android CI/CD
on:
push:
branches: [ release ]
pull_request:
branches: [ release ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Decode and save keystore file
run: |
mkdir -p app/keystore
echo "${{ secrets.UPLOAD_KEYSTORE }}" | base64 --decode > app/keystore/내 키.jks
- name: Set up environment variables
run: |
echo "MY_KEYSTORE_FILE=$GITHUB_WORKSPACE/app/keystore/내 키.jks" >> $GITHUB_ENV
- name: Build with Gradle
run: ./gradlew build --stacktrace --info
env:
MY_KEYSTORE_FILE: ${{ env.MY_KEYSTORE_FILE }}
MY_KEYSTORE_PASSWORD: ${{ secrets.UPLOAD_KEYSTORE_PASSWORD }}
MY_KEY_ALIAS: ${{ secrets.UPLOAD_KEY_ALIAS }}
MY_KEY_PASSWORD: ${{ secrets.UPLOAD_KEY_PASSWORD }}
- name: Build Release AAB
run: ./gradlew bundleRelease --stacktrace --info
env:
MY_KEYSTORE_FILE: ${{ env.MY_KEYSTORE_FILE }}
MY_KEYSTORE_PASSWORD: ${{ secrets.UPLOAD_KEYSTORE_PASSWORD }}
MY_KEY_ALIAS: ${{ secrets.UPLOAD_KEY_ALIAS }}
MY_KEY_PASSWORD: ${{ secrets.UPLOAD_KEY_PASSWORD }}
- name: Sign AAB
uses: r0adkll/sign-android-release@v1
with:
releaseDirectory: app/build/outputs/bundle/release
signingKeyBase64: ${{ secrets.UPLOAD_KEYSTORE }}
alias: ${{ secrets.UPLOAD_KEY_ALIAS }}
keyStorePassword: ${{ secrets.UPLOAD_KEYSTORE_PASSWORD }}
keyPassword: ${{ secrets.UPLOAD_KEY_PASSWORD }}
- name: Deploy to Play Store
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
packageName: 본인 프로젝트의 패키지 명
releaseFiles: app/build/outputs/bundle/release/app-release.aab
track: internal
status: completed
이 코드에서 좀 조심해야 할 건 다음이다
- 내 프로젝트의 요구 jdk 확인하기
- 내 프로젝트의 빌드 시 키 경로 변수로 따로 등록하기
- play store에 배포할 때 패키지 이름 본인 프로젝트로 설정하기
특히 빌드 버전업시켜주고 빌드해주길바란다... 나는 좀 많이 해맸는데 다른 사람들은 이 글 보고 좀 덜 해매길 바라는 마음이다!
댓글