[트러블슈팅] Github Action을 이용한 CICD

2024. 6. 16. 03:01·여러가지/오류

개요

CI/CD 파이프라인 구축 과정에서 발생한 다양한 실수와 오류, 문제의 원인, 그리고 이를 해결한 방법에 대해 상세하게 설명합니다. 주된 목적은 GitHub Actions를 활용하여 애플리케이션의 자동화된 빌드, 테스트, 배포 파이프라인을 구축하는 것입니다. 본 보고서는 구축 과정에서 발생한 문제들을 체계적으로 정리하여 유사한 프로젝트를 진행하는 개발자들에게 도움이 되고자 합니다.

실수 사항, 문제의 원인 및 해결 방법

  1. Docker 빌드 오류: JAR 파일을 찾을 수 없음
  • 오류 메시지: failed to calculate checksum of ref ... lstat /tmp/buildkit-mount.../build/libs: no such file or directory
  • 문제의 원인: Docker 빌드 중 지정한 경로에 JAR 파일이 존재하지 않음.
  • 해결 방법:
    • JAR 파일이 올바르게 빌드되고 있는지 확인하기 위해 빌드 과정을 추가.
    • GitHub Actions 스크립트에 프로젝트 빌드 명령어 추가:
    • 코드
        - name: Build the project run: ./gradlew build
  1. Docker Compose 명령어 오류
  • 문제의 원인: Docker Compose 파일이 없거나 잘못된 경로에 존재함.
  • 해결 방법: EC2 인스턴스에서 올바른 디렉토리로 이동하여 Docker Compose 명령어를 실행.
  • 코드
      - name: SSH into EC2 and deploy
      uses: appleboy/ssh-action@v0.1.5
      with:
          host: ${{ secrets.AWS_EC2_HOST }}
          username: ${{ secrets.AWS_EC2_USER }}
          key: ${{ secrets.AWS_EC2_KEY }}
          script: |
              echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
              cd ~/cicd-demo
              docker rm -f $(docker ps -qa)
              docker-compose down -v
              docker-compose up -d
              docker image prune -f
  1. DockerHub 로그인 오류
  • 문제의 원인: 잘못된 DockerHub 자격 증명 또는 환경 변수 설정 문제.
  • 해결 방법: GitHub Secrets에 올바른 DockerHub 사용자 이름과 비밀번호 설정. GitHub Actions에서 이를 사용하여 로그인.
  • 코드
    - name: Login to DockerHub 
    uses: docker/login-action@v2
    with: 
        username: ${{ secrets.DOCKER_USERNAME }} 
        password: ${{ secrets.DOCKER_PASSWORD }} 

 

  1. QEMU 및 Buildx 설정 문제
  • 문제의 원인: 다중 아키텍처 빌드를 지원하기 위한 설정 누락.
  • 해결 방법: QEMU 및 Buildx 설정 단계를 추가하여 다중 아키텍처 빌드를 지원.
  • 코드
    - name: Set up QEMU 
    uses: docker/setup-qemu-action@v2 

    - name: Set up Docker Buildx 
    uses: docker/setup-buildx-action@v2 
  1. 환경 변수 누락 및 잘못된 참조
  • 문제의 원인: 환경 변수 및 비밀 키 참조 오류.
  • 해결 방법: GitHub Secrets에 올바르게 설정된 환경 변수 사용.
  • 코드
    host: ${{ secrets.AWS_EC2_HOST }}
    username: ${{ secrets.AWS_EC2_USER }}
    key: ${{ secrets.AWS_EC2_KEY }}

Github Action for deoploy.yaml

name: CI/CD Pipeline

on:
  push:
    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up JDK
        uses: actions/setup-java@v2
        with:
          distribution: 'adopt'
          java-version: '17'

      - name: Build the project
        run: ./gradlew build

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Login to DockerHub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Build and push Docker image
        run: |
          docker buildx create --use
          docker buildx build --platform linux/amd64,linux/arm64 -t hyeseong43/cicd-demo:latest --push .

      - name: SSH into EC2 and deploy
        uses: appleboy/ssh-action@v0.1.5
        with:
          host: ${{ secrets.AWS_EC2_HOST }}
          username: ${{ secrets.AWS_EC2_USER }}
          key: ${{ secrets.AWS_EC2_KEY }}
          script: |
            echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
            cd ~/cicd-demo
            docker rm -f $(docker ps -qa)
            docker-compose down -v
            docker-compose up -d
            docker image prune -f

Dockerfile

FROM openjdk:17-jdk-slim-buster
VOLUME /tmp
ARG JAR_FILE=build/libs/cicd-demo-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

docker-compose.yml in Local

version: '3'
services:
  web:
    image: hyeseong-dev/cicd-demo:latest
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"

docker-compose.yml in EC2

version: '3.9'
services:
  web:
    image: hyeseong43/cicd-demo:latest
    platform: linux/arm64
    ports:
      - "8080:8080"

위의 문제들을 해결한 후 CI/CD 파이프라인이 성공적으로 구축되었습니다. 각 단계에서 발생한 문제를 분석하고 해결함으로써 전체 프로세스를 최적화할 수 있었습니다. CI/CD 파이프라인을 구축하는 동안 발생한 실수와 그 해결책을 통해 배운 점이 많습니다.

저작자표시 (새창열림)

'여러가지 > 오류' 카테고리의 다른 글

[트러블슈팅] EC2 재시동 후 iptable 맵핑 정보 사라지는 현상 해결  (0) 2024.06.16
[트러블슈팅] 80포트 요청을 8080포트로 리다이렉션하기(feat. AWS)  (1) 2024.06.16
pyenv 실행 오류  (0) 2024.03.10
'여러가지/오류' 카테고리의 다른 글
  • [트러블슈팅] EC2 재시동 후 iptable 맵핑 정보 사라지는 현상 해결
  • [트러블슈팅] 80포트 요청을 8080포트로 리다이렉션하기(feat. AWS)
  • pyenv 실행 오류
hyeseong-dev
hyeseong-dev
안녕하세요. 백엔드 개발자 이혜성입니다.
  • hyeseong-dev
    어제 오늘 그리고 내일
    hyeseong-dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (286)
      • 여러가지 (107)
        • 알고리즘 & 자료구조 (72)
        • 오류 (4)
        • 이것저것 (29)
        • 일기 (1)
      • 프레임워크 (39)
        • 자바 스프링 (39)
        • React Native (0)
      • 프로그래밍 언어 (38)
        • 파이썬 (30)
        • 자바 (3)
        • 스프링부트 (5)
      • 컴퓨터 구조와 운영체제 (3)
      • DB (17)
        • SQL (0)
        • Redis (17)
      • 클라우드 컴퓨팅 (2)
        • 도커 (2)
        • AWS (0)
      • 스케쥴 (65)
        • 세미나 (0)
        • 수료 (0)
        • 스터디 (24)
        • 시험 (41)
      • 트러블슈팅 (1)
      • 자격증 (0)
        • 정보처리기사 (0)
      • 재태크 (5)
        • 암호화폐 (5)
        • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    SAA
    Redis
    Spring Boot
    Python
    FastAPI
    프로그래머스
    spring
    ecs
    취업리부트
    AWS
    docker
    Spring WebFlux
    백준
    파이썬
    그리디
    RDS
    OOP
    EC2
    완전탐색
    #개발자포트폴리오 #개발자이력서 #개발자취업 #개발자취준 #코딩테스트 #항해99 #취리코 #취업리부트코스
    DP
    celery
    자바
    java
    Docker-compose
    reactor
    항해99
    WebFlux
    시험
    mybatis
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
hyeseong-dev
[트러블슈팅] Github Action을 이용한 CICD
상단으로

티스토리툴바