Spring CICD Docker를 통해서 구현

ramong2·2025년 3월 10일

Step 1. SpringProject 생성

1-1 생성 후 git초기화
1-2 원격저장소로 push

git init
git remote add git주소
git add .
git commit -m "message insert"
git push --set-upstream origin main

Step 2. dockerfile 생성

FROM openjdk:17
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

Step 3. Github workflow 만들기

3-1. configure 클릭.

content를 내가 사용할 방식으로 수정.
나는 아래 내용과 같이 작성함.

name: Java CI with Gradle

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read

    steps:
      - uses: actions/checkout@v4

      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew

      # Spring Boot 어플리케이션 Build
      - name: Build with Gradle Wrapper
        run: ./gradlew build

      # Docker 이미지 Build
      - name: docker image build
        run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/spring-cicd-test .

      # DockerHub Login (push 하기 위해)
      - name: docker login
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_PASSWORD }}

      # Docker hub 로 push
      - name: Docker Hub push
        run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/spring-cicd-test

  # 위 과정에서 푸시한 이미지를 ec2에서 풀받아서 실행
  run-docker-image-on-ec2:
    needs: build
    runs-on: self-hosted

    steps:
      - name: docker pull
        run: sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/spring-cicd-test

      - name: docker stop container
        run: |
          if [ $(sudo docker ps -a -q -f name=spring-cicd-test) ]; then
            sudo docker stop spring-cicd-test
          fi

      - name: docker run new container
        run: sudo docker run --rm -it -d -p 80:8080 --name spring-cicd-test ${{ secrets.DOCKERHUB_USERNAME }}/spring-cicd-test

      - name: delete old docker image
        run: sudo docker system prune -f

작성 후 commit changes클릭.
그러면 root에 /.github/workflows/gradle.yml 가 생긴걸 볼 수 있음.

➜  EX_CICD git:(main) tree
.
├── HELP.md
├── README.md
├── build
│   ├── classes
│   │   └── java
│   │       ├── main
│   │       │   └── com
│   │       │       └── example
│   │       │           └── ex_cicd
│   │       │               ├── ExCicdApplication.class
│   │       │               └── HelloController.class
│   │       └── test
│   ├── generated
│   │   └── sources
│   │       ├── annotationProcessor
│   │       │   └── java
│   │       │       └── main
│   │       └── headers
│   │           └── java
│   │               └── main
│   ├── reports
│   │   └── problems
│   │       └── problems-report.html
│   ├── resources
│   │   ├── main
│   │   │   ├── application.properties
│   │   │   ├── static
│   │   │   └── templates
│   │   └── test
│   └── tmp
│       └── compileJava
│           └── previous-compilation-data.bin
├── build.gradle
├── dockerfile
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── ex_cicd
    │   │               ├── ExCicdApplication.java
    │   │               └── HelloController.java
    │   └── resources
    │       ├── application.properties
    │       ├── static
    │       └── templates
    └── test
        └── java
            └── com
                └── example
                    └── ex_cicd
                        └── ExCicdApplicationTests.java

42 directories, 18 files

--------------- CI 완성 ---------------

step 4. github setting 설정

여기서 사용하는 변수 DOCKERHUB_USERNAME, DOCKERHUB_PASSWORD는 Step3에서 작성한 gradle.yml 파일의 변수로 사용된다.
PASSWORD는 dockerhub에서 token으로 작성하는것을 추천.

여기서 ec2에 똑같이 복붙을 해주면 된다.

mkdir actions-runner && cd actions-runner
curl -o actions-runner-linux-x64-2.322.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.322.0/actions-runner-linux-x64-2.322.0.tar.gz
echo "b13b784808359f31bc79b08a191f5f83757852957dd8fe3dbfcc38202ccf5768  actions-runner-linux-x64-2.322.0.tar.gz" | shasum -a 256 -c
tar xzf ./actions-runner-linux-x64-2.322.0.tar.gz
./config.sh --url https://github.com/KangJiSseok/EX_CICD --token AYWJVCG7JUY3DAQCN425PR3HZY5QE

아래 내용이 더 있지만 ./config.sh까지만 복붙해서 ec2 에 작성하면 됨.

위 사진처럼 나오면 성공!

step 5. ec2에서 github와 연결

sudo ./svc.sh install
sudo ./svc.sh start
  • sudo ./svc.sh install

    	이 명령어는 현재 디렉토리에 있는 svc.sh 스크립트를 실행하여, GitHub Actions Runner를 시스템 서비스(예: systemd 서비스)로 등록합니다.
    	즉, EC2 인스턴스나 서버가 부팅될 때 자동으로 Runner가 시작될 수 있도록 설정합니다.
  • sudo ./svc.sh start

    	등록된 Runner 서비스를 시작합니다.
    	이 명령어를 실행하면 GitHub Actions Runner가 백그라운드에서 실행되며, GitHub의 워크플로우 작업을 받아 처리할 준비가 됩니다.

step 6. ec2에서 docker 설치

gradle.yml파일에서

  # 위 과정에서 푸시한 이미지를 ec2에서 풀받아서 실행
  run-docker-image-on-ec2:
    needs: build
    runs-on: self-hosted

    steps:
      - name: docker pull
        run: sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/spring-cicd-test

      - name: docker stop container
        run: |
          if [ $(sudo docker ps -a -q -f name=spring-cicd-test) ]; then
            sudo docker stop spring-cicd-test
          fi

      - name: docker run new container
        run: sudo docker run --rm -it -d -p 80:8080 --name spring-cicd-test ${{ secrets.DOCKERHUB_USERNAME }}/spring-cicd-test

      - name: delete old docker image
        run: sudo docker system prune -f

이 코드는 ec2에서 실행된다. 따라서 ec2에서 docker를 설치해야 이미지를 pull받고 실행시킬 수 있음.

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update

sudo apt install docker-ce docker-ce-cli containerd.io

여기까지 작업을 했으면
main branch에 푸시 하나 해보면 gitAction이 정상적으로 동작하는것을 볼 수 있다.

step 7. ec2에서 동작하고있는지 확인.

sudo docker ps

sudo docker logs spring-cicd-test

중요 !

도커 80번 포트에서 Spring 8080포트로 연결하고있다. 따라서 ec2 인바운드 규칙에서 80포트 열어줘야한다.

url : publicIp:8080 이 아닌
publicIp:80 으로 들어가야한다.
Docker가 80포트에서 java 8080포트로 연결하고 있기때문에.

0개의 댓글