우선 기존에 진행중인 프로젝트가 build가 제대로 되지 않는 오류가 발생해, 임의로 repository를 하나 만들었습니다.
간단하게 spring을 사용해 hello,world를 출력하는 프로그램을 만들었고, 버전과 기본 세팅을 진행했습니다.
작성한 yml 파일
# 워크플로우의 이름을 정의합니다.
name: Java CI/CD with Gradle
# 이 워크플로우가 언제 실행될지를 정의합니다.
on:
# main 브랜치에 대한 push 이벤트가 발생할 때 워크플로우를 실행합니다.
push:
branches: [ main ]
# main 브랜치에 대한 pull request 이벤트가 발생할 때 워크플로우를 실행합니다.
pull_request:
branches: [ main ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# gradle wrapper 파일에 실행 권한을 부여
# gradle wrapper = 개발자가 특정 버전의 Gradle을 미리 설치하지 않고도 Gradle 빌드를 실행할 수 있게 해주는 편리한 도구
- name: Grant execute permission for gradlew
run: chmod +x gradlew
shell: bash
# Gradle을 사용하여 프로젝트의 테스트를 실행합니다.
- name: Test with Gradle
run: ./gradlew test
# Gradle을 사용하여 프로젝트를 빌드합니다. 이 과정에서 실행 가능한 JAR 파일이 생성됩니다.
- name: Build with Gradle
run: ./gradlew build
빌드가 성공적으로 잘 되나 확인을 해봅시다
우선, gitbash를 이용해 프로젝트 파일로 이동합시다.
이후에, build로 이동
일반적으로 Gradle 빌드 과정에서 생성되는 JAR 파일은 build/libs 디렉토리 내에 위치합니다.
libs 디랙토리 내용 확인
확인 결과, 파일은 잘 생성되었지만, 2개의 파일이 생성되네요. plain.jar가 뭔지 구글링을 해봅시다.
plain.jar이란?
나중에 java -jar 명령어 쓸 때, 이 부분에서 에러가 날 수 있다고 해서, 일찍 설정을 해둡시다
build.gradle에
이렇게 설정을 해두면 괜찮다고 하네요
빌드는 성공적으로 되었고,
이제 도커파일을 빌드시켜서 이미지를 생성한 후,
도커 이미지를 도커허브에 업로드하는 과정을 진행해보겠습니다.
우선, dockerhub에 접속해 계정 가입을 진행합니다.
에러 발생.
좀 해맸는데, 결론적으로 말하자면 아이디랑 비밀번호 같이 입력하니까 로그인 됐음
$ docker build -t [사용자이름]/[이미지이름] . 입력
저 뒤에"." 도 공백 하나 입력하고 적어줘야 함
이미지 파일이 만들어진 것을 확인할 수 있다!
이후에
$ docker push [사용자이름]/[이미지이름] 을 해서
push를 해줍시다. 저 같은 경우에는 window를 사용하기에
dockerhub에 들어가서 직접 repository가 생성되었는지 확인했습니다.
Dockerhub에는 성공적으로 jar 파일이 올라갔으니, 이제 EC2에서 해당 이미지를 다운받고 실행 시킵시다.
이 작업을 자동으로 해주는게 github action입니다.
yml 파일에 정보를 추가해봅시다.
- name: docker image build
run: docker build -t eolluga/eolluga-test .
- name: docker login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
# Docker Hub push (4)
- name: docker Hub push
run: docker push eolluga/eolluga-test
이렇게 작성을 해주었습니다.
이제 secret 설정을 github에서 해줍시다.
시크릿 설정 후, CI는 완성했으니, dockerhub의 파일을
ec2에서 가져오는 코드를 작성해야겠지요.
우선 ec2.pem폴더로 접속합시다
$ ssh -i [pem이름].pem ec2-user@[pem ip주소]
접속을 했으면, ec2에 docker를 설치해줍시다
sudo yum update -y
sudo yum install docker -y
sudo service docker start
sudo usermod -a -G docker ec2-user
이제 docker에서 pull을 땡겨옵시다.
$ docker pull [사용자이름]/[이미지이름]
-> 사용자이름과 이미지이름은 docker repository에 설정한 그것들을 의미합니당
에러가 나네요,,, 권한이 없다고 하는데, 구글링 해보니까 코드 앞에 sudo 붙이면 해결됩니다
$ sudo docker pull [사용자이름]/[이미지이름]
풀 땡겨졌다면
$ sudo docker run -d -p 80:8080 [사용자이름]/[이미지이름]을 합시다
엄청 긴 영어와 숫자가 섞여져 나온다면 성공입니다
ex) :baqe5ca1f2c8efa424fac5~~~
이후에
$sudo docker ps를 통해서 실행중인 컨테이너를 확인할 수가 있습니다
여기서 port에 우리가 설정한 [사용자이름]/[이미지이름] 나오면 성공!
이제 pem ip 주소로 들어가봅시다
성공!
이제 마지막으로 git action에 코드를 추가해줍시다
deploy:
needs: build-and-push # 이 작업은 'build-and-push' 작업이 완료된 후 실행됩니다.
runs-on: ubuntu-latest # 이 작업은 최신 Ubuntu 러너에서 실행됩니다.
steps:
- name: Deploy to EC2 # EC2로 배포하는 단계의 이름입니다.
uses: appleboy/ssh-action@master # appleboy의 SSH 액션을 사용합니다. 이 액션을 통해 SSH 연결을 수행합니다.
with:
host: ${{ secrets.EC2_HOST }} # GitHub Secrets에서 EC2 인스턴스의 호스트 주소를 가져옵니다.
username: ec2-user # EC2 인스턴스에 접속할 사용자 이름입니다. 기본적으로 'ec2-user'로 설정됩니다.
key: ${{ secrets.EC2_SSH_KEY }} # EC2 인스턴스에 접속하기 위한 SSH 키입니다. 이 키도 GitHub Secrets에서 관리됩니다.
script: | # EC2 인스턴스에서 실행할 스크립트입니다.
docker pull eolluga/eolluga-test
docker stop myapp || true
docker rm myapp || true
docker run -d --name myapp -p 80:8080 [사용자이름]/[이미지이름]
# Docker Hub push (4)
- name: docker Hub push
run: docker push [사용자이름]/[이미지이름]
빌드 결과는?
성공!
이후 간단하게 프로젝트 바꿔서
push하고 pr 날려서 merge했더니 자동으로 배포가 되었당