이번에 배포를 여러번 하면서 할 때마다 삽질을 하고 있다. 몇 번을 더 해보아야 한번에 성공할 수 있을까? 😞
언젠간 도움이 되겠지.. 또는 누군가에게 도움이 되겠지하고 남겨보고자 한다.
1. 서브모듈을 최상위 디렉토리로 옮기다.
서브모듈이 원래는 src/main/resources 내부에 위치해있었는데, 프론트도 secret environment 파일을 서브모듈에 저장하게 됨으로서 서브모듈을 디렉토리 최상위로 옮기게 되었다. 그렇게 하고 나니, 젠킨스가 서브모듈을 읽어오지 못하는 경우가 발생했다. 이 때 물론 젠킨스에서 Build Now를 실행하면 빌드는 성공적으로 되지만 서버가 띄워지지 않고 로그로 에러를 남겼다.
그럴 때 해결하는 방법은 다음과 같다.
우리 팀은 우선 application-prod, application-dev, application-local 모두에 github client id와 secret이 존재했기 때문에, 외부로 오픈되지 않아야하는 이슈가 있다. 그래서 이 세가지 yaml 파일을 모두 서브모듈에 넣은 뒤, build.gradle에 아래와 같은 내용을 작성해준다. 그럼, 빌드할 때 자동으로 각 yaml 파일들을 /src/main/resources로 옮겨서 인식한다.
task copyDev(type: Copy) {
from '../dev/application-prod.yml'
into './src/main/resources'
from '../dev/application-dev.yml'
into './src/main/resources'
from '../dev/application-local.yml'
into './src/main/resources'
}
build {
dependsOn copyDev
}
2. 서브모듈을 https 방식이 아닌, ssh 방식으로 불러오다.
github에서 clone할 때에는 위와 같이 https 방법 외에도 ssh 방법이 존재한다. 우리 팀의 프론트엔드 크루들이 netlify를 이용해서 배포를 하고 있는데, netlify는 서브모듈을 인식하기 위해서는 ssh를 이용해야했다. 그래서 .gitmodules에 기존에는 https 방식이었지만 ssh 방식으로 변경했다.
// 기존
[submodule "dev"]
path = dev
url = https://github.com/botobo-team/dev.git
// 변경 후
[submodule "dev"]
path = dev
url = git@github.com:botobo-team/dev.git
그랬더니 젠킨스에서 빌드되지 않는 이슈가 발생했다. 젠킨스에서 ssh로 레포지토리를 읽어오기 위해서는 ssh-key를 등록해준다던지 등의 추가적인 절차가 필요한 듯 했다.(확실하지 않다.) 그래서 어떻게 할지 고민을 해 보다가.. 우선은 .gitmodules에 두가지 모두를 작성하는 방법을 택했다. 될까?하는 의구심을 가진 채 해 보았는데 netlify, jenkins 모두 알아서 각자가 실행 가능한 방법을 통해 서브모듈을 읽어오는 것을 확인했다.
// 최종 -> 둘 다 모두 적기!
[submodule "dev"]
path = dev
url = https://github.com/botobo-team/dev.git
[submodule "dev"]
path = dev
url = git@github.com:botobo-team/dev.git
혹시 ssh만으로도 할 수 있는 방법을 안다면.. 꼭 알려주시면 많은 도움이 될 거에요 😍
3. yaml 파일 내용을 변경했는데 적용이 되지 않는다.
yaml 파일을 분리했다. 원래는 dev 하나만 서브모듈에서 관리했는데, 이번에 데모를 진행하면서 main 브랜치로 1차 release가 진행되면서 상용 서버를 배포했기 때문이다. 그래서 기존의 application-dev.yaml에 이어 application-prod.yaml을 생성하여 서브모듈에 추가했다. 하지만! 젠킨스에서 빌드했더니 yaml 파일을 읽어오지 못했다! 제발 좀 한번에 읽어와!
도대체 이유를 알 수 없을 때엔, 젠킨스 서버에서 저장하고 있는 캐시 때문일 수 있다. 우리 팀의 경우에는 젠킨스 서버의 서브모듈에서 캐싱해둔 커밋 이력을 가져왔기 때문에 새로운 것이 가져와지지 않았었다. 젠킨스 내부의 서브모듈에서 git pull을 진행한 다음, 다시 Build Now를 수행하면 성공할 수 있다.
젠킨스를 도커로 띄운 경우 젠킨스 내부로 들어가는 방법은 아래와 같다.
docker exec -it {container ID} bash
cd /var/jenkins_home/workspace
도커의 젠킨스 컨테이너 아이디를 통해 bash를 실행한 뒤, 위 cd 명령어를 통해 workspace로 진입하면 자신이 젠킨스에 만들어놓은 아이템을 확인할 수 있다. 해당 아이템의 내부로 들어가서 서브모듈 내부를 확인할 수 있다.
4. 서브모듈, yaml 모두 변경하고, 업데이트 후 푸시해서 젠킨스에서 빌드를 했는데 캐시가 남아있다.
이 내용은 설명하기가 애매한데, git 자체에서 캐싱해두고 있는 내용 때문에 발생하는 이슈같다.
stackoverflow의 이 글을 통해서 해결할 수 있었다.
요약하자면, ls-files --stage | grep을 통해 캐싱된 내용이 있는지 확인하고 있다면 rm을 통해 삭제!
git ls-files --stage | grep 160000
git rm --cached {삭제할 것}