본문 바로가기
Cloud | CICD/Deploy

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

by seoyamin 2023. 8. 25.

문제 상황

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 ~