본문 바로가기

AWS

[Cloud] Spring Boot & Docker EC2 & Git Ation (CI/CD) - 2탄

 

 

수동 Docker 배포

 

gradle 빌드 명령어 → jar 파일 생성

# 해당 폴더로 이동
cd {gradlew가 있는 폴더} 

# gradlew 실행
./gradlew clean build

# test 건너뛰고 빌드 
./gradlew clean build -x test

 

build.gradle 추가 ( 

jar {
    enabled = false
}

 

 

build를 해줘야하기 때문에 수동, 자동 둘다 Dockerfile이 존재해야한다.

# 최신 17-jdk 이미지로 부터 시작
FROM openjdk:17-jdk

# 인자 정리
ARG JAR_FILE=build/libs/*.jar

# 앞에는 HOST OS의 현재 폴더를 의미
# 뒤에는 컨테이너의 현재 폴더(WORKDIR)를 의미
COPY ${JAR_FILE} app.jar

# docker container에서 실행되는 명령어
ENTRYPOINT ["java","-jar","/app.jar"]

 

 

Docker hub Repository 생성

 

 

 

 

이미지 생성

docker build --platform linux/amd64 -t chan1117/book-tory .

 

 

Docker push

docker push chan1117/book-tory

 

 

EC2 접속

 

Docker pull

docker pull chan1117/book-tory

 

Docker hub에 올린 image를 받아오는 작업이다.

 

 

Docker run 방식 ( 원하는 방식대로 진행해주면 된다.)

# docker run 
docker run -p 8082:8080 chan1117/book-tory

# docker run -d
docker run -d -p 8082:8080 chan1117/book-tory

# nohup 
nohup docker run -p 8082:8080 chan1117/book-tory > output.log 2>&1 &

# 실행되는 docker container 확인
docker ps

# docker exited된 containser까지 확인 
docker ps -a

 

 

  • 포그라운드 실행 (docker run -p 8080:8080 chan1117/book-tory):
    • 터미널을 점유하며 실행됩니다.
    • 컨테이너의 로그가 실시간으로 터미널에 출력됩니다.
    • 터미널을 닫으면 컨테이너도 종료됩니다.
  • 데몬 모드 실행 (docker run -d -p 8080:8080 chan1117/book-tory):
    • 백그라운드에서 실행됩니다.
    • 터미널이 즉시 반환되어 다른 작업을 할 수 있습니다.
    • 로그는 docker logs 명령어로 확인할 수 있습니다.
  • nohup과 & 사용 (nohup docker run -p 8080:8080 chan1117/book-tory > output.log 2>&1 &):
    • 터미널을 닫아도 명령어가 계속 실행됩니다.
    • 백그라운드에서 실행되며 터미널이 즉시 반환됩니다.
    • 로그는 지정한 파일(output.log)에 기록됩니다.
    • nohup은 터미널을 닫아도 프로세스가 계속 실행되도록 보장합니다.

 

 

 

git action Docker CI/CD 배포

 

 

파일 구조

 

 

 

Docker iamge

 

전체 코드

name: CI/CD Docker

# 트리거를 수행할 브랜치를 지정합니다.
on:
  push:
    branches: [ main ]

jobs:
  # Spring Boot 애플리케이션을 빌드하여 Docker Hub에 푸시하는 과정
  build:
    # 최신 Ubuntu 환경에서 실행합니다.
    runs-on: ubuntu-latest
    steps:
    # 소스 코드를 체크아웃합니다.
    - uses: actions/checkout@v3

    # 1. Java 17 세팅
    - name: Set up JDK 17
      uses: actions/setup-java@v3
      with:
        java-version: '17'
        distribution: 'temurin'

    # Gradle 테스트를 실행합니다.
    - name: Test with Gradle
      run: ./gradlew --info test

    # 2. Spring Boot 애플리케이션 빌드
    - name: Build with Gradle
      uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
      with:
        arguments: clean bootJar

    # 3. Docker 이미지 빌드
    - name: docker image build
      run: docker build -t ${{ secrets.DOCKER_USERNAME }}/devops_step1 .

    # 4. DockerHub 로그인
    - name: docker login
      uses: docker/login-action@v1
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}
    
    # 5. Docker Hub 이미지 푸시
    - name: docker Hub push
      run: docker push ${{ secrets.DOCKER_USERNAME }}/devops_step1

  deploy:
    # build job이 완료된 후에 실행되도록 정의합니다.
    needs: build  
    name: Deploy
    # AWS에서 사용할 self-hosted runner와 라벨을 지정합니다.
    runs-on: [ self-hosted, label-go ] 
    steps:
    # DockerHub에 로그인합니다.
    - name: docker login
      uses: docker/login-action@v1
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

    # 8080 포트를 80 포트로 매핑하여 Docker 컨테이너를 실행합니다.
    - name: Docker run
      run: |
        sudo docker stop devops_step1 && sudo docker rm devops_step1 && sudo docker rmi ${{ secrets.DOCKER_USERNAME }}/devops_step1:latest
        sudo docker run -d -p 8082:8080 --name devops_step1 --restart always ${{ secrets.DOCKER_USERNAME }}/devops_step1:latest

 

처음 하시는 분들위해 알려드리면 devops_step1 -> < 본인 Docker hub Repository> 로 바꿔주면 된다.

 

GitHub Actions 워크플로우에서 on: push 설정을 통해 특정 브랜치(main 브랜치)에 push 이벤트가 발생할 때마다 해당 워크플로우가 트리거되도록 설정한 것입니다. 

 

 

 

Docker ID & PW Setting

 

개인적으로 제일 중요!! 

 

runs-on: [ self-hosted, label-go ] 지시어는 GitHub Actions 워크플로우가 실행될 런너를 지정합니다. 여기서 self-hosted와 label-go는 특정한 조건을 만족하는 런너에서만 워크플로우가 실행되도록 설정합니다. AWS에서 셀프 호스팅된 런너를 사용할 때, 특정 레이블을 사용하여 매칭해야 합니다.

셀프 호스팅된 런너와 레이블 사용 목적

  1. 특정 환경에서의 실행 보장:
    • GitHub Actions는 기본적으로 GitHub이 제공하는 호스팅된 런너에서 실행됩니다. 그러나 실제 서버에서 워크플로우를 실행하고 싶은 경우, 셀프 호스팅된 런너를 사용합니다.
    • self-hosted 레이블을 사용하여 해당 런너가 GitHub에서 제공하는 것이 아닌, 직접 호스팅한 런너임을 명시합니다.
  2. 특정 서버에 대한 명시적 지정:
    • 여러 셀프 호스팅된 런너가 있는 경우, 특정 작업을 특정 서버에서 실행하고 싶을 때 레이블을 사용합니다.
    • label-go와 같은 레이블을 지정하여, 해당 레이블을 가진 런너에서만 작업이 실행되도록 합니다.

 

Runners Setting

 

 

가상 서버 접속 (EC2) - Docker 설치

# sudo -s
sudo -s

# docker 설치
apt-get update && \
    apt-get -y install apt-transport-https \
      ca-certificates \
      curl \
      gnupg2 \
      jq \
      software-properties-common && \
    curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
    add-apt-repository \
      "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
      $(lsb_release -cs) \
      stable" && \
   apt-get update && \
   apt-get -y install docker-ce


# 설치 완료 확인, 버전 확인
docker --version

 

 

# 1) user 그룹 추가 
# ec2 인스턴스 재시작 이후에도 docker 연결이 될 수 있음!
sudo usermod -aG docker ${USER}

# 그룹에 대한 변경 사항을 활성화
newgrp docker

# docker 재시작 -> 안해도 됨!
# sudo systemctl restart docker

or

# 2) /var/run/docker.sock 접근 권한 허용
sudo chmod 666 /var/run/docker.sock (비추)

 

EC2 - Runners Setting

 

 

Download

# Create a folder
$ mkdir actions-runner && cd actions-runnerCopied!# Download the latest runner package
$ curl -o actions-runner-linux-x64-2.317.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.317.0/actions-runner-linux-x64-2.317.0.tar.gzCopied!# Optional: Validate the hash
$ echo "9e883d210df8c6028aff475475a457d380353f9d01877d51cc01a17b2a91161d  actions-runner-linux-x64-2.317.0.tar.gz" | shasum -a 256 -c# Extract the installer
$ tar xzf ./actions-runner-linux-x64-2.317.0.tar.gz
  • 폴더 생성 및 이동: actions-runner 폴더를 만들고 이동.
  • 패키지 다운로드: GitHub에서 최신 러너 패키지를 다운로드.
  • 해시 값 검증 (선택 사항): 다운로드한 파일의 무결성을 확인.
  • 압축 해제: 러너 패키지의 압축을 해제.

Configure

# Create the runner and start the configuration experience
$ ./config.sh --url https://github.com/BaekSeungChan/devops_file --token AZQDYEL4WPKIU76XR2OTUYTGM2W5E# Last step, run it!
$ ./run.sh ( 중요 )

 

 

./run.sh 스크립트를 실행하면 셀프 호스팅된 러너가 시작되지만, 터미널 세션이 종료되면 러너도 종료됩니다. 이를 방지하기 위해 백그라운드에서 실행하거나 시스템 데몬으로 설정할 수 있습니다.

nohup ./run.sh &> nohup.out &

 

 

  • nohup: 터미널 세션이 종료되어도 명령어가 계속 실행되도록 합니다.
  • ./run.sh: 실행할 스크립트입니다. 여기서는 GitHub Actions 러너를 시작하는 스크립트입니다.
  • &>: 표준 출력(stdout)과 표준 오류(stderr)를 리디렉션합니다.
  • nohup.out: 출력과 오류 로그를 기록할 파일입니다.
  • &: 명령어를 백그라운드에서 실행합니다.
tail -f nohup.out

 

tail -f nohup.out 명령어는 nohup.out 파일의 끝부분을 실시간으로 모니터링하는 데 사용됩니다.

 

 

 

push를 할 때마다 자동으로 배포가 된다.

'AWS' 카테고리의 다른 글

[AWS] IAM 정책  (0) 2024.06.28
[AWS] IAM - ID 및 액세스 관리  (0) 2024.06.28
[Cloud] 클라우드 컴퓨팅이란?  (1) 2024.06.28
[Cloud] Vue.js & Nginx & Dockerfile ( + Cors 해결 ) - 1탄  (1) 2024.06.15