[Tistory] [Monetization System] GithubAction CI/CD – EC2 배포

원글 페이지 : 바로가기

GitHubAction CI/CD를 통해서 EC2 Instance에 배포하는 방법입니다. 1. Flow 1. Intellij를 통해 Local환경에서 개발한 Spring boot application을 GitHub에 push 합니다. 2. GitHub Action을 통해 해당 application을 docker image로 build 한 뒤에 docker hub에 push 합니다. 3. EC2에서 dockerhub의 image를 pull받은뒤에 기존에 있던 mysql image와 같이 docker compose로 배포합니다. 2. Docker Hub Repository 만들기 해당 사이트에 접속하여 로그인을 해줍니다 https://hub.docker.com/ Docker Hub Container Image Library | App Containerization Increase your reach and adoption on Docker Hub With a Docker Verified Publisher subscription, you’ll increase trust, boost discoverability, get exclusive data insights, and much more. hub.docker.com Repositories로 이동 후 Create repository버튼을 클릭 Repository Name 항목에 이름을 작성하고 Repository유형을 선택합니다 Private Repository를 1개만 만들 수 있습니다. (현재 생성한 상태) 3. AWS EC2 생성 Spring boot application image를 pull 받은 뒤 docker compose를 통해 구동시킬 EC2를 생성합니다. AWS에 Console에 로그인 한뒤 EC2를 검색해 줍니다. 대시보드에서 인스턴스 시작을 눌러줍니다. 해당 인스턴스에 이름을 지정합니다. 해당 instance에 OS를 선택합니다. 인스턴스 유형을 선택합니다. (프리티어 유형의 인스턴스로 시도할 경우 메모리가 너무 작아서 docker compose 구동에 문제가 있을 수 있습니다.) 해당 인스턴스에 접속하기 위한 키페어를 생성해 줍니다. (해당 키페어는 추후에 EC2에 접속하기 위해 필요하니 잘 보관해야 합니다!!) 네트워크 설정은 default로 둡니다. 스토리지를 구성합니다 인스턴스 시작을 눌러 인스턴스를 생성합니다. 약간의 시간이 지나고 실행 중 상태가 되면 해당 인스턴스에 접속합니다. 퍼블릭 IPv4가 현재 인스턴스의 주소입니다. 인스턴스의 보안 탭으로 이동합니다. 인바운드 규칙 편집으로 이동합니다 규칙 추가를 클릭 후 application이 사용할 port 번호를 적어줍니다. 4. EC2 접속 후 서버 세팅하기 EC2에 접속하는 방법은 여러 가지가 있지만 MobaXterm을 사용해 접속하는 방법에 대해 다루겠습니다. 새로운 연결을 만들기 위해 Session 버튼을 눌러 줍니다. SSH 버튼을 누른 뒤 인스턴스의 주소를 입력하고 생성했던 키 페어 파일을 넣어줍니다. 다음과 같이 login화면이 나오면 해당 OS에 맞는 기본 계정으로 접속해 줍니다. Ubuntu를 사용했기 때문에 Ubuntu로 접속 다음과 같은 화면이 나온다면 login 성공입니다. 이제 명령어를 통해서 EC2에 docker를 사용하기 위한 명령어를 입력해 줍니다. ### root와 기본 유저의 비밀번호 설정

$sudo passwd ubuntu
$sudo passwd root

### docker 설정관련 명령어

# docker engine gpg 키 등록
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# apt source 에 docker 관련 추가
echo \
“deb [arch=”$(dpkg –print-architecture)” signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
“$(. /etc/os-release && echo “$VERSION_CODENAME”)” stable” | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

# docker engine 설치
sudo apt-get install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin docker-compose

# docker 그룹에 현재 계정을 등록하여 sudo 없이 docker 명령을 사용하게 함
sudo usermod -aG docker user
sudo service docker restart

# 새로운 터미널을 열고 확인
docker version Spring application과 같이 올릴 MySQL image를 받아주고 docker-compose.yml을작성해 줍니다. ## mysql image 다운

$ docker pull mysql

## docker-compose.yml 작성

services:
db:
image: mysql:latest
container_name: mysql
restart: always
ports:
– “[hostport]:[containerport]”
environment:
MYSQL_DATABASE: mydb
MYSQL_ROOT_PASSWORD: [root 비밀번호]
MYSQL_USER: [유저 명]
MYSQL_PASSWORD: [유저 패스워드]
volumes:
– my_volume:/var/lib/mysql

application:
image: [docker hub에서 pull받은 image]
container_name: spring-application
restart: on-failure
ports:
– “[hostport]:[containerport]”
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:[mysql port번호]/mydb
SPRING_DATASOURCE_USERNAME: [유저 명]
SPRING_DATASOURCE_PASSWORD: [유저 패스워드]
depends_on:
– db

volumes:
my_volume: 4. GitHub Action GitHub Repository를 만든 후에 다음 버튼으로 GitHub Action으로 이동합니다. 해당 Repository로 push 하게 되면 적절한 기본 템플릿이 제공됩니다. Github actions Secrets 민감 정보들을 Key-Value형태로 저장하여 Github Action에서 사용할 수 있습니다. GitHub Action 파이프 라인 구축 name: Java CI with Gradle # workflow의 이름 (자동화된 전체 프로세스를 의미함)

on: # 어떤 조건에서 workflow를 실행할지 지정
push: # main branch에 push 될때 마다 실행
branches: [ “main” ]

jobs: # 실제로 수행할 job들을 나열
build:
runs-on: ubuntu-latest # CI 서버 runner의 OS를 지정합니다

steps: # 해당 job의 step을 지정
– name: checkout # step의 이름을 지정
uses: actions/checkout@v4 # uses는 이미 만들어둔 것을 가져다 쓴다는 의미
# checkout – runner로 github repo의 코드를 옮긴다
– name: Set up JDK 21
uses: actions/setup-java@v4 # runner에 java 설치
with: # with는 parameter전달이라고 생각하면 된다.
java-version: ’21’
distribution: ‘temurin’

– name: Setup MYSQL
uses: mirromutth/mysql-action@v1.1
with:
mysql root password: ${{secrets.DB_PW}}
mysql databese: ‘mydb’

– name: Application.properties # .gitignore에 application.properties가 없기 때문에
run: | # Repository secrets에 작성한 뒤 복사한다.
cd src/main
mkdir resources
cd resources
touch application.properties
echo “${{ secrets.DATA_SOURCE }}”>> application.properties
shell: bash

– name: Build with Gradle Wrapper # application을 gradle로 build함
run: |
chmod +x gradlew
./gradlew build

# docker hub에 login한 후 image를 build한 뒤 docker hub에 push
– name: Docker image build and dockerhub push
run: |
docker build -t ${{ secrets.DOCKER_REPO }}:spring .
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker push ${{ secrets.DOCKER_REPO }}:spring

# EC2에 접속한 뒤 docker hub에 push 한 image를 pull 받은 뒤
# docker compose 실행
– name: Ec2 docker-compose up
uses: appleboy/ssh-action@master
with:
host: ${{secrets.HOST}}
username: ubuntu
key: ${{secrets.KEYPAIR}}
script: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker compose down
docker rmi ${{ secrets.DOCKER_REPO }}:spring
docker pull ${{ secrets.DOCKER_REPO }}:spring
docker compose up -d
docker logout 5. 최종 확인 해당 파이프라인을 Github에 commit 한 뒤 정상적으로 통과하는지 확인합니다. EC2에 접속하여 정상적으로 컨테이너가 실행됐는지 확인합니다. 참조 : https://velog.io/@rmswjdtn/Spring-Docker-Github-Action-Spring-Boot-%EC%9E%90%EB%8F%99%EB%B0%B0%ED%8F%AC%ED%99%98%EA%B2%BD-%EB%A7%8C%EB%93%A4%EA%B8%B0 [CICD] Docker + Github Action + Spring Boot 자동배포환경 만들기 최근에 github action을 이용해서 spring boot서버의 자동배포환경을 구축했습니다. docker-compose와 nginx도 함께사용하니 비슷한 설정을 원하시는 분들께 도움이 될 것같네요👍 어렵고 성가신(?) 과정이 velog.io https://velog.io/@hanif/CICD-Github-Action%EC%9C%BC%EB%A1%9C-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0 [CI/CD] Github Action으로 CI/CD 파이프라인 구축하기 Github Action으로 CI/CD 파이프라인 구축하기 velog.io https://papababo.tistory.com/entry/EC2-Instance-%EC%9D%98-ssh-%EC%A0%91%EA%B7%BC%EC%8B%9C-OS%EB%B3%84-%EA%B8%B0%EB%B3%B8-username AWS EC2 Instance 의 ssh 접근시, OS별 기본 username https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/managing-users.html OS/Distro Official AMI ssh Username Legacy / Community / Other AMI ssh Usernames Amazon Linux ec2-user Ubuntu ubuntu root Debian admin root RHEL 6.4 and later ec2-user RHEL 6.3 a papababo.tistory.com

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다