241107 TIL

나고수·2024년 11월 7일
0

2024 TIL

목록 보기
80/94
post-thumbnail

① 배운 것
플러터 프로젝트에서 깃헙 actions를 이용해 firebase app distribution에 자동배포하는것을 함
일단 안드로이드만 성공햇다 ㅋㅋ
기본적으로는 이코드를 참고했고 플러터 빌드를 위해 바뀐 부분만 주석으로 처리해두겠음

name: Android CD to Firebase App distribution [flutter build apk --release --flavor dev]

env:
    GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4g -Dorg.gradle.daemon=false"
    GRADLE_BUILD_ACTION_CACHE_DEBUG_ENABLED: true

on:
    workflow_dispatch:
    push:
        branches:
            - develop_test         

permissions:
    contents: write

jobs:
    cd-build:
        runs-on: ubuntu-latest

        steps:
            -   name: Checkout
                uses: actions/checkout@v4
				
                #플러터라 이부분을 안넣어도 될 줄 알았는데
                #안넣으니까 package_info_plus 디펜던시를 가져오는 부분에서 '':package_info_plus:compileReleaseJavaWithJavac'.' 에러가났다.
                #[참고글](https://github.com/incrediblezayed/file_saver/issues/86)
            -   name: Set up JDK 17
                uses: actions/setup-java@v3
                with:
                    distribution: 'corretto'
                    java-version: 17      

            -   name: Generate key.properties
                run: |
                    echo '${{ secrets.KEY_PROPERTIES }}' | base64 --d >> ./android/key.properties

            -   name: Generate local.properties
                run: |
                    echo '${{ secrets.LOCAL_PROPERTIES }}' | base64 --d >> ./android/local.properties

            -   name: Generate google-services.json
                run: echo '${{ secrets.GOOGLE_SERVICE_JSON }}' | base64 --d > ./android/app/google-services.json
			
            #jks파일을 cat으로 읽어보니 인코딩이 다 깨져나오길래 secrets에 저장할때 그냥 다른 파일처럼 base64로 인코딩해서 넣으면
            #되는거 맞나 싶었는데 맞음! 
            -   name: Generate keystore.jks
                run: echo '${{ secrets.JKS }}' | base64 --d > ./android/app/keystore.jks

			#안드로이드는 build.gradle에서 버전을 print하는 task를 추가해서 그걸 활용해서 버전을 가져왔는데
            #플러터에서는 보통 버전을 pubspec.yml에서 관리하기 때문에 pubspec.yml파일로 이동 후 version문구를 찾아서
            #+기준으로 파싱한다음에 앞에것을 버전네임, 뒤에것을 버전코드로 설정한다
            -   name: Extract Version 
                run: |
                    VERSION_NAME=$(grep 'version:' pubspec.yaml | sed -e 's/version: //' -e 's/+.*//')
                    VERSION_CODE=$(grep 'version:' pubspec.yaml | sed -e 's/version: //' -e 's/.*+//')
                    echo "VERSION_NAME=$VERSION_NAME" >> $GITHUB_ENV
                    echo "VERSION_CODE=$VERSION_CODE" >> $GITHUB_ENV
                id: extract_version

			#플러터를 설치한다
            -   name: setup flutter
                uses: subosito/flutter-action@v1
                with: 
                    channel: 'stable'

			#디펜던시에 private 레포가 있었다. 이럴때는 그 레포 주소를 권한을 줘서 클론 받을 수 있게 해야한다.
			#user_name은 깃헙 계정 Username을 넣으면 되고, githubToken은 권한 중 repo 권한이 추가된 토큰을 넣으면 된다.
            #https://stackoverflow.com/questions/66218643/correct-global-git-config-for-personal-access-tokens-in-github
            - name: Configure Git
              run: |
                git config --global url."https://${{ secrets.USER_NAME }}:${{ secrets.GITHUB_TOKEN }}@github.com/".insteadOf "https://github.com/"                 
			
            #flutter 디펜던시 pub get 
            - name : install dependecies
              run: flutter pub get
              
            #이부분은 회사프로젝트에서 여러 key나 url등을 관리하는 파일을 gitIgnore시켜놓았기 때문에 secrets를 이용해 만드는 부분   
            - name: Generate config
              run: |
                echo '${{ secrets.CONFIG }}' | base64 --d >> ./lib/common/config.dart
                    
            #flutter build        
            -   name: Build Release APK
                run: |
                    flutter build apk --release --flavor dev

            -   name: Upload Release Build to Artifacts
                uses: actions/upload-artifact@v3
                with:
                    name: debug-artifacts
                    path: build/app/outputs/flutter-apk/app-dev-release.apk
                    if-no-files-found: error

            -   name: Create Github Release
                uses: softprops/action-gh-release@v1
                with:
                    tag_name: "${{ env.VERSION_NAME }}(${{ env.VERSION_CODE }})"
                    release_name: "${{ env.VERSION_NAME }}(${{ env.VERSION_CODE }})"
                    generate_release_notes: true
                    files: |
                        build/app/outputs/flutter-apk/app-dev-release.apk

            -   name: Upload artifact to Firebase App Distribution
                uses: wzieba/Firebase-Distribution-Github-Action@v1
                with:
                    appId: ${{secrets.FIREBASE_APP_ID_ANDROID_DEV}}
                    serviceCredentialsFileContent: ${{ secrets.CREDENTIAL_FILE_CONTENT }}
                    groups: "tester1, tseter2"
                    #그룹이 여러개 있을 경우 https://github.com/wzieba/Firebase-Distribution-Github-Action/discussions/42#discussioncomment-757013
                    file: build/app/outputs/flutter-apk/app-dev-release.apk

② 회고 (restropective)

③ 개선을 위한 방법

profile
되고싶다

0개의 댓글