3 minute read

일지

특이 사항 없음

오늘의 할일

  • 220609 TIL 작성
  • AWS 스터디
  • 아마도 가능하다면 멘토링..?

주요 키워드

CI/CD

  • Tomcat Serv.에 .war App 배포
  • Jenkins활용, Docker 컨테이너 환경 사용

공부 정리

Tomcat Server를 사용한 WAR 어플리케이션 배포

  1. Tomcat EC2 인스턴스 생성 및 SSH 연결

  2. java jdk 설치
    • sudo apt update
    • sudo apt install openjdk-11-jdk
    • java –version
  3. Java 환경 구성
    • ~/.bashrc 파일 수정
       ...
       JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
       PATH=$PATH:$JAVA_HOME
      
  4. 쉘 설정 다시 로드
    • exec bash
    • echo $JAVA_HOME
    • echo $PATH
  5. Tomcat 및 Tomcat admin 설치
    • sudo apt -y install tomcat9 tomcat9-admin
    • sudo systemctl status tomcat9.service
  6. /etc/tomcat9/tomcat-users.xml 수정
  ... 
    <role rolename="manager-gui"/>
    <role rolename="manager-script"/>
    <role rolename="manager-jmx"/>
    <role rolename="manager-status"/>
    <user username="admin" password="admin" roles="manager-gui, manager-script, manager-jmx, manager-status"/>
    <user username="deployer" password="deployer" roles="manager-script"/>
    <user username="tomcat" password="tomcat" roles="manager-gui"/>
  </tomcat-users>
  1. 사용자 설정을 반영하기 위하여 tomcat9 서비스 재시작
    • sudo systemctl restart tomcat9.service
    • sudo systemctl is-active tomcat9.service
  2. 배포 작업 설정을 위한 Jenkins 플러그인 설치
    • deploy to container
  3. github repository, maven을 사용하여 빌드 및 tomcat 배포 작업 생성
    • jenkins 메뉴에서 새로운 item - Maven 프로젝트
    • deploy-to-tomcat - 소스코드 관리
    • github
      • repository: 자신의 github 레포지토리 주소
      • (선택)credential: 앞에서 생성한 credential 사용
    • 빌드
      • Root POM: pom.xml
      • Goals and options: clean install
    • 빌드 후 조치
      • deploy war/ear to container
        • WAR/EAR file : */.war (프로젝트 디렉토리 내 .war파일 지정)
        • Container: tomcat 9.x remote
          • Credential: deployer/deployer (새로 생성)
          • tomcat url: http://192.168.56.102:8080
  4. 배포 확인
    • jenkins 작업디렉토리(/var/lib/jenkins/workspace)
    • Tomcat 관리자 페이지
    • http://:8080/manager - 배포된 Tomcat 어플리케이션
    • http://:8080/webapp
  5. 컨텐츠 업데이트 후 갱신된 컨텐츠를 사용한 배포 테스트
    • 기존 컨텐츠 수정
    • /home/ubuntu/source-java-maven-hello-world/webapp/src/main/webapp/index.jsp
      <h1> Hello World </h1>
      <h2> Tomcat Deploy Test </h2>
      
          - github 소스 업데이트 적용
      
    • git commit -m “index.jsp modified(Tomcat)”
    • git push origin master - 앞 단계에서 생성한 jenkins 작업 재실행(Build Now) - Tomcat 페이지 접속하여 결과 확인 (http://:8080/webapp)

Jenkins를 사용한 Docker 컨테이너 환경 사용

  1. EC2 인스턴스 생성
    • 이름: Docker
    • IP: 192.168.56.103
  2. 인스턴스 연결 후 Docker 설치
    • sudo apt update
    • sudo apt -y install apt-transport-https ca-certificates curl gnupg lsb-release
    • curl -fsSL https://download.docker.com/linux/ubuntu/gpg sudo gpg –dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    • echo “deb [arch=$(dpkg –print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable” sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    • sudo apt update
    • sudo apt install -y docker-ce docker-ce-cli containerd.io
  3. 현재 사용자 docker 그룹 추가
    • sudo usermod -aG docker $USER
  4. jenkins에서 docker 시스템으로 빌드 결과물을 전달하기 위한 플러그인 설치
    • Publish over SSH
  5. docker VM을 ssh로 연결하기 위한 ssh 설정 및 계정 패스워드 설정
    • sudo vi /etc/ssh/sshd_config
       ...
       PasswordAuthentication yes
       ...
      
    • sudo systemctl restart ssh.service
    • sudo passwd ubuntu
    • 암호 설정
  6. jenkins 인스턴스에서 docker 인스턴스로 ssh 연결 테스트
    • ssh ubuntu@192.168.56.103
  7. ssh 연결 설정 추가
    • 메인 UI - Jenkins 관리 - 시스템 설정- Publish over SSH (가장 아래쪽)
    • SSH Servers - 추가
      • name: docker-instance
      • hostname: 192.168.56.103 (docker VM IP)
      • username: ubuntu
      • ‘고급’ 버튼 클릭
        • Use password authentication, or use a different key : 계정 패스워드 설정 추가
        • Passphrase / Password: 암호 입력
  8. github repository, maven을 사용하여 빌드 및 tomcat 배포 작업 생성
    • jenkins 메뉴에서 새로운 item - Maven 프로젝트
    • copy-war-to-docker - 소스코드 관리
    • github
      • repository: 자신의 github 레포지토리 주소
      • (선택)credential: 앞에서 생성한 credential 사용 - 빌드
    • Root POM: pom.xml
    • Goals and options: clean install - 빌드 후 조치
    • Send build artifacts over SSH
      • SSH Server: docker-instance (이전에 생성한)
      • Transfer
        • Source files: webapp/target/webapp.war
        • remove prefix: webapp/target
        • remote directory: hello-world

Docker 이미지 생성

  1. 테스트용 Dockerfile (docker vm의 사용자 홈 디렉토리에서)
      FROM tomcat:9
      COPY ./hello-world/webapp.war /usr/local/tomcat/webapps
    
  2. 빌드 실행
    • docker build -t my-hello-world:latest .
  3. 이미지를 사용한 컨테이너 테스트
    • docker run -d –name test -p 8080:8080 my-hello-world:latest
  4. 빌드된 이미지를 사용한 어플리케이션 연결 테스트
    • http://:8080/webapp

Docker 컨테이너 배포를 위한 Jenkins 통합

  1. Docker 이미지 빌드를 위한 Dockerfile을 git에 포함 (git 저장소 위치에서 실행)
    • mkdir dockerfile
    • vi dockerfile/Dockerfile
       FROM tomcat:9
       COPY ./webapp.war /usr/local/tomcat/webapps
      
    • git add .
    • git commit -m “Dockerfile added”
    • git push origin master
  2. jenkins 작업 생성
    • jenkins 메뉴에서 새로운 item - Maven 프로젝트
    • deploy-to-docker - 소스코드 관리
    • github
      • repository: 자신의 github 레포지토리 주소
      • (선택)credential: 앞에서 생성한 credential 사용 - 빌드
    • Root POM: pom.xml
    • Goals and options: clean install - 빌드 후 조치
    • Send build artifacts over SSH
      • SSH Server: docker-instance (이전에 생성한)
      • Transfer 1
        • Source files: webapp/target/webapp.war
        • remove prefix: webapp/target
        • remote directory: hello-world
      • Transfer 2
        • Source files: dockerfile/Dockerfile
        • remove prefix: dockerfile
        • remote directory: hello-world
        • exec command
          docker build -t my-hello-world:latest ~/hello-world
          docker run  -d  --name my-hello-world-container -p 8080:8080 my-hello-world:latest
          
  3. 빌드 전 docker 인스턴스 내 테스트 환경 정리
    • 실행중인 컨테이너 제거
    • docker rm -f docker ps -aq - 빌드한 이미지 제거
    • docker rmi my-hello-world:latest - 이전 빌드 시 복사된 파일 및 테스트 파일 제거
    • rm -rf ~/hello-world
    • rm -f ~/Dockerfile

Categories:

Updated:

Leave a comment