Github Action + Docker를 이용한 CI/CD 구축

이민정·2024년 3월 3일
post-thumbnail

1. ec2에 docker,docker compose 설치하기

도커 컴포즈는 단일 서버에서 여러개의 컨테이너를 하나의 서비스로 정의해 컨테이너의 묶음으로 관리할 수 있는 작업 환경을 제공하는 관리 도구

아래 링클로 접속해 1번, 2번 모두 ec2에 서버에 설치하기
Install Docker Engine on Ubuntu

docker --version
docker compose version

위 명령어로 잘 깔렸는지 확인하면 ec2 서버에 docker 설치 완료

2. EC2 서버에 docker-compose.yml 파일 생성하기

  • 서버 홈 디렉토리로 나오기 - 명령어 : cd
  • vi docker-compse.yml 명령어 사용해서 작성
version: '3'--
services:
  trothcam:
    image: kusitms/ggeok
    container_name:컨테이너명  
    restart: always
    ports:
      - 8080:8080

저장하고 나가기 : esc > :wq
저장하지 않고 나가기 : esc > :q

3. 파일에 Dockerfile 추가하기

  • 프로젝트 구성

위치 잘 확인 후 Dockerfile 추가

# open jdk 17 버전의 환경을 구성
FROM openjdk:17-jdk

#gradle로 빌드했을 때 jar 파일이 생성되는 경로 작성
ARG JAR_FILE=./build/libs/server-0.0.1-SNAPSHOT.jar

# JAR_FILE을 app.jar로 복사
COPY ${JAR_FILE} app.jar

# 운영 및 개발에서 사용되는 환경 설정을 분리
ENTRYPOINT [ "java", "-jar", "-Dspring.profiles.active=prod", "/app.jar" ]

! jar 파일 위치 및 명칭 확인 후 작성하기 : ARG JAR_FILE 부분에 jar파일 빌드하면 build>libs에 jar 파일이 생김. 그 경로를 넣으면 됨

<jar 파일 빌드 방법>
./gradlew build

4. workflow 파일 작성하기

  • 기본적인 방법 : github>레파지토리>actions>Java with Gradle에 .yml 파일을 생성
# github repository actions 페이지에 나타날 이름
name: CD

# event trigger
# main 브랜치에 push가 되었을 때 실행
on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

permissions:
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      ## jdk setting - github actions에서 사용할 JDK 설정 (프로젝트나 AWS의 java 버전과 달라도 무방)
      - uses: actions/checkout@v3
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      ## gradle caching - 빌드 시간 향상
      - name: 🧁 Gradle Caching
        uses: actions/cache@v3
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
          restore-keys: |
            ${{ runner.os }}-gradle-

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew

      - name: 🧁 application.yml 파일을 생성 합니다.
        run: |
          cd ./src/main/resources
          touch ./application.yml
          echo "${{ secrets.PROPERTIES }}" > ./application.yml # github actions에서 설정한 값을 application.yml 파일에 쓰기
        shell: bash

      #Gradle을 사용하여 프로젝트를 빌드
      - name: 🧁 gradle build를 위한 권한을 부여합니다.
        run: chmod +x gradlew

      - name: 🧁 gradle build 중입니다.
        run: ./gradlew build
        shell: bash # ci는 여기까지

      ## Docker 이미지를 빌드하고 Docker Hub로 푸시
      - name: 🧁 docker image build 후 docker hub에 push합니다.
        run: |
          docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
          docker build -f Dockerfile -t ${{ secrets.DOCKER_REPOSITORY }}/${{ secrets.DOCKER_IMAGE }} .
          docker push ${{ secrets.DOCKER_REPOSITORY }}/${{ secrets.DOCKER_IMAGE }}

      - name: 🧁 docker hub에서 pull 후 deploy합니다.
        uses: appleboy/ssh-action@master
        with:
          username: ubuntu
          host: ${{ secrets.AWS_HOST }} # EC2 퍼블릭 IPv4 DNS
          key: ${{ secrets.AWS_KEY }}
          script: |
            sudo docker pull ${{ secrets.DOCKER_REPOSITORY }}/${{ secrets.DOCKER_IMAGE }}
            sudo docker rm -f $(docker ps -qa) #
            docker compose up -d
            docker image prune -f

5. git-secrets에 환경변수 등록하기

EC2_HOST탄력적ip
EC2_USERNAMEubuntu
EC2_PRIVATE_KEYpem키
DOCKER_USERNAME도커 유저명
DOCKER_PASSWORD도커 비밀번호
DOCKER_REPOSITORY레파지토리 이름
DOCKER_IMAGE도커 이미지 이름
PROPERTIESapplication.yml 파일

트러블 슈팅

Error: Cannot perform an interactive login from a non TTY device

-> github secret의 USERNAME 잘못되어있었음

ERROR: failed to solve: failed to read dockerfile: open /var/lib/docker/tmp/buildkit-mount2939804424/Dockerfile: no such file or directory

-> dockerfile 경로가 잘못되어 있었음

profile
🍳🎀🕶️👑🧸

2개의 댓글

comment-user-thumbnail
2024년 3월 3일

2번에 yml에 trothcam은 서비스 이름을 넣는다네요. 쏘울라이브로 하시죠

1개의 답글