프로젝트/협업 프로젝트(2023.12.18-2024.01.25)

[Key Word 개발기] Git submodule + 배포 적용기

dal_been 2024. 1. 21. 16:33
728x90

앞서 submodule에 대해서 간단하게 설명하였다. 그래서 프로젝트에 적용한 과정과 만났던 에러들을 기록하고자 한다.

서브모듈 레포를 만들었다는 가정하에 진행한다.


git submodule 연결

 

일단 git submodule 적용할 레포에서 터미널을 킨다.

 

git submodule add -b {서브모듈 브랜치} {서브모듈 git url} src/main/resources/config

 

src/main/resources/config의 경우 슈퍼 레포에서 어느 디렉토리에 등록할지 정하는 것이다. 우리 팀의 경우 resources폴더안에 config라는 폴더로 등록하기로 하였다.

(config 폴더의 경우 미리 생성하지 않아도 저 명령어를 통해 폴더가 생서되면 서브모듈이 등록된다)

 

이후 잘 적용되었다면 .gitmodules파일과 config폴더안에 서브모듈에 존재하는 application.yml파일이 잘 생성되었을 것이다.

add하고 commit 이전에 서브모듈의 마지막 commit과 슈퍼레포의 서브모듈의 마지막 commit이 같은지 확인해보자

 

[슈퍼레포에서]
git diff --cached lib

[서브모듈 레포에서]
git log

 

git diff --cached lib을 통해 아직 커밋이 되지 않았지만 스테이지에 올라간 파일 대상을 확인할 수 있다.

두 명령어를 통해 커밋해시가 동일한지 확인한다. 동일하다면 진짜루 성공인 것이다.

 

git add *
git commit -m "{커밋 메세지}"

 

을 통해 커밋하고 push 해주면 된다.

 

이후 깃허브에서 슈퍼레포의 적용한 브랜치로 들어가 서브모듈이 적용된 폴더로 들어가서 확인하면 된다. 그리고 서브모듈이 적용된 폴더를 클릭하면 서브모듈 레포로 이동한다(private 레포라면 허락된 멤버만이 이동하고 허락되지 않았다면 404??에러가 나올것이다)

 


submodule 삭제하기

 

초반에 뭔가 잘못설정해가지고 다시 진행하는 상황이 왔었다. 이때 삭제하지 않고 덮어씌운다는 느낌으로 했다가 

.gitsubmodule에는 분명 마지막으로 적용된 서브모듈 레포로 연결되어있는데 서브모듈이 적용된 디렉토리는 이전에적용된 서브모듈 레포와 연결되어 있었다. 그래서 다시 삭제하고 진행하였다.

 

git submodule deinit -f {폴더}
rm -rf .git/modules/{폴더}
git rm -f {폴더}

 

을 통해 폴더를 제거하고 다시 생성을 진행했다.

 

 


 

submodule 업데이트 하기

 

application.yml파일이 변경되면 알아서 슈퍼레포에서 서브모듈의 변경을 감지해서 업데이트 해주지 않는다.

슈퍼레포에서 서브모듈의 변경사항을 업데이트를 하는 방법은 두가지가 있다 서브모듈이 등록된 디렉토리에 가서 업데이트 하는 방법과 그냥 업데이트 하는 방법??

 

여기서는 그냥 업데이트 하는 방법을 말할것이다. 그냥 업데이트한다는게 디렉토리로 들어가지 않는다는 말이다.

 

git submodule update --remote

 

치면 서브모듈이 업데이트 되면서 서브모듈 쪽 커밋해시가 나온다. 서브모듈 레포의 마지막 커밋해시와 비교해서 똑같으면 성공한것이다.

이후에는 add하고 commit , push하면 끝이다.


배포에 submodule 적용하기

 

일단 yml파일을 2가지 프로파일로 나누었다.

 

spring:
  profiles:
    default: local
  datasource:
    url: jdbc:mariadb://......
---
spring:
  config:
    activate:
      on-profile: prod
    import:
      - config/application-prod.yml

 

기본으로 local로 yml을 적용했고 배포할때는 prod로 yml을 적용시키게 바꾸었다.

저 config/application-prod.yml이 서브모듈이 적용된 디렉토리와 서브모듈에 존재하는 파일 이름이다.

 

이후 jar실행 스크립트를 이렇게 바꾸었다.

sudo -E nohup java -jar -Dserver.port=8080 -Duser.timezone=Asia/Seoul -Dspring.profiles.active=prod /home/ubuntu/$JAR_NAME >> $LOG_FILE 2>&1 &

 

-Dspring.profiles.active를 통해 prod프로파일이 작동하도록 설정하였다.

이러면 끝일까??? ㅎㅎㅎ 이후 만난 에러들에 대해서 설명해주겠다.

 

 

트러블 슈팅

문제 상황 : application-prod.yml을 찾을 수가 없어요

 

Config data resource 'class path resource [config/application-prod.yml]' 
via location 'config/application-prod.yml' does not exist

 

예..?? 왜죠..?? 이해가 되지 않았다. 분명 슈퍼레포에 디렉토리 잘 생성되었고 yml까지 있는 거 확인하였다.. 왜..?

 

일단 첫번째로 한 것은 ec2에 들어가서 jar파일안에 config라는 폴더와 yml파일이 있는지 확인했습니다.

 

jar -tf {your.jar} | grep config

 

위 명령어를 통해 확인해보니 config라는 폴더가 있었지만 안에 yml파일이 없었습니다... 왜 그런걸까..?

찾아보니 private repository여서 그랬던 것입니다.

 

문제 해결 : Jenkins에 Credential 추가하기

 

GIT Token 발급

git에서 token을 발급받아 jenkins쪽에서 private repository도 접근가능하게 해줘야한다.

git token의 경우 github사이트에 들어가서 github settings -> Developer settings -> Personla access token 항목에 들어가 

Generate new token을 해준다(이미 토큰을 가지고 계신다면 안하셔도 됩니다)

거기서 repo를 체크하여 만들어준다.(여기서 만들어진 토큰 값은 잊으시면 다시는 못찾으니 꼭 복사해두세요!)

 

Jenkins Crendetial 등록

username : Github username

password : 토큰

ID : 식별자(원하는 이름으로)

 

 

Jenkins pipeline 수정

이후 pipline script를 수정해준다. (일부만 가지고움)

pipeline {
   agent any
   stages {
       stage('Github') {
           steps {
               git branch: 'develop', url: 'https://github.com/ZB-Keyword/Keyword-BackEnd.git'
               withCredentials([GitUsernamePassword(credentialsId: 'github_token', gitToolName: 'Default')]) {
                    sh 'git submodule update --init --recursive'
               }
           }
       }

 

WithCredentials--- 을 통해서 credentialsId에 ID값을 설정한 대로 넣어준뒤

"sh git submodule update --init --recursive"를 통해 슈퍼레포를 가져올때 서브모듈까지 가져오도록 설정한다.

 

 

이후 빌드하였더니 성공.....에러안나오고 서버가 잘 돌아간다..

 


한 3시간을 고민하다가... 어찌 찾은 해결방법...다행이다...

 

 

https://velog.io/@appti/Jenkins-Git-Submodule#github-account-credentials-%EB%93%B1%EB%A1%9D