우선, 프로젝트 root에 .github
폴더를 만들고 .github/workflows
폴더를 생성한다. 그 안에 deploy_android.yaml
파일을 생성해준다.
yaml
파일의 특성중 하나는 들여쓰기가 곧 문법인 셈으로, 들여쓰기를 잘해야한다.
name: 🌈 Develop Android Deploy
on:
pull_request:
branches: [develop] # develop 브랜치에 pull_request를 할때마다 실행하겠다는 의미
결과화면
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에 따라서 값이 달라지는 걸 볼 수 있다.
- 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
$GITHUB_WORKSPACE
아래있는 해당 레파지토리의 접근할 수 있도록 하는 라이브러리 - 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}}
.env
파일을 해당 flutter 프로젝트의 root에 생성하는 라이브러리 - 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
를 입력한다.
- 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를 만들어준다.
- 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
- 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 }}
- 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
- 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
이렇게하면 Android CI/CD 완성이다