이전 글에서 Github Actions를 이용하여 자동으로 release 하는 방법을 소개했었다.
이번엔 release를 생성하면서 해당 release 게시글에 apk까지 같이 업로드하는 방법을 소개한다.
release에 파일을 업로드할 때에는 upload-release-asset api를 사용한다. (자세한 내용은 아래 링크를 참조)
auto_release.yml 파일 작성
이전 게시글에서 작성했던 auto_release.yml 파일 아래에다가 이어서 작성해주면 된다.
# Release에 Apk 파일 업로드
- name: Upload Apk to Release
id: upload-release-asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: presentation/build/outputs/apk/release/presentation-release.apk
asset_name: app-release.apk
asset_content_type: application/zip
asset_path : apk를 생성한 경로 + apk 이름을 작성해주면 된다.
asset_name : release 게시글에 어떤 이름으로 파일을 업로드할 지 적어주면 된다.
Github Actions로 앱 서명하기
위의 코드에서 asset_path를 보면 파일 이름이 presentation-release.apk라고 되어있다. 현재 나는 앱 서명을 해둔 상태인데, Release로 apk를 추출하려면 앱 서명이 꼭 필요하다. ( 서명 안하면 설치가 안된다. )
서명하지 않은채로 apk를 추출하면 presentation-release-unsigned.apk로 추출이 된다.
Github Actions에서 앱에 서명하는 방법까지 알아보자.
keystore.properties 생성
먼저 앱 서명을 생성한다. 앱 서명을 생성하면 아래와 같은 정보들이 생길 것이다. 해당 정보들은 외부에 노출이 되면 안되기 때문에, Github에 그대로 올려선 안된다. 파일로 저장해두고, build.gradle에서 불러오는 방식으로 먼저 프로젝트에 적용시켜야한다.
아래와 같은 형태로 keystore.properties를 생성한다.
storePassword=비밀번호
keyPassword=비밀번호
keyAlias=키 별명
storeFile=키 파일 위치 (.jks 파일의 위치를 뜻한다.)
bulid.gradle 작성
build.gradle에선 아래와 같이 해당 파일을 불러올 수 있다.
def keystorePropertiesFile = project.rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
추가로 아래와 같이 작성한다.
android {
...
signingConfigs {
config {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
}
그 다음 Release 모드로 빌드할 때 해당 정보를 적용하도록 설정한다. debug 모드에도 적용하고 싶으면 release 블럭과 동일하게 debug 블럭을 만들어서 적용해주면 된다.
android {
...
buildTypes {
release {
if(isApplicationPlugin){
shrinkResources true
}
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
}
}
여기까지 하면 프로젝트에 적용은 끝났다. 이젠 Github Actions에서 keystore.properties를 빌드하기 전에 생성하는 방식으로 CI 환경을 구축할 것이다.
.jks 파일을 base64 인코딩으로 변환
앱을 서명하면 key 파일이 생긴다. 해당 파일은 .jks 확장자를 갖고 있는데, 우리는 이 파일을 Github의 secret에 등록해야한다.
따라서, 해당 파일을 base64로 변환한다.
cmd(또는 터미널)을 관리자 권한으로 실행한다. jks 파일이 있는 경로로 이동한 후 아래와 같이 입력해준다.
openssl base64 -in Smiley.jks -out Smiley_base64.txt
base64 파일이 나왔으면 해당 파일을 Github의 Secret에 등록해준다.
keystore.properties에 등록해놨던 정보들도 모두 Secret에 등록해준다.
모두 이런식으로 등록해주면 된다.
Workflows 작성
먼저, base64로 추출했던 keystore 파일을 .jks로 생성하는 코드를 작성한다.
# Generate Keystore File
- name: Generate Keystore File
env:
KEY_STORE: ${{ secrets.APP_KEYSTORE_BASE64 }}
run : |
echo $KEY_STORE > ./keystore.b64
base64 -d -i ./keystore.b64 > ./Smiley.jks
그 다음, keystore.properties를 생성하는 코드를 작성한다.
# Generate keystore.properties
- name: Generate keystore.properties
env:
STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
STORE_FILE: ${{ secrets.STORE_FILE }}
run: |
echo storePassword=$STORE_PASSWORD > ./keystore.properties
echo keyPassword=$KEY_PASSWORD >> ./keystore.properties
echo keyAlias=$KEY_ALIAS >> ./keystore.properties
echo storeFile=$STORE_FILE >> ./keystore.properties
이제 두 파일이 생겼으니, 그냥 원래대로 빌드를 돌리면 된다.
# Release 빌드
- name: Build Release APK
run: bash ./gradlew assembleRelease --stacktrace
이제 release 모드로 실행하면 서명된 앱이 나오고, 해당 apk를 폰에 설치할 수 있게 된다.
전체 코드
해당 코드에는 카카오 App key도 생성하는 구문이 포함되어 있는데, 필요 없으면 지우면 된다.
name: Create Release Tag
on:
push:
branches: [ "main" ]
jobs:
# Release APK 생성
apk:
permissions: write-all
name: Generate APK
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
cache: gradle
# Generate Keystore File
- name: Generate Keystore File
env:
KEY_STORE: ${{ secrets.APP_KEYSTORE_BASE64 }}
run : |
echo $KEY_STORE > ./keystore.b64
base64 -d -i ./keystore.b64 > ./Smiley.jks
# Generate keystore.properties
- name: Generate keystore.properties
env:
STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
STORE_FILE: ${{ secrets.STORE_FILE }}
run: |
echo storePassword=$STORE_PASSWORD > ./keystore.properties
echo keyPassword=$KEY_PASSWORD >> ./keystore.properties
echo keyAlias=$KEY_ALIAS >> ./keystore.properties
echo storeFile=$STORE_FILE >> ./keystore.properties
# Kakao App Key
- name: Access KAKAO_SDK_APPKEY
env:
APOD_API_KEY: ${{ secrets.KAKAO_SDK_APPKEY }}
run: echo KAKAO_SDK_APPKEY=\"$KAKAO_SDK_APPKEY\" > ./local.properties
# Release 빌드
- name: Build Release APK
run: bash ./gradlew assembleRelease --stacktrace
# Release APK 추출
- name: Upload Release APK
uses: actions/upload-artifact@v3
with:
name: app-release
path: presentation/build/outputs/apk/release
# merge commit에서 release 버전 정보 추출
- name: 버전 정보 추출
run: echo "##[set-output name=version;]$(echo '${{ github.event.head_commit.message }}' | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')"
id: extract_version_name
# Release/Tag 생성
- name: Release 생성
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ steps.extract_version_name.outputs.version }}
release_name: ${{ steps.extract_version_name.outputs.version }}
body: |
## ${{ steps.extract_version_name.outputs.version }} 버전이 릴리즈 되었습니다.
- 새로운 버전의 Apk가 릴리즈 되면, Apk 파일이 해당 게시글에 업로드 됩니다.
- 만약 해당 게시글에 Apk 파일이 업로드 되어 있지 않다면 아래 절차를 통해 다운로드 받아주세요.
- ( Source code (zip), Source code (tar.gz) 파일은 apk 파일이 아닙니다. )
### Apk 다운로드
1. [Apk Downloads](https://github.com/DEU-Smiley/Smiley-Android-App/actions/workflows/auto_release.yml?query=is%3Asuccess+) 로 이동하세요.
2. 목록 중 가장 최근에 완료된 항목(초록색 체크 표시)을 클릭하세요.
3. Artifacts 탭에서 apk 파일을 다운로드 할 수 있습니다.
# Release에 Apk 파일 업로드
- name: Upload Apk to Release
id: upload-release-asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: presentation/build/outputs/apk/release/presentation-release.apk
asset_name: app-release.apk
asset_content_type: application/zip
'프로젝트 관리 & 협업 > Github' 카테고리의 다른 글
[ Github ] - Github Actions를 활용하여 release 자동으로 생성하기 (0) | 2023.03.24 |
---|---|
[ Github ] - Github Actions로 안드로이드 APK 자동 생성하기 (0) | 2023.03.24 |
[ Github ] - Github Issue, 프로젝트 개발 과정을 잘 남기는 법 (0) | 2023.02.25 |