github action을 이용해 CI/CD를 구현 후 EC2에 배포하기[2]

이성우·2024년 1월 6일
0

Project

목록 보기
2/8

우선 기존에 진행중인 프로젝트가 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이란?

  • plain archieve 라고 하며, 어플리케이션 실행에 필요한 모든 의존성을 포함하지 않고, 소스코드의 클래스 파일과 리소스 파일만 포함함

나중에 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했더니 자동으로 배포가 되었당

profile
이성우

0개의 댓글