여러가지/오류

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

hyeseong-dev 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 파이프라인을 구축하는 동안 발생한 실수와 그 해결책을 통해 배운 점이 많습니다.