ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • NCP와 Jenkins 글 보완 및 새로운 내용들
    기술 이야기/CI&CD 2020. 12. 19. 17:41
    반응형

    왜 CI & CD를 생각하게 되었는가??

    부스트캠프의 수 많은 여정에서 프로젝트를 서버에 올리고 정상적으로 작동하는지 확인하는 작업은 생각보다 시간을 많이 차지했었다.

    할고래DO 이전의 프로젝트를 진행할 때, 이 시간을 아껴서 개발이나 기술 학습에 조금 더 투자해보면 어떨까? 라는 생각이 들었고 실천에 옮겼다.

    리서치 결과 CI 툴로 Jenkins와 Travis가 가장 많이 사랑을 받고 있었고, 각각의 장단점이 많았지만 체감이 되지않아 CI 계의 아버지인 Jenkins를 선택했었다.

    이번 프로젝트에서도 배포에 투자하는 시간을 더욱 아끼기위해 사용해봤던 Jenkins를 CI & CD(여기서는 Delivery 입니다) 툴로 선택했다.

    그렇다면 왜 무중단 배포일까??

    Jenkins를 통해 새로운 배포 버전을 받았으니 서버에서 띄워줘야한다.

    이 때, 단일 서버의 경우 새로운 버전을 띄우기 위해 기존 서비스를 중단했다가 올려야한다.

    현재 프로젝트 규모에서는 사용자의 컴플레인이 발생할 일이 없겠지만, 사용자가 편리함을, 유저의 경험을 소중히 여기는 개발자가 되고 싶어서 무중단 서비스를 택했다.

    또한, Docker Image를 사용했는데, 이는 확장성을 고려했을 때 변경에 용이하도록 위함이었다.

    트래픽이 많아지는 경우 동일한 환경, 같은 이미지의 container를 여러 대 띄우기 용이하기 때문이다.

    할고래DO에서 사용하는 무중단 CI&CD

    • 할고래DO에서는 젠킨스에서 새로운 버전의 파일이 전달될 때, shell script를 이용해서 docker image를 컨테이너화 작업하고있다.
    • blue-green 방법론을 채택해서, 새로운 버전을 컨테이너로 띄우고, 올라오기까지 기다렸다가 기존 버전의 서비스를 내린다.
    • 로드밸런서로 Nginx를 채택해서 도커 컨테이너의 상태를 체크해서 proxy pass를 설정하고 있다.

      이 과정을 통해 엔드 유저가 서버를 이용할 때, 응답을 못받는 경우가 없도록 서비스하고 있다.

    무중단 CI & CD 적용 과정

    우선, 저번 프로젝트에서 무중단 서버 배포를 진행하면서 정리해뒀던 글을 바탕으로 진행했다. (이전 프로젝트의 무중단 서버 배포 보러가기, 블로그 글 보러가기)

    할고래DO 배포를 진행하면서 새롭게 마주한 에러

    • GPG error: https://pkg.jenkins.io/debian-stable binary/ Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY FCEF32E745F2C3D5

      • 서버의 OS로 Ubuntu-16.04를 채택했는데, apt-get update를 하려다가 발생한 에러
      • GPG(GNU Privacy Guard) => GNU의 pgp 암호화 프로그램 ~> PGP를 대체하는 자유 소프트웨어
      • pgp(Pretty Good Privacy)는 사용자가 서명된 파일이나 이메일에 사용할 식별 키 시스템으로 인증여부 확인(컴퓨터 파일 암호화 / 복호화 Software)
      • 처음 받은 에러여서 인터넷을 찾은 결과 오류 메시지에서 표시된 PGP 공개키가 서버에 등록되지 않아서 발생하는 에러라고 한다.
      • third party의 PPA를 등록했는데 이 저장소를 참조하는 키가 ubuntu keyserver에 등록되지 않아서 그렇다.
      • 해결 방법
        • 공개키를 키 서버에 업로드한다.
        • 위의 에러에서 친절하게 공개키의 번호를 알려줬다.
        • sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys FCEF32E745F2C3D5 명령어로 ubuntu keyserver에 등록해서 해결했다.
      • 실패한 방법
        • http://pgp.mit.edu/ 에 들어가서 발생한 에러 키를 검색하면, 해결 방법이 나온다는 블로그 포스팅을 봤다. 하지만, 응답 지연이 1분정도 일어나고 502 error가..
    • 도커 설치 문제

      • Package docker-ce is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source
      • 분명 1~2주 전까지 아무 문제없이 받아서 사용했던 docker-ce가 유효하지 않다고 한다고해서 조금 당황했었다. 그래서 docker 공식 문서에 들어가봤다.
      • 친절하게 Install Docker Engine on Ubuntu라는 페이지가 있어서, 쉽게 해결할 수 있었다.
    • docker compose error

      • ERROR: pull access denied for halgoaredo-api-server-docker-image, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
      • 분명 이미지를 도커 hub에 올리지않고 local에서만 저장하고 있는데, pull을 하기 위해 docker login을 하라는 문구가 떠서 당황했다.
      • 알고보니 docker image 이름에 오타가 존재해서 발생했었다. (halgoraedo <- halgoaredo)
      • 또한, 생성해놨던 docker image 이름이 halgoraedo-api-server 인데, green과 blue 모두 halgoraedo-api-server-docker-image를 찾으려했었다.
        • 사소한 에러지만, 혹시나 나중에 오타 문제로 어려운 상황을 겪게 될까봐 기록용으로 남긴다.
    • docker 이미지 실행 시, Network 에러 및 container가 exited 되는 현상

      • 노드 서버가 실행될 때, .env 파일을 찾지 못해서 생기는 문제였다.
      • 저번 프로젝트에서 compose가 명령되는 위치와 같은 위치에 .env가 존재하면, docker에서 해석해준다는 것을 알게되었었고, 저번 프로젝트에서는 문제 없이 서버를 배포했다.
      • 하지만, 이번 프로젝트를 진행하면서 도커가 계속 exited 되는 문제가 생기면서 .env를 포함시켜 이미지화 시켜서 docker container를 띄우는데 성공했다.
      • .env 파일을 포함한 이미지를 만드는 것이 맞는지 확신이 서지 않았지만, 명쾌한 답을 찾지 못했다. 그래서 1주일 정도 고민을 했는데, 어차피 로컬에서 사용하는 이미지기 때문에 포함되어도 괜찮다고 결론지었다.

    할고래DO에서 시도한 것들

    • 현재 사용하지 않는 docker 리소스 삭제

      • Jenkins를 통해서 새로운 빌드파일이 통합되면 docker 이미지를 생성하고 새롭게 도커 컨테이너를 띄운다.

        이때, 새롭게 이미지가 생성되기 때문에 이전 이미지나 볼륨 등이 더 이상 쓰이지 않게 된다.

        하지만, 여전히 서버 내부에 자리잡고 있기 때문에 불필요하게 메모리를 차지하게 된다.

      • 이를 해결하기 위해서, 새로운 버전의 도커 컨테이너를 띄운 후, 이전 리소스를 삭제해주는 명령어를 deploy.sh에 추가해주었다.
        • sudo docker system prune -a -f
    • .babelrc.js도 같이 복사해오기(dot file)

      • 이전 프로젝트에서 파일 및 디렉토리들을 복사해오는 명령어가 잘못되었다는 것을 발견했다.
      • 바로 . 파일들을(dot files) 복사해오지 못한다는 것이었다.
      • 이번 프로젝트에서는 class-validator를 사용하면서 decorator 때문에 babel을 사용했는데, 이 덕분에 기존 명령어가 온전한 기능을 수행하지 못한다는 것을 알았다.
      • 시도했던 방법들
        • .*로 복사 ~> ../ 위치까지 모두 복사해와서 불필요한 파일 및 디렉토리들이 섞여 들어왔다.
        • cp 명령어 옵션들을 활용하려고 했지만, 모두 실패했다. (특히, -rT 명령어로 재귀적으로 모든 파일을 가져올 수 있다고해서 시도했는데 안돼서 의문이 들었다.)
      • 해결한 방법
        • 결국은 그냥 .babelrc.js 파일도 cp 명령어로 추가해주었다. ~> 하지만, 가져와야하는 설정 파일들이 많아진다면...?? 좋은 방법은 아니라고 생각한다.
      • 생각나는 다른 방법
        • jenkins에서 새로운 배포 디렉토리를 받아오면, 내부 파일들을 복사하지말고 그 디렉토리 자체를 전달해줘도 괜찮다는 생각이 들었다.

    Reference

    반응형

    댓글

Designed by Tistory.