ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Github Actions + Git Submodule로 application.yml 관리하기
    Spring 2024. 4. 10. 04:19

     

    Scoop 프로젝트를 하며 Spring의 application-dev.yml 코드의 여러 키값들을 공개하지 않아야 했다. 그래서 처음에 각 값들을 secrets에 저장해서 사용하는 방식을 선택했다. 그랬더니 아래와 같은 코드가.. 되었다.

            env:
              spring.datasource.driver-class-name: ${{ secrets.DRIVER_CLASS_NAME }}
              spring.datasource.url: ${{ secrets.DATASOURCE_URL }}
              spring.datasource.username: ${{ secrets.DATABASE_USERNAME }}
              spring.datasource.password: ${{ secrets.DATABASE_PASSWORD }}
              spring.security.oauth2.client.registration.kakao.client-id: ${{ secrets.KAKAO_CLIENT_ID }}
              spring.security.oauth2.client.registration.kakao.client-secret: ${{ secrets.KAKAO_CLIENT_SECRET }}
              spring.security.oauth2.client.registration.kakao.redirect-uri: ${{ secrets.KAKAO_REDIRECT_URI }}
              spring.security.oauth2.client.provider.kakao.authorization-uri: ${{ secrets.KAKAO_AUTHORIZATION_URI }}
              spring.security.oauth2.client.provider.kakao.token-uri: ${{ secrets.KAKAO_TOKEN_URI }}
              spring.security.oauth2.client.provider.kakao.user-info-uri: ${{ secrets.KAKAO_USER_INFO_URI }}
              spring.data.redis.host: ${{ secrets.REDIS_HOST }}
              spring.data.redis.port: ${{ secrets.REDIS_PORT }}
              spring.rabbitmq.host: ${{ secrets.RABBITMQ_HOST }}
              spring.rabbitmq.port: ${{ secrets.RABBITMQ_PORT }}
              spring.rabbitmq.username: ${{ secrets.RABBITMQ_USERNAME }}
              spring.rabbitmq.password: ${{ secrets.RABBITMQ_PASSWORD }}
              jwt.secret-key: ${{ secrets.JWT_SECRET_KEY }}
              rabbitmq.summary.queue.name: ${{ secrets.SUMMARY_QUEUE_NAME }}
              rabbitmq.summary.exchange.name: ${{ secrets.SUMMARY_EXCHANGE_NAME }}
              rabbitmq.summary.routing.key: ${{ secrets.SUMMARY_ROUTING_KEY }}
              rabbitmq.store.queue.name: ${{ secrets.STORE_QUEUE_NAME }}
              rabbitmq.store.exchange.name: ${{ secrets.STORE_EXCHANGE_NAME }}
              rabbitmq.store.routing.key: ${{ secrets.STORE_ROUTING_KEY }}

     

    너무 가독성이 떨어지고 지저분한 코드가 되어버린 것 같아서 다른 방법을 고민하게 되었다. 

     

     

    1. application-dev.yml 파일을 통째로 secrets에 넣어버리는 방법

    장점

    • 쉽다. 그냥 Secrets에 파일 전체를 넣고, {{ secrets.APPLICATION_YML }}처럼 사용하면 된다.

    단점

    • 하나의 설정을 변경하거나 추가하고자 해도, 파일 전체를 다시 secrets 변수로 넣어야 한다.
    • 내가 저장한 파일 정보를 다시 확인하는 것이 불가능하다.

     

    2. application-dev.yml 파일을 내 개인 레포지토리에 private으로 올려서 submodule로 사용하는 방법

    장점

    • 내가 작성한 파일을 얼마든지 다시 확인할 수 있다.
    • 값들을 하나씩 secrets 변수로 설정할 필요가 없다.

    단점

    • 협업자가 있을 경우, 내 개인 레포지토리에 올리는 것이기 때문에 협업자가 해당 파일을 확인하는 것이 불가능하다.
    • submodule을 사용하기 때문에, 내 개인 레포지토리에서 커밋 -> 실제 프로젝트 레포지토리에서 서브모듈 체크아웃 후 다시 커밋 하는 약간의 복잡한 과정이 필요하다.

     

     

    결국 선택한 방법은 두 번째 방법이다. 이유는 내가 올려둔 내용을 다시 확인할 수 있고, 이번 프로젝트에서 백엔드를 혼자 맡았기 때문에, 협업자에게 공유해야 하는 것을 고려할 필요가 없기 때문이다.

     


    아래와 같이 두 개의 설정 파일을 submodule로 설정했다.

    path에는 작업 레포지토리에 들어갈 설정 파일의 위치를 넣고, url에는 설정 파일을 올려둔 내 개인 private레포지토리의 url을 넣으면 된다. branch에는 내 개인 레포지토리에서 설정 파일을 커밋하는 브랜치명을 작성했다.

     

    [ .gitmodules ]

    [submodule "backend/core/src/main/resources/scoop-core-config"]
    	path = backend/core/src/main/resources/scoop-core-config
    	url = https://github.com/yeonjy/scoop-core-config.git
    	branch = main
    [submodule "backend/ai_response_processor/scoop-ai-env"]
    	path = backend/ai_response_processor/scoop-ai-env
    	url = https://github.com/yeonjy/scoop-ai-env.git
    	branch = main

     

    submodule 추가 명령어

    git submodule add ${생성한 Private Repository의 URL}

     

    submodule을 추가할 때, 처음에 비밀번호를 입력하라고 한다. 이 경우, Personal Access Token을 넣어야 한다. 계정 비밀번호의 경우 아래와 같이 2021년 8월 13일 이후로 인증이 불가능하다.

    remote: Support for password authentication was removed on August 13, 2021.

     

    그 결과, 아래와 같이 잘 적용된 것을 볼 수 있다.

     

     

    submodule을 private 레포지토리에 업데이트 한 후, 해당 내용을 메인 작업 레포지토리에 업데이트 하려면 아래 명령어를 입력하면 된다.

    git submodule update --remote --merge

     

Designed by Tistory.