전체 보기
🔵

CICD 오작동 해결(secret에 json 추가)

작성일자
2023/03/16
태그
INFRA
프로젝트
BeachCombine
책 종류
1 more property

배포자동화 오작동 문제 해결 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 파일이라 그런가…? 라는 의문이엇고
바로 github actions secret json이란 키워드로 구글링을 하여 다른 사람도 이런 문제를 겪었단 걸 알게 되었다.
ChatGPT는 여기에 대해 계속 두루뭉술한 답만 줬어서 결국 사람이 직접 생각을 통해 찾아야 하는 에러도 많단걸 뼈저리게 느꼈다,,,
결론은 github actiosn secret에 json 파일 내용을 넣으면 json 파일의 큰따옴표가 다 사라지게 된다 한다. 그래서, gcp에서 json파일 내용을 필요로 하는데, 제대로 읽어지지 않았던 것이다…
사실 원칙적으론 github actions에는 json을 secret에 저장하지 말라고한다.
하지만, 라이브러리 (https://github.com/marketplace/actions/create-json) 이용해서 해결해줄 수 있기에 해결해주었다.
참고한 코드
- 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를 쭉 둘러보다 키가 만료된 걸 발견했다.
해결) 키 생성하는 법은 이전에 내가 써둔 포스팅을 참고했다! 포스팅으로 정리해둔 과거의 나 칭찬해,,