🖥️ 컴퓨터 공부/인프라

도커와 깃헙액션을 이용해 CI/CD 구축하기

le2donguk 2025. 8. 25. 18:27

소개

그냥 빌드해서 배포 하기에는 배포한것 같지 않고… 그래서 CI/CD 할려니깐 시중에 나와 있는 정보는 SpringBoot 자료고.. 그래서 혼자 공부하고 트러블 슈팅한거 정리해봤습니다! 😁

가장 간단하게 (보안 ,테스트 신경 안씀) CI/CD 를 구축 해봤습니다 도움이 됐으면 좋겠습니다

마지막으로 저는 개인적으로 공부할때 왜 이 기술이 나왔는지 배경을 알아보고 장단점을 따지는걸 좋아해서 그런 형식으로 좀 정리 해봤습니다!

그냥 모르겠고 CI/CD 만 구축하고 싶다 그러면 원리 이런거 다 스킵하셔도 됩니다!

 

준비물

  1. AWS 회원가입
  2. Docker DeskTop 설치
  3. Docker Hub 회원가입

원리

1. Local 에서 Tomcat으로 배포한 원리

Spring MVC는 빌드를 하게 되면 build/libs 밑에 war 파일이 만들어 집니다! 실제로 확인해 보기 위해서 터미널에 ./gradlew clean build 를 해서 빌드를 해보면! 빌드의 결과물인 **war 아카이브 파일**이 build/libs 밑에 생깁니다!

이 **war 파일**을 Tomcat의 톰켓의 C:\\apache-tomcat-9.0.107\\webapps 에 넣어야지 그때서야 비로소 local에서 배포가 되는 것 입니다! 즉 Tomcat은 WAS 입니다!

우리가 그 동안 인텔리제이에서 “딸깍” 으로 **Tomcat**을 돌리면

실제는 빌드를 해서 **war**를 만들고 → 그 **war**를 톰켓의 C:\\apache-tomcat-9.0.107\\webapps (톰켓이 다운 받아진곳) 에 넣고 → 그 war 를 바탕으로 톰켓을 실행 시킨것입니다!

원래는 우리가 빌드하고 이걸 저기에 넣고 톰켓을 실행 시켜야 하는걸 인텔리제이가 알아서 해주고 있었던 것.. (고맙…ㅠㅠ)

 

2. AWS EC2 등장!

우리가 매번 컴퓨터를 킨 상태로 있을 수도 없고..또 우리 컴퓨터는 방화벽도 엄청 많기 때문에 내 마음대로 방화벽 규칙을 설정 할 수 있고 , 또 항상 켜둘 수 있는 컴퓨터가 필요 했어서 나온게!!!

AWS 에서 EC2 입니다

음..혹시 VirtualMachine 쓰신 분 있을줄은 모르겠는데 EC2도 그냥 하나의 컴퓨터 라고 생각하면 편합니다! 그래서 그냥 아마존에서 나한테 내 마음대로 할 수 있는 컴퓨터 하나 줬다! 이렇게 생각하면 됩니다!

 

3.그래서 배포가 뭔데..?

종합하면 내가 원하는 사람만 들어 올 수 있게 만들어 져있고 , 또 항상 24시간 틀어져 있는 컴퓨터에 (EC2) 내가 만든 서버가 계속 동작하게 하는것! 그게 배포 라구 저는 생각합니다!

 

4. EC2..여기에 걍 프로그램 돌리면 되는거야?

우리가 EC2에 서버를 띄울때 사실 고려해야 할 부분들이 너무너무 많아요..EC2는 그냥 아무것도 없는 계산기 같은 컴퓨터 이거든요..!!

만약에 우리가 Vue를 서버에 띄울려면 Vue를 다운 받기 이전에 했던 개발 환경 혹시 기억나시나요..?

Nodejs부터 설치해야하고..npm init , install 하고 npm build 해서 build 파일만들고.. 그걸 배포툴인 Vercel 이나 NGINX 로 돌려야하고..이 와중에 내가 설치한 것들이 버전의 호환성이 맞아야하구...하..

또 다른 예시로 스프링이라고 치면 스프링 깔기전에 **jdk를 설치**해야하고, gradle 로 빌드 한 결과물에 맞춰 **SpringBoot**면 jar 아카이브가 만들어저 java -jar 실행 해야하고

우리가 쓰는SpringMVC는 내장 Tomcat 이 없어서 그 Tomcat과 jdk 버전은 호환이 되는지.. 윈도우는 CRLF 쓰는데 MAC은 LF 를 사용하는데 그건 어떻게 해야하는지.. 너무너무 신경 쓸게 많습니다..

 

5.Docker의 등장

우리가 금붕어를 키우고 싶으면 어항에 신경써줘야 할게 많잖아요 잘은 모르는데 물온도,산소 뭐 이런것들

그런데 마침 마트에 갔는데 그런 조건을 가진 어항을 그냥 통째로 팔고 있는거에요 원래는 내가 준비물 하나하나 다 준비해야하는데 그냥 저 어항만 가져와서 집에 두고 금붕어만 풀어두면 금붕어가 잘 살 수 있는 그런 어항!!

그래서! 도커가 등장했습니다 😁

Container,Image ,Compose 이런 개념은 싹다 빼고! 그냥 우리 스프링이 금붕어 인데 그런 금붕어를 키우기 위해서 돌아갈 환경을 우리 마음대로 만들 수 있고 이렇게 만들어진 어항을 다음에도 재료부터 다시 모으는게 아니라 그냥 통째로 들고 다닐 수 있다! 이런 느낌입니다!

 

이제 진짜 배포 해보자

1. EC2만들기

AWS 로그인해서 들어와서 EC2 에들어가면

 

위 그림과 같아요 저기서 무조건 지역은 서울로 하고 인스턴스를 하나 만들어 봐요! ( EC2 1개 = 인스턴스 1개) 이렇게 생각하시면 됩니다

**인스턴스 시작**을 클릭하게 되면 다음과 같은 화면이 보일것입니다!

 

 

이름 → 만들어지게 되는 인스턴스의 이름 ****입니다

OS이미지 →저는 지금 까지는 **Ubuntu**를 많이 썼는데 블로그를 보니 AmazonLinux 를 추천하길래

이번에는 **AmazonLinux**를 썼습니다

Amazon Machine Image → 저건 그냥 지금 설치할 OS 의 버전 고르는건데 그냥 건들지 맙시다!

 

 

아키텍처 → 건들 ㄴㄴ

인스턴스 유형 → 우리가 빌릴 컴퓨터 사양 설정하는건데 **프리티어(공짜)**에 있는거 아무거나 쓰세요! 잘 모르면 t3.micro 고고!

키 페어 → 우리가 이 컴퓨터에 원격으로 접속해서 이런 저런 작업 할건데 그때 컴퓨터에 접속할때 사용할 컴퓨터 비밀번호입니다 새 키페어 생성 누르면

 

이 화면이 보이는데 이름 설정해주고 아래 주황색 버튼 키페어 생성 눌러줍니다!

그러면 뭔가 자동으로 다운 받아질 거에요!! 그거 꼭 가지고 있어야 합니다

 

그후 밑으로 내려와서

이 네트워크 설정 부분에서 편집 을 클릭해주세요!

 

이제 네트워크 설정 할건데 포트를 어떻게 설정할지 어떤 IP를 받을지 인바운드..? 아웃바운드..? 다 모르겠다!! 하면 그냥 제가 한대로 보안 신경 쓰지 않고 따라 하시면 됩니다!

 

보안 그룹 규칙 추가

2번 클릭해서 2개를 추가합시다!!

 

그리고 각 보안 그룹의 규칙을 저와 똑같이 해주세요!

이렇게 그냥 아무나 다 받겠다!! 이런 소리입니다 빨간 거 칠해진것에 유의해서 만들어주세요!

 

그리고 조금 내려와서 스토리지 구성!

서버의 용량을 결정한다고 생각하시면 되요! 프리티어는 30까지 무료라서 최대로 땡겨 써요!!

 

이제 오른쪽을 보시면

이 화면 에서 인스턴스 시작!!!!

 

그러면 아까 대시보드 화면으로 가시면 화면에 보는것 과 같이 인스턴스 상태가 실행중 이라고 뜨면서 인스턴스가 만들어 졌습니다!! 이제 저 파란색 글씨 (인스턴스 ID) 를 클릭해 주세요!

 

그후 거기 안에서 오른쪽 상단에작업을 눌러주세요!

작업 → 인스턴스 설정 → 크레딧 사양변경 을 클릭해주세요

 

클릭을 하면 아래와 같은 화면이 나옵니다!!

여기 무제한 모드 해제를 해줘야 혹시라도 나중에 돈이 안나가요!

이러면 EC2 만들기 끝!!!!

 

 

이제 만들어진 EC2에 접속을 해보겠습니다!!

어떻게 접속할까..요?? 뭐 우리 컴퓨터에서 SSH 로 접속해도 되지만 그냥 간단하게

연결 클릭! → 그리고 오른쪽 하단에 연결 클릭!

 

아래 사진과 같이 뜨면!!

연결 성공!

 

2. EC2에 도커 다운로드

이제! 이 환경에서 **Docker**를 설치 하겠습니다

그냥 이 코드 복붙해서 입력 하시면 됩니다!

sudo yum update -y
sudo amazon-linux-extras enable docker
sudo yum install -y docker
sudo service docker start
sudo usermod -aG docker ec2-user

mkdir -p ~/.docker/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.27.1/docker-compose-linux-x86_64 \
  -o ~/.docker/cli-plugins/docker-compose
chmod +x ~/.docker/cli-plugins/docker-compose

 

이후 잘 설치됐나 확인 해보기 위해서

docker —version , docker compose version 치고 다음과 같이 뜨면 Docker 설치 완료!

(사진 스티커 붙이기 귀찮아서 그냥 ip 보여드리겠습니다! 어차피 ip 바꿀 예정입니다!)

 

이후 다음 명령어를 통해 디렉토리를 만들어주세요

mkdir zibi

 

잘 만들어 졌나 확인 할려면 ls 눌러 잘 만들어 졌나 확인해 보세요!

이후 만들어진 디렉토리로 이동할것 입니다 아래 명령어를 사용해서요!

cd zibi

 

 

여기까지 해놓고!! x 눌러 창을 닫지 마시고!! DockerHub에 접속해 줍시다!

3. EC2에 도커 허브에서 레포지토리 만들기

DockerHub에서 회원가입 하신 다음에

 

 

레퍼지토리를 하나 만들어주세요!

자신이 원하는거 아무렇게나 만들어주세요 !!!

 

이후 만들어진 레포지토리 가보면!!

라이언 모양에 볼드 처리 된 거 있을텐데 그거 기억해주세요!!!

이러면 레포지토리 만들기 끝!

 

3. EC2에 Compose 파일 만들기

이제 다시 서버로 돌아와서

vi 편집기를 사용하여 compose.yml 을 만들겠습니다

터미널에 vi compose.yml 입력후 거기서

services:
	서비스이름:
		image: 도커허브에서 봤던 볼드체 입력 / 포함해서
		ports: 
			- "80:8080"

간단하게 이렇게만 만들어 줍시다!

 

4. Dockerfile 만들기

이제 각자 팀의 프로젝트 파일에 가서 루트 경로

Dockerfile 을 만들어주시고

 

그 안에 이렇게 적어주세요

FROM tomcat:9.0.107-jdk17-temurin

COPY build/libs/*SNAPSHOT.war /usr/local/tomcat/webapps/ROOT.war

EXPOSE 8080

 

 

이러면 도커 파일 만들기도 끝!

 

4. GithubAction으로 CI/CD 파이프 라인 구축하기

이제 github action 으로 ci/cd 파이프라인 구축해봐요!

.github 밑에 workflows 밑에 deploy.yml 을 만들어 줍니다!!

(workflows 가 없을 수 도 있는데 그냥 만들어 주면 됩니다!)

 

그 다음 GitHub 레포에 들어가 주세요!

 

거기서 Settings 클릭!

 

 

왼쪽 side bar 에 Secrets and variables 밑에 Actions 클릭!

잠깐!! 혹시 보안 때문에 git ignore 에 등록해서 안올리는 파일 있으신가요?

 

EMAIL_PROPERTIES는 무시하시고(안만들어도됩니다) 총 6개 를 만들어야해요! 위에 **New repository secret**를 통해서요!

각각 어떤 값을 넣어주냐면

  • APPLICATION_PROPERTIES:  프로젝트에 application.properties 값 전체
  • DOCKERHUB_PASSWORD: 도커허브 비밀번호
  • DOCKERHUB_USERNAME:  도커허브 ID
  • EC2_HOST:  PUBLIC IP 주소를 넣어주면 됩니다!
  • EC2_PRIVATE_KEY:  아까 EC2만든 KEY Pair 있죠?!?!(다운받아진거) 그거 vscode로 열어서 전부 복붙해주세요
    ===== 이거 다포함해서요!
  • EC2_USERNAME: AmazonLinux 면 ec2-user Ubuntu면 ubuntu 일꺼에요!!

 

혹시 DockerHub에 로그인 할때 OAuth 로 로그인 했으면 AccessToken을 만들어 주고 그걸 DOCKERHUB_PASSWORD 에 넣어줘야합니다

 

그후 다시 인텔리제이로 가서 **deploy.yml**로 가주세요!!

거기에 아래 코드 따라 쳐주세요!! 중간 중간에 사용자에 맞춰서 바꿔야하는 부분은 표시해 뒀습니다!

사용자에 맞춰 아래 코드를 입력해주세요!

name: deploy.yml
on:
  push:
    branches: ["main"]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: 📢 깃허브 checkout
        uses: actions/checkout@v3

      - name: 📢 GitHubAction JDK 17 설치
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: 📢 Gradle 실행 권한 부여
        run: chmod +x gradlew

      - name: 📢 Gradle 캐싱
        uses: actions/cache@v3
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
          restore-keys: |
            ${{ runner.os }}-gradle-
-------------------------------이 부분은 gitignore을 쓰시는 분들만 해당 안쓰시면 안해도 됩니다----------------------------------
      - name: 📢 GitIgnore 파일들 넣어주기
        env:
          APPLICATION_PROPERTIES: ${{ secrets.APPLICATION_PROPERTIES}}
          EMAIL_PROPERTIES: ${{secrets.EMAIL_PROPERTIES}}
        run: |
          rm -f src/main/resources/application.properties
          rm -f src/main/resources/email.properties
          echo "${{ secrets.APPLICATION_PROPERTIES }}" > src/main/resources/application.properties
          echo "${{ secrets.EMAIL_PROPERTIES }}" > src/main/resources/email.properties
----------------------------------------------------------------------------------------------------          

      - name: 📢 Gradle 빌드(war 만들기)
        run: ./gradlew clean build

      - name: 📢 Docker image 만들기
        run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/[도커허브 레포 이름] .

      - name: 📢 DockerHub에 로그인
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME}}
          password: ${{ secrets.DOCKERHUB_PASSWORD}}

      - name: 📢 DockerHub에 PUSH
        run: docker push ${{ secrets.DOCKERHUB_USERNAME}}/[도커허브 레포 이름]

  deploy:
    runs-on: ubuntu-latest
    needs: build
    if: github.event_name == 'push'
    steps:
      - name: 📢SSH로 EC2에 접속해보자
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.EC2_HOST}}
          username: ${{ secrets.EC2_USERNAME}}
          key: ${{ secrets.EC2_PRIVATE_KEY}}
          script: |
            echo "✅ EC2 연결 성공!"
            echo "✅ Docker를 실행 시키기 위해 compose.yml 파일로 고고띠"
            cd ~/[mkdir로 만든 디렉토리 이름]
            
            echo "✅ DockerHub 에서 이미지 가져오기(pull)"
            docker pull ${{ secrets.DOCKERHUB_USERNAME }}/[도커 허브 레포 이름]
            
            echo "✅ 이제 DockeCompose 돌리자!!"
            docker compose down
            docker compose up -d
            
            echo "✅ PortForwarding을 8080으로 했으니깐 Public IP의 8080포트로 가자 "
            echo "✅ 포트 번호 적기 싫으면 compose파일에서 80->8080 으로 포트포워딩 하면 됨!!"

 

이렇게 작성후 main 으로 commit 하시면 됩니다 그러면 자동으로 GitHubAction이 실행될거에요 !

 

잘되나 확인 하기 위해서 해당 레포에 Actions로 가줍시다!

 

 

이제 잘되나 확인해보면...?!?

 

로그를 보니 이유가 저는 window 환경에서 쓰고 있는데 githubaction은 ubuntu 라서 파일경로를 나타내는 구분자가 달라서 그런것입니다.. (mac이면 오류 안뜰것 같습니다..)(mac 사고싶다..)

 

오류를 고치기 위해서 아래의 명령어를 인텔리제이 터미널 창에서 실행해 주세요

./gradlew wrapper --gradle-version=8.0
git add gradlew gradlew.bat gradle/wrapper/
git commit -m "fix: regenerate gradle wrapper with correct format"
git push origin main

push까지 해줍시다!!! 그리고 다시 actions 가보면!!

 

초록불!!!!!!!  성공!!

 

 

그러면 잘 배포됬는지 확인해야겠죠?!?!

브라우저에 instance의 public ip 주소:8080 을 쳐주면!!

 

배.포.완.료!

 

이후에도 문제 없이 돌아가요!

 

 

'🖥️ 컴퓨터 공부 > 인프라' 카테고리의 다른 글

🐳 도커(Docker) 정리  (2) 2025.08.25