Flutter 로 개발한 android앱의 Github Actions CI/CD

우선, 프로젝트 root에 .github 폴더를 만들고 .github/workflows 폴더를 생성한다. 그 안에 deploy_android.yaml 파일을 생성해준다.
yaml 파일의 특성중 하나는 들여쓰기가 곧 문법인 셈으로, 들여쓰기를 잘해야한다.

deploy_android.yaml 파일이 실행될 이름을 지어준다.(required)

name: 🌈 Develop Android Deploy 
on: 
  pull_request: 
    branches: [develop]    # develop 브랜치에 pull_request를 할때마다 실행하겠다는 의미

결과화면

jobs 작성(required/optional)

environment를 설정한는건 optional, ubuntu를 돌리는건 required.

jobs:
  deploy_android:
    name: DEV EXPERT 💙 ANDROID DEPLOY 🚀
    environment: dev
    runs-on: ubuntu-latest
    steps:

여기서 environment를 dev로 했는데, 이렇게 한 이유는 githubActions의 secrets key 의 변수명을 똑같이 하고 값만 dev/prod 다르게 하기 위함이다. 이렇게 함으로써 장점은 코드에서 변수명을 하나만 작성함으로써 코드가 좀 더 간결해진다는 장점이 있다. 이를 세팅하기 위해선 github.com 에서 {{해당 프로젝트}}/settings/Environments에서 세팅할 수 있다.

githubActions.secrets에서 보면 아래 이미지처럼 변수 이름은 같지만 environment에 따라서 값이 달라지는 걸 볼 수 있다.

build를 위한 작업(required)

        - name: Checkout
          uses: actions/checkout@v3
        
        - name: Setup Java ☕️
          uses: actions/setup-java@v1
          with:
            java-version: 15.x 

        - name: Clone Flutter repository with version 3.7.1 🐤
          uses: subosito/flutter-action@v2
          with:
            flutter-version: '3.7.1'
            channel: stable
        - run: flutter doctor -v    
  • actions/checkout
    $GITHUB_WORKSPACE 아래있는 해당 레파지토리의 접근할 수 있도록 하는 라이브러리
  • actions/setup-java
    java를 설치하는 라이브러리. android를 빌드하기 위한 기본 설정이다.
  • subosito/flutter-actions
    flutter sdk를 설치하는 라이브러리. subosito는 해당 라이브러리를 배포한 사람의 id이다.

.env파일을 생성한다.(optional)

        - name: Create .env File
          uses: iamsauravsharma/create-dotenv@v1.2.2
          with:
            env-prefix: 'envkey_'
            file-name: '.env'
            directory: '/home/runner/work/{{YOUR_PROJECT_NAME}}/{{YOUR_PROJECT_NAME}}/'
          env:
            IS_SERVER: true
            envkey_AMPLITUDE_API_KEY: ${{secrets.AMPLITUDE_API_KEY}} 

Android key endode

        - name: Download Android keystore
          id: android_keystore_dev
          uses: timheuer/base64-to-file@v1.2
          with:
            fileName: keystore-dev.jks
            fileDir: '/home/runner/work/{{YOUR_PROJECT_NAME}}/{{YOUR_PROJECT_NAME}}/android'
            encodedString: ${{ secrets.ANDROID_KEYSTORE_JKS }} 

keystore-dev.jks 파일을 BASE64로 인코딩해서 githubActions.secrets에 저장한다.
해당 인코딩 명령어는 terminal에서 openssl base64 -in ./keystore.jks를 입력한다.

key-dev.properties 생성

        - name: Create key-dev.properties
          run: |
            echo "storeFile=${{ steps.android_keystore_dev.outputs.filePath }}" > android/keystore-dev.properties
            echo "storePassword=${{ secrets.ANDROID_KEYSTORE_PASSWORD }}" >> android/keystore-dev.properties
            echo "keyPassword=${{ secrets.ANDROID_KEY_PASSWORD }}" >> android/keystore-dev.properties
            echo "keyAlias=${{ secrets.ANDROID_KEY_ALIAS }}" >> android/keystore-dev.properties

ubuntu에서 command를 활용해 keystore-dev.properties를 만들어준다.

Build Application

        - name: Build application 🥕
          run: |
            cd /home/runner/work/sprint-expert-mobile-application/sprint-expert-mobile-application/
            flutter clean
            flutter pub get
            flutter packages pub run build_runner build --delete-conflicting-outputs
            flutter build appbundle --flavor dev -t lib/main_dev.dart

Sign AAB(Android App Bundle)

        - name: ✅ Sign AAB 
          id: sign
          uses: r0adkll/sign-android-release@v1
          with:
            releaseDirectory: build/app/outputs/bundle/devRelease
            signingKeyBase64: ${{ secrets.ANDROID_KEYSTORE_JKS }}
            alias: ${{ secrets.ANDROID_KEY_ALIAS }}
            keyStorePassword: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
            keyPassword: ${{ secrets.ANDROID_KEY_PASSWORD }}

Upload AAB(Android App Bundle)

        - name: ✅ Upload AAB
          id: uploadArtifact
          uses: actions/upload-artifact@v3
          with:
            name: app-dev-release.aab
            path: build/app/outputs/bundle/devRelease/app-dev-release.aab
            retention-days: 5
  • actions/upload-artifact
    aab파일을 업로드 하는 라이브러리. 아래처럼 githubActions에 들어가보면 aab파일이 업로드되어 있다.

Upload Google Play

        - name: Deploy to Play Store (INTERNAL) 🚀
          uses: r0adkll/upload-google-play@v1
          with:
            serviceAccountJsonPlainText: ${{ secrets.ANDROID_SERVICE_ACCOUNT_JSON }}
            packageName: ${{secrets.AOS_PACKAGE_NAME}}
            releaseFiles: build/app/outputs/bundle/devRelease/app-dev-release.aab
            track: internal
            status: draft
  • r0adkll/upload-google-play
    Google Play콘솔에 업로드하는데, 내부테스트 > 초안작성 식으로 업로드 한다.
    track 과 status를 정해야한다.

이렇게하면 Android CI/CD 완성이다

profile
Hello Universe!

0개의 댓글