안녕하세요
제가 최근에 작성한 GitHub Actions 워크플로우에 대해 설명드리겠습니다.
이 워크플로우는 develop 브랜치에 코드를 푸시할 때마다 안드로이드 앱을 자동으로 빌드하고, 서명한 다음 Firebase App Distribution을 통해 배포합니다.
또한, 작업의 성공 여부에 따라 Slack으로 알림을 보내는 기능도 포함되어 있습니다. 이제 한 줄씩 자세히 살펴보겠습니다.
name: dev Build&Upload
워크플로우 이름 설정: dev Build&Upload라는 이름으로 이 워크플로우를 설정했습니다. 이 이름은 GitHub에서 워크플로우를 쉽게 식별할 수 있게 해줍니다.
on:
push:
branches:
- develop
트리거 설정: 이 워크플로우는 develop 브랜치에 코드가 푸시될 때마다 자동으로 실행됩니다.
jobs:
build:
runs-on: ubuntu-latest
빌드 작업 설정: 여기서는 build라는 작업을 정의했으며, 이 작업은 GitHub에서 제공하는 ubuntu-latest 환경에서 실행됩니다. 최신 버전의 Ubuntu를 사용하므로 최신 기능과 보안 업데이트의 혜택을 받을 수 있습니다.
steps:
- uses: actions/checkout@v3
코드 체크아웃: 이 단계에서는 actions/checkout@v3을 사용해 리포지토리의 코드를 체크아웃합니다. 이는 후속 단계에서 빌드 또는 테스트를 진행하기 위해 필수적인 과정입니다.
- uses: actions/setup-node@v3 # This is optional on linux and macOS
Node.js 설정: actions/setup-node@v3를 사용해 Node.js 환경을 설정합니다. 이는 프론트엔드 빌드 또는 Node.js를 사용하는 다른 작업을 위해 필요할 수 있습니다.
- uses: pocket-apps/action-setup-firebase@v2
with:
firebase-token: ${{secrets.FIREBASE_TOKEN}}
Firebase 설정: pocket-apps/action-setup-firebase@v2를 사용해 Firebase를 설정합니다. 여기서는 FIREBASE_TOKEN이라는 시크릿을 사용해 인증합니다. 이 토큰은 Firebase와의 통신에 필요합니다.
firebase token 발급 방법: https://firebase.google.com/docs/cli?hl=ko#cli-ci-systems
- name: set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle
Java 개발 키트 설정: JDK 17을 설정합니다. actions/setup-java@v3를 사용해 Java 환경을 구성하고, 여기서는 특히 temurin 배포판을 사용합니다. 또한 Gradle 캐시를 활용해 빌드 속도를 향상시킵니다.
- name: Grant execute permission for gradlew
run: chmod +x gradlew
Gradlew 실행 권한 부여: gradlew 파일에 실행 권한을 부여합니다. 이는 Gradle 래퍼를 사용하여 안드로이드 앱을 빌드하는 데 필요합니다.
- name: Build Debug APK
id: buildDebug
run: ./gradlew assembleDebug
디버그 APK 빌드: ./gradlew assembleDebug 명령을 사용해 디버그 APK를 빌드합니다. 이 단계에서 앱의 디버그 버전이 생성됩니다.
* Release 로 바꾸셔도 됩니다.
- name: Sign APK
id: sign_app
uses: r0adkll/sign-android-release@v1
with:
releaseDirectory: app/build/outputs/apk/debug
signingKeyBase64: ${{ secrets.KEY_BASE_64_RELEASE }}
alias: ${{ secrets.KEY_ALIAS }}
keyStorePassword: ${{ secrets.KEYSTORE_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
APK 서명: r0adkll/sign-android-release@v1 액션을 사용해 APK를 서명합니다. 이 과정에서 중요한 시크릿(키 저장소 비밀번호, 키 비밀번호 등)을 사용하여 앱을 안전하게 서명합니다.
secretes 는 repository settings 에서 설정할 수 있습니다.
- name: upload artifact to Firebase App Distribution
uses: wzieba/Firebase-Distribution-Github-Action@v1
with:
appId: ${{secrets.FIREBASE_APP_ID_DEVFORA}}
token: ${{secrets.FIREBASE_TOKEN}}
groups: Developer
file: ${{steps.sign_app.outputs.signedReleaseFile}}
Firebase App Distribution을 통한 배포: wzieba/Firebase-Distribution-Github-Action@v1을 사용해 서명된 APK를 Firebase App Distribution으로 업로드합니다. 여기서는 FIREBASE_APP_ID_DEVFORA와 FIREBASE_TOKEN 시크릿을 사용합니다.
APP_ID 는 Firebase 설정에서 확인할 수 있습니다.
- name: Slack Notification Finish With Success
uses: rtCamp/action-slack-notify@v2
if: success()
env:
SLACK_TITLE: ":white_check_mark:"
SLACK_MESSAGE: "<https://console.firebase.google.com/project/~ 개발자 배포 성공>
SLACK_USERNAME: "android-develop-bot"
SLACK_CHANNEL: "#android-develop-bot"
SLACK_COLOR: "#00BFA5"
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
성공 시 Slack 알림: 배포가 성공적으로 완료되면, rtCamp/action-slack-notify@v2를 사용해 Slack으로 성공 알림을 보냅니다. 여기서는 Firebase Console 링크, PR 제목, 메시지 등을 포함한 메시지를 설정합니다.
- name: Slack Notification Finish With Fail
uses: rtCamp/action-slack-notify@v2
if: failure()
env:
SLACK_TITLE: ":x: DEVfora Firebase 개발자 배포 실패"
SLACK_USERNAME: "android-develop-bot"
SLACK_CHANNEL: "#android-develop-bot"
SLACK_COLOR: "#FF5252"
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
실패 시 Slack 알림: 만약 배포 과정에서 실패가 발생하면, 같은 Slack 알림 액션을 사용해 실패 메시지를 전송합니다. 여기서는 실패 메시지와 함께 빨간색 표시를 사용해 시각적으로 구분합니다.
이 워크플로우를 통해 개발 과정을 더욱 자동화하고 효율적으로 만들 수 있습니다. 모든 과정이 자동으로 진행되므로, 개발자는 코드 작성에 더 집중할 수 있게 됩니다. GitHub Actions는 이를 손쉽게 구현할 수 있는 강력한 도구입니다. 여러분도 이러한 자동화를 통해 개발 프로세스를 개선해보세요!!
전체코드
name: dev Build&Upload
on:
push:
branches:
- develop
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3 # This is optional on linux and macOS
- uses: pocket-apps/action-setup-firebase@v2
with:
firebase-token: ${{secrets.FIREBASE_TOKEN}}
- 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: Build Debug APK
id: buildDebug
run: ./gradlew assembleDebug
- name: Sign APK
id: sign_app
uses: r0adkll/sign-android-release@v1
with:
releaseDirectory: app/build/outputs/apk/debug
signingKeyBase64: ${{ secrets.KEY_BASE_64_RELEASE }}
alias: ${{ secrets.KEY_ALIAS }}
keyStorePassword: ${{ secrets.KEYSTORE_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
# - uses: actions/upload-artifact@v2
# with:
# name: Signed app bundle
# path: ${{steps.sign_app.outputs.signedReleaseFile}}
- name: upload artifact to Firebase App Distribution
uses: wzieba/Firebase-Distribution-Github-Action@v1
with:
appId: ${{secrets.FIREBASE_APP_ID_DEVFORA}}
token: ${{secrets.FIREBASE_TOKEN}}
groups: Developer
file: ${{steps.sign_app.outputs.signedReleaseFile}}
- name: Slack Notification Finish With Success
uses: rtCamp/action-slack-notify@v2
if: success()
env:
SLACK_TITLE: ":white_check_mark:"
SLACK_MESSAGE: ""
SLACK_USERNAME: "android-develop-bot"
SLACK_CHANNEL: "#android-develop-bot"
SLACK_COLOR: "#00BFA5"
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
- name: Slack Notification Finish With Fail
uses: rtCamp/action-slack-notify@v2
if: failure()
env:
SLACK_TITLE: ":x:"
SLACK_USERNAME: "android-develop-bot"
SLACK_CHANNEL: "#android-develop-bot"
SLACK_COLOR: "#FF5252"
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
'프로그래밍 > App 개발' 카테고리의 다른 글
[Android] ConcatAdapter onBindViewHolder 여러번 호출되는 현상 (1) | 2024.01.05 |
---|---|
[Android] POST_NOTIFICATIONS Permission 작동 안하는 문제 (dialog not showing) (1) | 2023.11.23 |
[Android] 버저닝 정책 (1) | 2023.11.03 |
[Android] File templates (BottomSheet) (1) | 2023.11.02 |
[Android] File Templates (Dialog) (0) | 2023.11.02 |