인프런 커뮤니티 질문&답변

유요한님의 프로필 이미지

작성한 질문수

젠킨스와 도커를 사용해서 배포할 때

해결된 질문

작성

·

1K

1

인터넷에서 조사한 대로 하다가 에러를 만났는데 해결전에 프리티어 기간이 끝나서 결국 실습으로 해결하지 못해서 질문드립니다 ㅠㅠ 제가 진행한게 맞는지 이해한게 맞는지도 독학으로 하다보니 잘 모르겠네요...

진행한 순서 :

  1. EC2 리눅스 생성

  2. EC2 시간 설정과 프로젝트에서 사용할 환경변수 설정

  3. git 설치 sudo yum install git

  4. 도커 다운 sudo yum install docker

  5. 도커 시작 sudo systemctl start docker

  6. 도커로 자바 다운 docker pull openjdk:11

  7. 도커로 젠킨스 이미지 다운로드 docker pull jenkins/jenkins:jdk11

  8. 다운로드 이미지 조회 docker images

  9. 젠킨스 이미지를 컨테이너로 실행 ocker run -d -p 8080:8080 -p 50000:50000 -v /home/jenkins:/var/jenkins_home -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -u root jenkins/jenkins:jdk11

  10. 젠킨스에서 가입

  11. 젠킨스에서 시간 설정

  12. 젠킨스에서 사용할 플로그인 다운받아서 플러그인 올리기로 등록

  13. 젠킨스 디렉토리 생성 sudo mkdir -p /home/jenkins/.ssh

  14. SSH 권한 부여 sudo chmod 700 /home/jenkins/.ssh

  15. SSH key 생성 sudo ssh-keygen -t rsa

  16. 키 파일 설정 구간 /home/jenkins/.ssh/id_rsa

  17. 비밀번호 없이 진행할 수 있도록 jenkins ALL=(ALL) NOPASSWD: ALL

  18. ssh 퍼블릭을 복사해서 개발서버(authorized_keys)에 복사

  19. git에서 프로젝트의 레포지토리의 설정에서 Deploy keys에 ssh 퍼블릭을 넣음

  20. 웹훅 설정 : 젠킨스가 설치된 서버 :포트/github-webhook/

  21. Git Token 발급

  22. Credential 등록

     

    • Kind : SSH Username with private key

    • Username : 깃허브 아이디(닉네임)

    • password : git token

    • ID : 원하는 값 설정(아무거나)

    • private key : ssh private 넣기

  23. Publish Over SSH 설정

     

    • name : 본인이 사용하고자하는 이름

    • HostName : EC2 퍼블릭 ip

    • username : 리눅스니 ec2-user

    • directory : 인스턴스 디렉토리`/home/ec2-user`

    여기서 Test Configurations을 누르면 에러발생여기서부터 막혀서 진행이 안됐는데 다음꺼는 조사한 거로 정리한건데 맞는지 확인을 위해 올립니다.

  24. Dockerfile 작성

     

    FROM openjdk:11-jre-slim-buster
    ARG JAR_FILE=build/libs/*.jar
    COPY ${JAR_FILE} app.jar
    ENTRYPOINT ["java","-jar","/app.jar"]

     

  25. 젠킨스 item 생성 :파이프라인

  26. 파이프라인 설정

  • 파이프라인 충돌 방지 옵션 체크

  • 스크립트 작성

pipeline {
    agent any
    stages {
        stage('Checkout') {
            steps {
                git branch: '원하는 브랜치명', url: '본인의 깃 레파지토리 URL(.git으로 끝나는링크)'
            }
        }
        stage('Build') {
            steps {
                sh './gradlew build'
            }
        }
        stage('Dockerize') {
            steps {
                sh '''
                    docker stop my_container_name || true
                    docker rm my_container_name || true
                    docker rmi my_image_name || true
                    docker build -t my_image_name .
                '''
            }
        }
        stage('Deploy') {
            steps {
                sh 'docker run -d --name my_container_name -p 8080:8080 my_image_name'
            }
        }
    }
}
  1. 도커 허브에 회원가입

  2. 도커 로그인

  3. 젠킨스 build 부분 수정

./gradlew clean build
echo " Execute shell start"

# 도커 빌드와 개시 삭제
sudo docker build --no-cache -t cova1256/dev .

# 기존 서버에 있는 컨테이너 중지
sudo docker stop spring-container || true

#기존 서버에 있는 컨테이너 삭제
sudo docker rm -f spring-container || true

# 도커 로그인
sudo docker login -u cova1256 -p password 입력

# 도커 이미지 태그 설정 및 태그가 없다면 오류가 발생해도 넘어가도록 true 처리
sudo docker image tag dev cova1256/dev || true

# 도커 허브에 나의 레포지토리에 도커 푸시
sudo docker push cova1256/dev

# 푸시 후 빌드한 이미지 삭제
sudo docker rmi -f cova1256/dev || true

echo " Execute shell end"
  1. 빌드 후 조치

echo " 빌드 후 조치 start"

# 기존에 있는 이미지를 삭제합니다.
sudo docker rmi -f cova1256/dev || true

# 기존에 있는 컨테이너를 중지합니다.
sudo docker stop spring-container || true

# 기존에 있는 컨테이너를 삭제합니다.
sudo docker rm -f spring-container || true

# 컨테이너를 설치하고 실행합니다.
sudo docker run -d -p 8080:8080 --name spring-container cova1256/dev

# none인 이미지 삭제
sudo docker rmi $(docker images -q -f dangling=true)

echo " 빌드 후 조치 end"

 

질문 1 : 제가 진행했던 진행하려고 정리하는 방식이 맞나요?

질문 2 : 저는 현재 EC2 외부에서 환경변수를 사용하는 방법을 사용했는데 Docker에서 외부 설정 파일 주입할 수도 있다고 하던데 Docker을 사용할 때는 후자의 방법을 선택해야 하나요?

질문 3 : 저 에러는 어떻게 고칠 수 있을 까요? 찾아보니 권한을 줘야한다고 해서 주었고 git이나 젠킨스에 모두 넣었는데...

답변 1

1

안녕하세요, 인프런 AI 인턴입니다.

유요한님, 젠킨스와 도커를 사용한 배포 과정에서 발생한 문제를 해결하는 데 도움이 되고자 답변 드립니다.

질문 1 관련 답변:
주신 진행 순서는 Jenkins를 이용한 CI/CD 파이프라인을 구성하고 Docker를 사용하여 Spring Boot 애플리케이션을 빌드 및 배포하는 표준적인 방식으로 보입니다. 각 단계는 합리적이며, 젠킨스를 이용해 자동화된 배포 프로세스를 구축하려는 목적에 맞게 잘 정리된 것으로 판단됩니다. SSH 설정과 Jenkinsfile 스크립트를 이용한 단계별 작업 정의도 적절합니다.

질문 2 관련 답변:
Docker를 사용할 때 외부 설정 파일을 주입하는 방법은 다양하며, 사용하시는 방식은 상황에 따라 달라질 수 있습니다. Docker에서는 환경변수를 컨테이너 내부에 주입하는 방식을 자주 사용하는데, 이는 docker run 명령어에서 -e 옵션을 사용하거나 env_file 옵션을 통해 파일에서 환경변수를 불러올 수 있습니다. 예를 들어, docker run -e VAR_NAME=value 또는 docker run --env-file /path/to/env_file과 같은 방식으로 할 수 있습니다. 위 과정에서도 설정 파일을 통한 변수 주입 방식은 추후 유지 보수성과 보안 측면에서 좀 더 안전하며, 버전 관리를 통해 더 나은 구성 관리가 가능합니다.

질문 3 관련 답변:
에러 메시지를 보면 SSH private key가 유효하지 않다고 나와 있습니다. 이 문제는 주로 젠킨스 서버에서 사용하는 비공개 키(private key)와 등록된 공개 키(public key)가 일치하지 않을 때 발생합니다. 해결 방법으로는 다음을 시도해볼 수 있습니다:

  1. 젠킨스에 등록한 SSH private key가 정확한지 확인합니다. 형식이 올바르게 입력되었는지 그리고 전체 키가 올바르게 복사되었는지 확인하세요.
  2. jenkins ALL=(ALL) NOPASSWD: ALL이 추가된 파일이 sudoers 파일인지 (/etc/sudoers), 잘못된 파일이 아닌지 확인합니다. 이 변경은 시스템 전체에 영향을 미치므로 주의깊게 다루어야 하며, 잘못 수정 시 시스템 보안에 심각한 문제를 일으킬 수 있습니다.
  3. SSH 키를 생성하고 관리하는 과정에서 권한 설정에 문제가 없는지 확인합니다. .ssh 디렉터리와 키 파일들의 권한이 적절하게 구성되어 있는지 확인하세요.

정확한 에러 상황 파악과 해결을 위해 해당 젠킨스 플러그인 문서 또는 환경 설정 가이드를 참고하시는 것이 좋겠습니다. 관련해서는 아래 Spring Boot Reference Documentation에 Docker에 관련된 내용도 있으니 참고하실 수 있습니다:
- Docker 관련 요구사항: Spring Boot Reference Documentation

SSH 설정과 관련한 명령어 실습이 필요하시면 AWS나 Linux 관련 문서를 찾아보시는 것이 좋겠습니다. Jenkins에서 SSH를 다루는 방법에 대해 더 알아보신다면, Jenkins 공식 문서나 커뮤니티에서 제공하는 안내를 검토해보세요.

도움이 되셨길 바라며, 추가적인 질문이 있으시면 언제든지 문의해주세요.