서비스의 핵심 기능인 '지도 위 일기 이미지 첨부'를 위해 AWS S3 인프라를 연동했다.
AmazonS3Client를 활용한 멀티파트 파일 업로드 로직을 검토했다.application-secret.yml 설정과 K8s Secret 연동을 통해 실제 운영 환경에서도 안전하게 이미지를 저장할 수 있는 구조를 구축했다.

수동 빌드 방식에서 벗어나 코드 푸시 시 자동으로 이미지가 생성되는 CI(Continuous Integration) 환경을 구축했다.
Jenkinsfile을 직접 작성하여 Pipeline as Code(PaC)를 실천했다.${env.BUILD_NUMBER})를 이미지 태그로 사용하여 체계적인 버전 관리 환경을 조성했다.gusgh07)로 이미지 푸시를 자동화하는 데 성공했다.
GitOps 패턴을 적용하여 인프라 가시성과 배포 자동화를 달성했다.
k8s-manifests 레포지토리의 이미지 태그를 업데이트하면, ArgoCD가 이를 감지하여 K8s 클러스터에 자동 동기화(Sync)하는 메커니즘을 구현했다.(지금은 Sync를 직접눌러야하지만 설정변경가능)
오늘 발생한 주요 에러들과 그 해결 과정을 통해 쿠버네티스와 젠킨스의 심층적인 동작 원리를 파악했다.
| 에러 상황 | 원인 | 해결 방법 |
|---|---|---|
NoSuchMethodError: sshagent | Jenkins에 SSH Agent 플러그인 미설치 | withCredentials(sshUserPrivateKey)를 사용하는 기본 방식으로 스크립트를 수정했다. |
403 Forbidden (GitHub) | GitHub Token의 권한(Scope) 부족 | repo 권한이 부여된 PAT를 재발급하고 쓰기 권한을 확인했다. |
Invalid NodePort: 80 | K8s NodePort 허용 범위(30000-32767) 초과 | NodePort를 30080으로 수정하거나 LoadBalancer 타입을 검토했다. Ingress를 통해 외부접근시 80포트를 사용 가능하도록 하고, 내부적으로는 30080포트를 사용한다. |
ERR_CONNECTION_REFUSED | 프론트엔드 API 주소를 localhost:8080으로 하드코딩 | API 주소를 상대 경로(/api)로 변경하고 Nginx 프록시 설정을 적용했다. |
host not found in upstream | Nginx 설정의 백엔드 호스트명 불일치 | proxy_pass 주소를 K8s 서비스명(map-log-backend)으로 수정했다. |

위의 빨간네모안의 파일들에서 /api가 앞에 붙어 호출하여 문제가 발생됨. /api/api같은 식으로 말이다.

axios.js에서 유지보수를 위해 한번에 관리하기위해 기존의 /api를 제거하고 .env에서 한번에 관리하도록 했다. 
한 주간 Jenkins와 Argocd 학습을 통해 CI/CD 자동화를 경험해 볼 수 있었다. 이전에 들었을때는 막연하다고만 느껴졌는데 이제는 파이프라인 자동화를 통한 도커이미지업로드와 무중단배포를 경험해볼 수 있는 소중한 경험이었다. 이제는 DevOps에 한층 더 가까워진 것 같다. 현재 K8s와 Jenkins에 대해 완전히 이해하고 있지 않기에 좀 더 프로젝트를 견고화하며 학습해보고자 한다.
추가적으로 이번에 Gemini CLI와 Claude Code의 도움을 많이 받았는데, 이때 그저 ~해줘가 아닌, 결과물을 예상하고 어떤식으로 작업할지에 대해 미리 지정해준 후에 해당 부분에 모르는 부분이 있을 시 내가 알고 있는 것과 비교하며 학습해나가면 더 나은 개발자로 성장할 수 있을 것 같다. 또한 추후 다른 팀원과의 지식공유를 위한 Documentation도 철저히하자!

하루죙일 썼는데 중간에 기록이 사라졌나... 아무튼 다 내걸로 만들자!
씩씩하네요..