본문 바로가기
프로그래밍/App 개발

[Android] GitHub Actions CI/CD

by 엽기토기 2023. 11. 14.
반응형

안녕하세요

제가 최근에 작성한 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

 

Firebase CLI 참조  |  Firebase 문서

 

firebase.google.com

 

  - 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_DEVFORAFIREBASE_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 }}
반응형