관리 메뉴

ballqs 님의 블로그

[CI/CD] 자동 배포 파이프 라인 (4) - Build 에러 사항 본문

코딩 공부/CI-CD

[CI/CD] 자동 배포 파이프 라인 (4) - Build 에러 사항

ballqs 2024. 11. 17. 20:45

Build를 하면서 났던 에러사항들을 번외로 작성해볼려고 합니다.

이부분은 진짜 별거 아닌 내용도 작성되기도 하지만 이런 것도 문제 일으킬수 있다는 점을 확인할 수 있어 도움이 되었고 메모하는 습관덕에 글을 작성하게 되었기에 앞으로 Jenkins 작업할때 이런 에러는 덜 일으킬 것입니다.

또한 슬랙 알람이 적용 전 상태에서 발생한 에러임을 양해부탁드립니다.

 

빌드 단계

 

코드

pipeline {
    agent any

    stages {
        
        stage('Git Clone') {
            steps {
                git branch: 'dev', credentialsId: 'github-access-token', url: 'https://github.com/ballqs/nbcamp-spring-jpa-task.git'
            }
        }
        
        stage('Build') {
            steps {
                // Gradle 실행권한
                dir('./') {
                    sh 'chmod +x ./gradlew'
                // Gradle 빌드 실행
                    sh './gradlew clean build'   
                }
            }
        }
        
        stage('Test'){
            steps {
                dir('./') {
                    sh './gradlew test'    
                }
            }
        }
        
        stage('DockerFile Build') {
            steps{
                dir("./") {
                    script {
                        dockerimage = docker.build("aysel0413/nbcamp-spring-jpa-task:0.1")
                    }
                }   
            }
        }
        
        stage('Docker Image Push') {
            steps {
                script {
                    withDockerRegistry(credentialsId:"docker-access") {
                        dockerimage.push()
                    }
                }
            }
        }
        
        stage('Deploy') {
          steps {
              sshagent(credentials: ['aws_key']) {
                    sh '''
                        ssh -o StrictHostKeyChecking=no ubuntu@52.78.140.97 << EOF
                        docker container stop app
                        docker image prune -f
                        docker pull aysel0413/nbcamp-spring-jpa-task:0.1
                        docker run -d --rm -p 8080:8080 --env-file ./config/.env --name app aysel0413/nbcamp-spring-jpa-task:0.1
                        exit
                        EOF
                    '''
                }
            }
        }
    }
}

 

 

에러 사항

Git Clone 단계 에러

jenkins 에서 dashboard > Jenkins관리 > Credentials 에 설정된 명칭와 일치하게 해야합니다.

credentialsId: 'github-access-token' 에 맞게 설정!!

 

Build 단계 에러

dir('./') 경로 설정 제대로 할 것

Git Clone 단계를 통해 clone하면 Jenkins 설정마다 다를수 있지만 저의 경우는 /var/jenkins_home/workspace 경로에 clone되는 것을 확인했고 dir(’./’) 경로를 맞춰주면서 해결했습니다.

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                // Gradle 실행권한
                dir('./') {
                    sh 'chmod +x ./gradlew'
                // Gradle 빌드 실행
                    sh './gradlew clean build'   
                }
            }
        }
    }
}

 

Test 단계 에러

./gradlew test 라는 명령어에 나는 에러입니다.

이부분은 로컬 프로젝트에서는 테스트가 통과되더라도 여기 과정에서는 안되는 경우가 존재합니다.

@SpringBootTest 가 붙어 있는 테스트가 있다면 redis라던지 여러가지가 덧붙여 테스트 되는게 있어서 redis가 없는 환경의 테스트는 에러가 확정이기에 임시적으로 해결할려면 주석 처리해주거나 다 고려하게 설계 후 진행하시면 됩니다.

우선 Build가 되는 것을 확인하기 위해 @SpringBootTest 가 붙은 코드를 주석처리 하겠습니다.

//@SpringBootTest
//class NbcampSpringJpaTaskApplicationTests {
//
//    @Test
//    void contextLoads() {
//    }
//
//}

 

DockerFile Build 단계 에러 - 1

docker build -t aysel0413/nbcamp-spring-jpa-task:0.1 . /var/jenkins_home/workspace/aysel@tmp/durable-7abd6b5c/script.sh.copy: 1: docker: not found

젠킨스가 깔려있는 환경에 docker가 안깔려 있어서 실행할수 없음을 뜻합니다.

Dockerfile 수정해서 해결했습니다. (ubuntu 기준!!)

그리고 Jenkins안에 Docker를 까는 것은 안좋은 방법이라고 합니다.

외부에 깔려있는 Docker를 사용할수 있도록 설정하는 방법이 더 좋은 방법이나 시간부족으로 내부에 설치하는 방향으로 진행했습니다.

FROM jenkins/jenkins:jdk17

USER root
RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y openssh-client \
    curl \
    gnupg2 \
    lsb-release \
    software-properties-common

# Docker 설치
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - && \
    add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" && \
    apt-get update && \
    apt-get install -y docker-ce-cli

# Docker Compose 설치
RUN curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
    chmod +x /usr/local/bin/docker-compose

# Docker 그룹을 수동으로 생성
RUN groupadd docker && usermod -aG docker jenkins

# SSH 설치 (필요한 경우)
RUN apt-get install -y openssh-client

DockerFile Build 단계 에러 - 2

docker build -t aysel0413/nbcamp-spring-jpa-task:0.1 . ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 에러가 발생했습니다.

/var/run/docker.sock 가 없음을 뜻했고 아래와 같이 설정하여 수정했습니다.

docker-compose.yml 수정해서 해결했습니다.

version: "3.8"
services:
  jenkins:
    container_name: jenkins
    build:
      context: ./
      dockerfile: Dockerfile
    restart: unless-stopped
    user: root
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - ./jenkins:/var/jenkins_home
      - ./jenkins/.ssh:/root/.ssh
      # 추가된 코드----------
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      DOCKER_HOST: unix:///var/run/docker.sock
      # --------------------
    privileged: true  # Docker 실행을 위해 필요한 권한

 

Docker Image Push 단계 에러

jenkins 에서 dashboard > Jenkins관리 > Credentials 에 설정된 명칭와 일치하게 해야합니다.

credentialsId:"docker-access" 에 맞게 설정합니다.

pipeline {
    agent any

    stages {
        stage('Docker Image Push') {
            steps {
                script {
                    withDockerRegistry(credentialsId:"docker-access") {
                        dockerimage.push()
                    }
                }
            }
        }
    }
}

 

Deploy 단계 에러 - 1

ssh -o StrictHostKeyChecking=no ubuntu@[AWS 인스턴스 IPv4 주소 IP] Pseudo-terminal will not be allocated because stdin is not a terminal. ssh: connect to host [AWS 인스턴스 IPv4 주소 IP] port 22: Connection refused

aws 인스턴스를 확인하여 제대로된 [AWS 인스턴스 IPv4 주소 IP] 값을 찾아서 기입해주면 됩니다.

pipeline {
    agent any

    stages {
        stage('Deploy') {
          steps {
              sshagent(credentials: ['aws_key']) {
                    sh '''
                        ssh -o StrictHostKeyChecking=no ubuntu@[AWS 인스턴스 IPv4 주소 IP] << EOF
                        docker container stop app
                        docker image prune -f
                        docker pull aysel0413/nbcamp-spring-jpa-task:0.1
                        docker run -d --rm -p 8080:8080 --env-file ./config/.env --name app aysel0413/nbcamp-spring-jpa-task:0.1
                        exit
                        EOF
                    '''
                }
            }
        }
    }
}

 

Deploy 단계 에러 - 2

Status: Downloaded newer image for aysel0413/nbcamp-spring-jpa-task:0.1 docker.io/aysel0413/nbcamp-spring-jpa-task:0.1 Unable to find image 'aysel0413/nbcamp-spring-jpa-task:latest' locally docker: Error response from daemon: manifest for aysel0413/nbcamp-spring-jpa-task:latest not found: manifest unknown: manifest unknown. See 'docker run --help'.

aysel0413/nbcamp-spring-jpa-task:0.1 이부분에 docker hub에 없다면 에러나는 것이 당연합니다.

Docker Hub를 이용하면서 이부분을 생각지 못해서 에러가 발생했습니다... ㅠ

pipeline {
    agent any

    stages {
        stage('Deploy') {
          steps {
              sshagent(credentials: ['aws_key']) {
                    sh '''
                        ssh -o StrictHostKeyChecking=no ubuntu@[AWS 인스턴스 IPv4 주소 IP] << EOF
                        docker container stop app
                        docker image prune -f
                        docker pull aysel0413/nbcamp-spring-jpa-task:0.1
                        docker run -d --rm -p 8080:8080 --env-file ./config/.env --name app aysel0413/nbcamp-spring-jpa-task:0.1
                        exit
                        EOF
                    '''
                }
            }
        }
    }
}

 

Jenkins 의 설정해놓은 Stage별로 에러가 각각 다 발생해서 수정한다고 시간을 많이 날렸습니다.

다만 귀중한 체험이였고 다음에는 이런 실수 없이 진행할수 있을거 같습니다.