진행 중인 프로젝트에서 ktlint를 적용하여 github action을 이용해 CI를 구축했다.
그리고 FCM 설정을 위해 프로젝트 내부에 google-services.json 파일을 추가하였지만, secret 문서이기 때문에 .gitignore에 추가하여 레포에 올라가는 것을 막아놓은 상태였다.
이 상태에서 workflow를 돌리니 이런 오류가 발생했다...!
FAILURE: Build failed with an exception.
* What went wrong:
11 actionable tasks: 7 executed, 4 up-to-date
Execution failed for task ':app:processDebugGoogleServices'.
> File google-services.json is missing.
The Google Services Plugin cannot function without it.
Searched locations: /home/runner/work/Don-t-Forget---Android/Don-t-Forget---Android/app/src/debug/google-services.json, /
google-services.json 파일을 찾을 수 없다는 내용...
그래서 처음에는 해당 위치에 빈 파일을 넣어 놓는 방법을 선택했었다.
대충 주석만 넣어서
# for ktlint
이런 식으로 넣었는데
Execution failed for task ':app:processDebugGoogleServices'.
> Malformed root json at /home/runner/work/Don-t-Forget---Android/Don-t-Forget---Android/app/google-services.json
포맷이 문제였는지 해당 오류가 발생했다
좀 더 제대로 된 문제 해결 방법을 찾아보고자 했다
secrets 파일 생성
레포지토리 내부 설정으로 들어가면 다음과 같은 탭에서 secrets 파일을 만들 수 있다.
새롭게 파일을 만들고 이름을 기억하자. 그리고 내부는 기존의 파일을 복붙하면된다.
workflow 파일 수정
name: Android Build CI
on:
pull_request:
branches: [ develop, main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Ktlint Check
run: ./gradlew --no-daemon ktlintCheck --continue
- name: Build with Gradle
run: ./gradlew build
ktlint 를 체크하고 build를 실행하는 workflow이다
이제 여기에 google-serivces.json 파일을 만들고 데이터를 불러오는 작업을 추가할 것이다
name: Android Build CI
on:
pull_request:
branches: [ develop, main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Ktlint Check
run: ./gradlew --no-daemon ktlintCheck --continue
// 파일을 생성하는 job
- name: Create file
run: cat /home/runner/work/<Project-Name>/<Project-Name>/app/google-services.json | base64
// 데이터를 덮어 쓰는 job
- name: Putting data
env:
DATA: ${{ secrets.GOOGLE_SERVICES_JSON }}
run: echo $DATA > /home/runner/work/<Project-Name>/<Project-Name>/app/google-services.json
- name: Build with Gradle
run: ./gradlew build
<Project-Name>/<Project-Name>
여기 부분에는 본인의 프로젝트명을 적어주면 된다!