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
FROM openjdk:17
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

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

여기서 사용하는 변수 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 에 작성하면 됨.

위 사진처럼 나오면 성공!
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의 워크플로우 작업을 받아 처리할 준비가 됩니다.
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이 정상적으로 동작하는것을 볼 수 있다.
sudo docker ps

sudo docker logs spring-cicd-test

도커 80번 포트에서 Spring 8080포트로 연결하고있다. 따라서 ec2 인바운드 규칙에서 80포트 열어줘야한다.
url : publicIp:8080 이 아닌
publicIp:80 으로 들어가야한다.
Docker가 80포트에서 java 8080포트로 연결하고 있기때문에.