① 배운 것
플러터 프로젝트에서 깃헙 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)
③ 개선을 위한 방법