-
[Android] Github Release 자동화 (Github Actions)AOS 2023. 11. 19. 02:10반응형
캐치 테이프를 개발하며 CI/CD 를 구축하게 되었습니다.
CI 는 다른 팀원 분이 맡아주셨고,
저는 Github Action 을 이용하여 태그를 푸쉬하여 apk 파일을 빌드하고 파일을 release 하는 워크플로우 를 만들게 되었습니다.
Github Action을 처음 사용해봐서 Github Action 이 뭔지 알아보았습니다.
Github Actions 이란? 공식문서
Github 에서 제공하는 CI/CD 플랫폼으로 Workflow를 구성하여 빌드, 테스트, 배포를 자동화시키는 파이프라인을 구축할 수 있습니다.
Github Action 구성요소를 살펴보자
Workflows
Workflow는 YAML 파일로 정의되며 Repository의 이벤트에 의해 트리거 됩니다.
Repository의 .github/workflow 디렉토리에 정의되며 여러가지의 workflow를 정의할 수 있습니다.
Events
Event는 Workflow 실행을 트리거하는 Repository 안의 특정 활동 입니다.
예를 들어, PR을 생성하거나 Issue를 열거나 Push 할 때 발생시킬 수 있습니다.
Jobs
Job은 Workflow 안에 동일한 Runner에서 실행되는 작업입니다.
단계는 순서대로 실행되며, 각 단계는 동일한 Runner 에서 실행되기 때문에 한 단계에서 다른 단계로 데이터를 공유할 수 있습니다.
예를 들어, 앱을 빌드하는 단계 다음에 빌드된 앱을 테스트 또는 배포 하는 단계를 가질 수 있는 것입니다.
Runners
Runner는 워크플로우가 트리거될 때 해당 워크플로우를 실행시키는 서버입니다. 각 러너는 한번에 하나의 작업을 수행합니다.
Github는 Ubuntu Linux, Microsoft Windows 및 macOS 러너를 제공하여 워크플로우를 실행시킬 수 있습니다.
이제 Release 파이프 라인을 소개하고자 합니다.
name: Android CD on: push: tags: - "v*.*.*" defaults: run: working-directory: ./android
name
workflow의 이름을 "Android CD"로 정의하였습니다.
on
workflow를 실행시키는 repository의 event를 정의하는 것입니다.
push 이벤트 중에서도 tag 가 "v*.*.*" 와 일치하는 경우에 해당 workflow가 실행되도록 정의하였습니다.
defaults
저희 repository에는 android 폴더와 server 폴더가 분리되어 있기 때문에 working-directory를 android 폴더로 지정해주었습니다.
다음은 작업 수행 단계들을 정의하였습니다.
- name: Checkout uses: actions/checkout@v4
소스코드를 체크아웃하는 단계입니다.
- name: Set up JDK 17 uses: actions/setup-java@v3 with: distribution: 'corretto' java-version: 17
JDK 17을 설정하였습니다.
- name: Create Properties File env: DEBUG_KEYSTORE: ${{ secrets.DEBUG_KEYSTORE }} (...) run: | echo "$DEBUG_KEYSTORE" | base64 -d > debug.keystore (...)
앱에 필요한 각종 프로퍼티 파일을 생성하였습니다.
- name: Build Release APK run: | ./gradlew :app:assembleRelease
release apk를 빌드하는 단계입니다.
- name: Upload Release Build to Artifacts uses: actions/upload-artifact@v3 with: name: release-artifacts path: ./android/app/build/outputs/apk/release/ if-no-files-found: error
release build 결과를 github에 업로드하는 단계입니다.
해당 디렉토리에 아무것도 존재하지 않는 경우도 다음단계로 넘어가는 상황을 발견하여 파일이 없다면 error가 발생하도록 설정하였습니다.
해당 워크플로우에 아래 Artifacts에서 들어가면 폴더를 다운로드 받을 수 있습니다.
- name: Create Github Release uses: softprops/action-gh-release@v1 with: generate_release_notes: true files: | ./android/app/build/outputs/apk/release/*.apk
다음은 Github Release를 생성하는 단계입니다.
softprops/action-gh-release 를 이용하였다. Release 노트를 생성하고 위에서 만든 APK 파일을 첨부하도록 하였습니다.
위와 같이 relase 노트가 자동으로 생성되고 apk 파일이 첨부된 것을 확인할 수 있습니다 ㅎㅎ
+) 아
그리고 release apk 에 서명이 되어있지 않아서
공식문서를 참고하여 앱에 서명되도록 gradle 을 구성하였습니다.
예제 코드)
android { ... defaultConfig { ... } signingConfigs { create("release") { // You need to specify either an absolute path or include the // keystore file in the same directory as the build.gradle file. storeFile = file("my-release-key.jks") storePassword = "password" keyAlias = "my-alias" keyPassword = "password" } } buildTypes { getByName("release") { signingConfig = signingConfigs.getByName("release") ... } } }
다음에는 파이어베이스에 테스트 앱 배포 또는 구글플레이 스토어에 배포하는 파이프라인까지 구축해보려고 한다.!!! 🙂
다음 글2023.11.21 - [AOS] - [Android] “캐치 테이프” CD 구축 - 3. Firebase 배포 자동화 (Github Actions)
소스코드는 아래에서 확인해보세용~!
반응형'AOS' 카테고리의 다른 글
[Android] Firebase 배포 자동화 (Github Actions) (2) 2023.11.21 [Android] Clean Architecture 기반의 Multi Module 도입하기 (1) 2023.11.15 [Android] LiveData에서 StateFlow 이전한 이유 (LiveData VS StateFlow) (1) 2023.07.05 [Andorid] local.properties를 이용하여 API URL, KEY 안전하게 숨기기 (0) 2023.06.13 [Android] 무한스크롤 Infinite Scroll (0) 2023.05.17