Cloud, Infra/Deploy

[Spring Boot & Github Actions] 비공개 json키 관리

seoyamin 2023. 8. 25. 15:50

문제 상황

Firebase 프로젝트와 Spring Boot 서버를 연결하기 위한 json 설정 파일을

외부에 노출하지 않고 Github Actions로 배포하는 방법이 필요 

(일단 해당 json 파일은 gitignore 한 상태)

 


시도 1.

json 파일의 내용을 Github Secrets에 저장해두고,

application-secret.yml을 만들 듯 Github Actions yml 설정 파일에서 json 파일을 만들기

 

- name: Make FirebaseServiceAccountKey.json
    run: |
      touch ./src/main/resources/firebaseServiceAccountKey.json
      echo "${{ secrets.FIREBASE_SERVICE_ACCOUNT_KEY }}" > ./src/main/resources/firebaseServiceAccountKey.json

 

결과 1.

json 파일이 만들어지긴 했으나, 내용에서 큰따옴표가 다 사라짐 (Firebase 설정 안됨)

 

// 원한 파일 내용

{
	"name": "Tom"
}

 

// 결과 파일 내용

{
	name: Tom
}

 


시도 2. 

json 파일 내용을 base64로 암호화하여 Github Secrets에 저장해두고,
이를 복호화하면서 json 파일을 생성하는 Github Actions yml 코드 작성하기

 

- name: Make FirebaseServiceAccountKey.json
    run: |
      touch ./src/main/resources/firebaseServiceAccountKey.json
      echo $ACCOUNT_KEY | base64 -d >> ./src/main/resources/firebaseServiceAccountKey.json
    env:
      ACCOUNT_KEY: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_KEY }}

 

결과 2.

큰 따옴표까지 잘 들어간 json 파일이 서버에 생성되었으나, 여전히 Firebase 설정이 안됨

 

 


시도 3. 

[성공한 방법]  json 파일 내용을 base64로 암호화하여 application-secret.yml 파일에 저장해두고,

이를 복호화하면서 InputStream으로 읽어오는 Java 코드 작성하기

 

# application-secret.yml

firebase:
  service-account: base64로 암호화한 결과

 

// FirebaseConfig.java

@Configuration
public class FirebaseConfig {

    @Value("${firebase.service-account}")
    private String serviceAccountBase64;

    @PostConstruct
    public void init() {
        try {
//            FileInputStream serviceAccount = new FileInputStream("src/main/resources/firebaseServiceAccountKey.json");

            InputStream serviceAccount = new ByteArrayInputStream(getBase64DecodeBytes(serviceAccountBase64));
            FirebaseOptions options = FirebaseOptions.builder()
                    .setCredentials(GoogleCredentials.fromStream(serviceAccount)).build();

            FirebaseApp.initializeApp(options);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static byte[] getBase64DecodeBytes(String input) {
        return Base64.decodeBase64(input);
    }
}

 

 

따로 json 파일을 저장하지 않고도 Firebase 설정 성공 !!

잘 돌아가는 api ~