서비스를 개발하고 배포하는 과정에서 반복적인 수동 작업은 늘 귀찮고 번거롭다. 특히 프로젝트 규모가 커지고 배포 주기가 잦아질수록 이런 작업은 생산성 저하를 불러온다. 최근 팀 프로젝트에서 GitHub Actions를 이용한 CI/CD 자동화를 경험하며 느낀 점들과 그 과정에서 사용했던 설정 코드 일부를 정리해보려 한다.
⚙️ CI/CD 자동화, 왜 필요했을까?
개발 초기에는 배포가 큰 부담이 아니었지만, 서비스 규모가 점점 커지면서 배포 과정에서 실수가 생기기도 하고 시간이 너무 많이 소요되었다. 이를 개선하기 위해 배포 과정을 자동화할 필요성이 커졌다.
❗ 겪었던 문제들
수동 배포의 번거로움: 한 번의 배포에도 여러 작업이 필요했기 때문에 실수할 가능성이 높았다.
빠른 피드백 부족: 배포가 늦어지면 개발자들이 신속한 피드백을 얻기 어려워졌다.
🚀 GitHub Actions로 자동화를 해보니
이번 프로젝트에서 구축한 CI/CD 파이프라인은 크게 아래 과정으로 구성되었다.
- Gradle을 이용한 JAR 빌드
- Docker 이미지를 빌드하고 Docker Hub로 푸시
- AWS EC2 서버에서 Docker 이미지를 Pull하여 컨테이너 실행
📝 구현 과정에서 기억에 남는 것들
🔐 환경변수 관리의 중요성
처음에는 환경 변수를 제대로 관리하지 않아 어려움이 있었다. GitHub Secrets를 통해 민감한 정보를 잘 보호하면서도 편리하게 관리하는 방법을 깨닫게 되었다.

- name: application-secret.yml 구성 run: | cd ./src/main/resources echo "${{ secrets.APPLICATION_SECRET }}" > ./application-secret.yml
📚 문서화와의 통합
문서를 asciidoc 형태로 관리하고, 자동으로 정적 문서 사이트에 배포하는 방식도 함께 구성했는데, 팀원들과의 공유가 한결 쉬워졌다.
- name: 문서(asciidoc) 빌드 run: | ./gradlew asciidoctor mkdir -p src/main/resources/static/docs cp -r build/docs/asciidoc/* src/main/resources/static/docs/
🤖 반복적 작업의 자동화
이제는 main 브랜치에 코드만 푸시하면 자동으로 빌드와 배포가 이루어진다. 이 과정에서 수작업으로 인해 발생했던 스트레스가 상당히 줄었다.
- name: Docker 이미지 빌드 및 푸시 run: | docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} docker build --platform linux/arm64/v8 -t app . docker tag app ${{ secrets.DOCKER_USERNAME }}/${{ env.APP_NAME }}:latest docker push ${{ secrets.DOCKER_USERNAME }}/${{ env.APP_NAME }}:latest
🔮 앞으로 개선하고 싶은 점
아직 완벽하지는 않다. 컨테이너 관리나 이미지 버전 관리 부분에서 더 세련된 방법을 찾고 싶고, 모니터링이나 알림 시스템과의 연동도 보완하고 싶다. 지금 당장은 완벽하지 않지만, 이 경험이 앞으로의 프로젝트에서 더 나은 방법을 찾는 밑거름이 될 것이다.
자동화를 구축하는 과정에서 시행착오도 있었지만, 결과적으로 팀의 생산성과 협업 방식이 크게 향상되었다. GitHub Actions를 이용한 CI/CD는 팀의 개발 문화 자체를 긍정적으로 바꿨다고 생각한다.