지난 블로그 업데이트 팝업 띄우기에서 Firebase의 Remote Config를 이용하여 최신 버전을 값을 가져와 버전을 확인했었다.
하지만 나는 매번 앱을 업데이트할 때마다 Firebase 콘솔에 들어가 Remote Config의 값을 바꾸어주기가 번거로울 것이라 생각했다.
따라서 프로젝트의 버전을 업데이트 할 때마다 자동으로 Remote Config의 값을 바꾸는 법에 대해 생각해보았다.
iOS의 버전을 결정하는 project.pbxproj 파일의 FLUTTER_BUILD_NAME 값이 바뀌면 그걸 읽어서 Firebase Remote Config의 ios_latest_version 파라미터 값을 업데이트하는 자동화하는 것.
현재 내 프로젝트에서는 iOS의 버전 정보를 ios/Runner.xcodeproj/project.pbxproj 파일의 FLUTTER_BUILD_NAME 값으로 관리하고 있기 때문에 이 값이 바뀌는 걸 감지하여 Remote Config를 업데이트하도록 구성했다.
서비스 계정 키 발급 받기 (Firebase 콘솔)
1) Firebase Console 접속하여 프로젝트를 선택한다.
2) 프로젝트 설정으로 이동하여 서비스 계정을 클릭한다.
3) Firebase Admin SDK 섹션에서 새 비공개 키 생성 클릭하여 JSON 파일을 다운받는다.

GitHub Secrets에 등록하기
1) GitHub에서 다음 경로로 이동한다.
Settings > Secrets and variables > Actions > New repository secret

2) 아래 처럼 설정해준다.
Name: GOOGLE_APPLICATION_CREDENTIALS_JSON
Value: 방금 받은 서비스 계정 키 JSON 파일을 열어 내용을 통째로 붙여넣는다 (그대로!)
3) GitHub Action yml 파일 생성
프로젝트의 루트 경로에 .github/workflows/{yml 파일 이름}.yml 을 생성해준다. (꼭 루트경로여야한다!)

처음에는 CLI를 활용하여 깃허브 액션을 시도하고자 했다. 그런데 자료도 많이 없었고 깃허브에 액션도 계속 실패했다.
파이어베이스 공식 자료에 찾아보니 Remote Config의 CLI 명령어는 아래의 3개만 지원했었고 배포를 하는 명령어는 없었던 것이었다!
되지 않는 명령어로 반나절을 날려버렸다...
그래도 과감히 CLI 방식을 포기하고 새로운 방식인 RestAPI 방식을 시도해보고자 했다.
우선 내가 작성한 yml파일에 대해 설명해보겠다.
참고로 이건 나의 상황에 맞게 작성되어있기 때문에 본인의 상황에 맞게 변경하길 바란다.
name: Update Remote Config on iOS Version Change
# develop 브랜치에 push되면서 ios 버전 파일이 변경되었을 때만 실행
on:
push:
branches:
- develop
paths:
- "ios/Runner.xcodeproj/project.pbxproj"
jobs:
update-remote-config:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
# FLUTTER_BUILD_NAME 값을 추출해서 환경변수로 설정
- name: Extract FLUTTER_BUILD_NAME
id: extract_version
run: |
version_line=$(grep FLUTTER_BUILD_NAME ios/Runner.xcodeproj/project.pbxproj | head -n 1)
version=$(echo "$version_line" | sed -E 's/.*FLUTTER_BUILD_NAME = ([0-9]+\.[0-9]+\.[0-9]+);/\1/')
echo "FLUTTER_VERSION=$version" >> $GITHUB_ENV
# develop 브랜치를 기준으로 FLUTTER_BUILD_NAME 값이 바뀌었는지 확인
- name: Check if version changed
id: check_diff
run: |
git fetch origin develop
if git diff origin/develop -- ios/Runner.xcodeproj/project.pbxproj | grep -q "FLUTTER_BUILD_NAME"; then
echo "changed=true" >> $GITHUB_OUTPUT
else
echo "changed=false" >> $GITHUB_OUTPUT
fi
# Firebase 서비스 계정 키 파일 생성 (secrets에서 가져옴)
- name: Write service account key
run: echo '${{ secrets.GOOGLE_APPLICATION_CREDENTIALS_JSON }}' > $HOME/firebase-key.json
# Google Auth 관련 Python 라이브러리 설치
- name: Install Google Auth Library
run: pip install google-auth
# Firebase에 요청할 수 있는 Access Token 생성
- name: Generate Access Token
id: generate_token
run: |
python3 <<EOF > token.txt
import json
from google.oauth2 import service_account
import google.auth.transport.requests
creds = service_account.Credentials.from_service_account_file(
filename="$HOME/firebase-key.json",
scopes=["https://www.googleapis.com/auth/firebase.remoteconfig"]
)
request = google.auth.transport.requests.Request()
creds.refresh(request)
print(creds.token)
EOF
echo "ACCESS_TOKEN=$(cat token.txt)" >> $GITHUB_ENV
# remote-config.json 파일 생성 (변경된 iOS 버전 반영)
- name: Create remote-config.json
run: |
cat <<EOF > remote-config.json
{
"parameters": {
"ios_latest_version": {
"defaultValue": {
"value": "${{ env.FLUTTER_VERSION }}"
},
"description": "iOS 최신 버전"
}
}
}
EOF
# REST API를 통해 Firebase Remote Config 업데이트 요청 보내기
- name: Update Firebase Remote Config via REST
run: |
curl -X PUT \
-H "Authorization: Bearer ${{ env.ACCESS_TOKEN }}" \
-H "Content-Type: application/json; UTF-8" \
-H "If-Match: *" \
-d @remote-config.json \
"https://firebaseremoteconfig.googleapis.com/v1/projects/como-38934/remoteConfig"
커밋을 하고 깃허브 액션이 돌 때 아래와 같이 초록불이 들어오면 깃허브 액션이 성공적으로 수행된 것이다.

이제 Firebase 콘솔에 가서 버전이 잘 업데이트 됐는지 확인해보자.
이전엔 버전이 1.3.5였지만 테스트를 위해 1.3.4로 내려보았을 때 잘 반영이 된 것을 확인 할 수 있다.
이전 버전

새 버전
