ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리로이 젠킨스 CI/CD 구현 3
    스파르타코딩클럽/최종프로젝트 - DevQuiz 2024. 1. 29. 17:34

     

     

     

    merge되면 도커허브까지 이미지가 푸시되는 CI를 완성하였다.

    다음은 도커허브에 푸시된 이미지를  도커컴포즈가 받아서 배포하는 CD를 만들어보아야한다.

     

    처음에는 CI/CD에서 쉘스크립트를 제대로 짜지 못해서  CI/CD용 EC2에서 배포까지 함께 되고있는 상황이었다.

     

    배포 EC2가 실행중인 상태에서  동시에 배포가 2개나 되는 비효율적인 상황이 만들어졌다.

     

    어떻게 해결하였는지는 CD 과정을 작성하며 함께 기록하였다.

     

     

     

     


     

     

     

     

    프로젝트 생성

     

     

     

     

     

    사용할 깃허브 URL을 입력한다.

     

     

     

     

     

    아래에도 이렇게 작성하였다.

     

     

     

     

    그리고 다른 프로젝트가 빌드된 이후에 빌드가 될 수 있도록 이렇게 매개변수를 넣어주었다

     

    아래 네가지 선택지는  빌드

    안정적일때만 / 빌드가 불안정할때도 / 빌드가 실패했을때도 / 빌드가 중단되더라도

    트리거를 한다는 내용이다.

     

     

     

     

    여기서 아래 쉘스크립트에서 

    ssh를 통해 배포용 ec2를 접속하여

    도커컴포즈를 down pull up 한다.

     

    그러기 위해선 ssh 관련 credentials 설정이 필요한데

     

     

     

     

     

    ID는 적절한 설명을 붙이고

    Username은  해당 ec2의 운영체제를 붙이면 된다.

    aws linux 일 경우엔  ec2-user,   ubuntu라면 ubuntu를 입력하면 된다.

     

    그리고 private key는 pem파일을 메모장으로 열어서 모든 내용을 붙여넣으면 된다.

     

     

     

    아래 진행하기 전에 SSH Agent 플러그인 설치 필수

     

     

     

    그리고 위 사진처럼 쉘스크립트를 작성하면   CI/CD EC2에서  배포 EC2에 접속하여  도커컴포즈 명령어를 실행하게 된다.

     

     

     

     


     

     

     

     

    트러블 슈팅

    진짜 한 걸음 딛을때마다 에러가 뜨는게 너무 힘든 과정이었다.

     

     

     

    첫번째는 기존에   CI/CD를 한 ec2에서 해버렸을때의 실수이다.

    1. cd 를 못함   (Change directory)
    
    cd /root/깃허브디렉토리/ /tmp/jenkins1224.sh: 2: cd: can't cd to /root/깃허브디렉토리/ 
    Build step 'Execute shell' marked build as failure 
    Finished: FAILURE
    
    
    /home/jenkins/깃허브디렉토리  로 이동해서 해결

     

     

     

     

    두번째는 Change directory를 성공하였으나 도커컴포즈가 깔려있지 않아 발생한 에러

    cd /home/jenkins/깃허브디렉토리/
    docker-compose pull /tmp/jenkins1687.sh: 3: docker-compose: not found 
    Build step 'Execute shell' marked build as failure 
    Finished: FAILURE
    
    
    도커컴포즈가 깔려있지않아서 발생
    
    도커컴포즈 설치로 쉽게 해결

     

     

     

     

    세번째는 Change directory를 지나서  docker-compose pull을 받던 중에 에러가 발생하였다.

    + docker-compose pull
     frontend Pulling 
     db Pulling 
     redis Pulling 
     nginx Pulling 
     backend Pulling 
     backend Error 
     frontend Error 
     nginx Error 
     redis Error 
     db Error 
    Error response from daemon: manifest for 내도커허브:latest not found: manifest unknown: manifest unknown
    Build step 'Execute shell' marked build as failure
    Finished: FAILURE
    
    
    
    내 도커허브에서 latest 버전을 찾지 못해서 발생
    
    
    
    dockerImage.push("${gitTag}")
    dockerImage.push("latest") 
    
    기존에는 깃태그만 푸시하였으나  
    latest까지 같이 푸시하도록하여 도커컴포즈가 최신버전 pull을 받을 수 있게함

     

     

     

    네번째는 pull을 끝낸 이후 docker-compose up 에서 에러가 발생하였다.

    + docker-compose up -d
    
    Error response from daemon: failed to create task for container: 
    failed to create shim task: OCI runtime create failed: runc create 
    failed: unable to start container process: error during container 
    init: error mounting "/home/jenkins/깃허브레포지토리/nginx.conf" to rootfs at "/etc/nginx/nginx.conf": mount /home/jenkins/깃허브레포지토리/nginx.conf:/etc/nginx/nginx.conf (via /proc/self/fd/6), 
    flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? 
    Check if the specified host path exists and is the expected type
    Build step 'Execute shell' marked build as failure
    Finished: FAILURE
    
    
    
    엔진엑스.conf 파일 마운트 문제
    
    마운트경로를 환경변수로 지정하여  CI/CD와 배포용을 같은 docker-compose.yaml에서 처리할수있게하거나
    
    레포지토리에서 다른 브랜치를 사용하여 yaml파일을 2개를 쓰게하는 방법이 있다.
    
    그러나 첫번째 방법또한 CI/CD와 배포서버에서 각각 다른 env 파일을 써야하므로
    
    어차피 다른 브랜치를 파서 사용하는것은 같았다
    
    
    프로젝트에서 /master를 /cicd로 변경
    도커컴포즈 yaml 파일 수정
    
    volumes:
          - /home/jenkins/깃허브레포지토리/nginx.conf:/etc/nginx/nginx.conf
    
    
    
    
    하지만 이래도 해결되지 않았고
    배포 EC2에서 실행하기 위해선  이 에러를 해결할 필요가 없다고 판단하여
    과감하게  엔진엑스 리버스프록시를 삭제한 후 CI/CD를 마무리하였다.
Designed by Tistory.