배포자동화 오작동 문제 해결 1 (간단하게 해결)
•
에러 : 배포자동화가 겉보기엔 성공이라 뜨는데 실제론 동작하지 않음
◦
원인
▪
배포되는 이미지가 잘못되어 있었다. docker-compose.yml에서 사용할 이미지 이름이 beachcombine_spring으로 되어 있는데, 배포자동화 결과로 만들어지는 이미지 이름이 beach_combine이어서 docker-compose가 제대로 동작하지 않고 있었다.
◦
해결
▪
.github / workflows / deploy.yml의 deploy script 수정
▪
원래
sudo docker pull choo000407/beach_combine:${GITHUB_SHA::7}
sudo docker tag choo000407/beach_combine:${GITHUB_SHA::7} beach_combine
sudo docker-compose up -d
YAML
복사
▪
수정
sudo docker pull choo000407/beach_combine:${GITHUB_SHA::7}
sudo docker tag choo000407/beach_combine:${GITHUB_SHA::7} beachcombine_spring
sudo docker-compose up -d
YAML
복사
◦
후기
▪
사실 정말 간단한 건데, 발견 못했었단 게 웃기다,,, 수정 사항 생기면 직접 배포해주면 되기에 프로젝트 자체에 크리티컬한 문제를 주진 않았지만, 배포자동화가 제대로 동작 안 하는 게 답답했는데 찾아서 기쁘다! 일단, 이걸로 새로운 이미지로 docker 컨테이너가 띄어지는 건 확인했다. 그전까진 계속 이 과정이 안됐었다.
배포자동화 오작동 문제 해결 2 → 배포 서버 실행 에러 해결 (힘겹게 성공,,,,,! 기쁘다!)
•
에러) 끝이 아니었다 ^^ ㅋㅋ 이번에 배포를 새로 해준 건 됐는데, 포스트맨에서 테스트 시 모든 api가 Error: connect ECONNREFUSED 35.216.84.77:8080 이라는 에러가 뜬다.
◦
원인) 보아 하니 이 녀석은 굉장히 다양한 원인으로 발생한다. 우린 그 중 서버가 가동되지 않아 발생한 것 같다. 포스트맨 자체엔 문제가 없는 걸 확인했기 때문이다.
▪
실행이 제대로 안된다. 이미지 자체에 문제가 있는 것 같다. 이번에도 기나긴 로그 뜯기 시작,,,,,,,, → 찾앗다@@@!!!!! class path resource [beach-combine-3770712535c0.json] cannot be opened because it does not exist 이다. gitignore한 파일인데 내용 자체는 배포 서버에선 쓸 일 없지만, 해당 이름이 없어서 코드 단에서 에러가 난 거 같다. 빈 파일로 넣어주자.
기나긴 로그 (토글 속)
◦
해결) 아래 코드 추가
# 환경 변수 설정
- name: Set environment values
run: |
cd ./src/main/resources
touch ./env.properties
echo "${{ secrets.ENV }}" > ./env.properties
touch ./beach-combine-3770712535c0.json # 추가해줌
echo "${{ secrets.BEACHCOMBINE }}" > ./beach-combine-3770712535c0.json # 추가해줌
shell: bash
YAML
복사
▪
에러) 후.. 또 끝이 아니었다. 아직 같은 에러가 뜬다. 로그를 다시 띄어보자.
로그 → 결국 같은 말이다.
•
로그 핵심
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.gcp.autoconfigure.storage.GcpStorageAutoConfiguration$$EnhancerBySpringCGLIB$$8f954006]: Constructor threw exception; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('t' (code 116)): was expecting double-quote to start field name
YAML
복사
•
해결) touch ./beach-combine-3770712535c0.json 에 오타가 있었따. 바로,, touch ./beach-combine-3770712535c0.json.properties라고 써버린 것,,,(복붙하다 실수한 거 같다,,,) 끝에 properties를 지워져서 해결했다!
•
에러) 또 다시 끝이 아니었다,,,,
에러 로그
◦
원인
▪
휴,,, 이 문제로 하루 종일 생각을 하다 3월 17일 드디어 이유를 발견했다!!!!!!!!!!!!!!! 바로!! github actions secret에 json이 제대로 들어가지 않고 있었단 점!
•
진짜 로컬에서 만든 이미지는 잘 동작하고, github action으로 만든 이미지는 잘 동작하지 않기에 도대체 이유가 뭘지 한참 고민했다,,,,
•
심지어 github action 동작은 초록불이 떴기에 어디가 에러인지 힌트도 받을 수 없었다.
•
github action에서 받은 이미지를 직접 실행해봤을 때 위에 에러 로그가 떠서 google cloud stoarge와 관련한 문제라는 점을 떠올렸고, 로컬에서 만든 이미지와 github action으로 만든 이미지의 차이는 환경변수들뿐이기에 google cloud storage와 관련한 환경변수를 살펴봤다.
•
전부 제대로 들어가고 있었기에 문제가 뭘지 한참 더 고민하다 관점을 바꿔 떠오른 것이 바로 json 파일이라 그런가…? 라는 의문이엇고
•
ChatGPT는 여기에 대해 계속 두루뭉술한 답만 줬어서 결국 사람이 직접 생각을 통해 찾아야 하는 에러도 많단걸 뼈저리게 느꼈다,,,
•
결론은 github actiosn secret에 json 파일 내용을 넣으면 json 파일의 큰따옴표가 다 사라지게 된다 한다. 그래서, gcp에서 json파일 내용을 필요로 하는데, 제대로 읽어지지 않았던 것이다…
•
사실 원칙적으론 github actions에는 json을 secret에 저장하지 말라고한다.
•
◦
참고한 코드
- name: create-json
id: create-json
uses: jsdaniell/create-json@v1.2.2
with:
name: "credentials.json"
json: ${{ secrets.CREDENTIALS_JSON }}
dir: 'src/'
Java
복사
◦
내 코드
# 환경 변수 설정
- name: Set environment values 1
run: |
cd ./src/main/resources
touch ./env.properties
echo "${{ secrets.ENV }}" > ./env.properties
shell: bash
# 환경 변수 설정 (JSON)
- name: create-json
id: create-json
uses: jsdaniell/create-json@v1.2.2
with:
name: "beach-combine-3770712535c0.json"
json: ${{ secrets.BEACHCOMBINE }}
dir: 'src/main/resources/'
Java
복사
•
다만, 하지 말라는 걸 꾸역꾸역 해서 json 파일 만드는 게 맞나 싶긴 했다.
•
다음에 시간이 날 때, gcp에서 key로 json파일 말고 다른 방식으로 받는 법을 찾아봐야겠다.
•
추가 : 키 만료
원인) 이걸로 인해 딱히 문제가 발생하진 않는데, gcp를 쭉 둘러보다 키가 만료된 걸 발견했다.
◦
해결) 키 생성하는 법은 이전에 내가 써둔 포스팅을 참고했다! 포스팅으로 정리해둔 과거의 나 칭찬해,,