AWS IoT Core 테스트를 위해 cloud9을 바탕으로 디바이스 설정하는 것보다 가상머신으로 디바이스를 만들어서 테스트 하는게 보다 정확할 것 같았다. 해당 테스트를 진행하다 생긴 문제를 해결하기 위해 공유 폴더 사용을 했다.

  • 문제: IoT Core에서 연결 키트를 받았을 때 해당 연결 키트 다운로드하면 로컬 PC에 저장하게 됨. 이를 가상머신에 공유를 해야하는데 바로 되진 않음
  • 해결: 공유 폴더를 활용해 로컬 PC의 폴더를 가상머신과 연결해 사용하자!

[테스트 환경]

  • VirtualBox: 7.0.10 ver
    • Ubuntu: ubuntu 22.04.3-desktop-amd64.iso
    • VBoxGuestAdditions_7.0.10.iso

 

가상 머신 생성

원하는 이름과 ISO Image를 넣어준다. 나는 ubuntu로 진행함!

user도 원하는대로~

내가 사용하는 ubuntu image 버전에 맞춰 기본 메모리의 경우 4GB 이상, CPU는 2 ~ 4개를 추천한다.

디스크 사이즈의 경우 25GB 이상으로 해야 해당 iso image가 설치되고 커널 패닉 오류가 생기지 않는다.

만들면 자동으로 가상 머신이 실행된다.

 

공유 폴더 생성 및 연결

원하는 이름으로 로컬 PC에 폴더를 생성한다.

해당 폴더의 속성에 들어간다.

속성의 공유 탭에서 고급 공유 → 권한 클릭

위 이미지와 같이 모든 권한을 허용해주고 확인 클릭 → 이후에 다 확인해서 폴더 공유를 완료하면 된다.

 

다시 가상머신으로 돌아와서

가상머신의 설정에서 공유 폴더 → 폴더 추가 → 위와 같이 설정해주면 된다. (설정이 끝나면 확인을 눌러 적용 시킨다.)

마운트 지점도 원하는대로 설정해준다.(나는 /home/realyun/iot/)

 

(미리 VBoxGuestAdditions_7.0.10.iso 이 친구를 다운받아서 설치를 해줘야한다!)

 

머신 내부 안 설정에서 Sharing 허용도 해줘야한다. 원하는 폴더로 지정해서 해도 좋다! (나는 iot 폴더로 지정했다..)

게스트 확장 CD 이미지 삽입을 클릭해준다.

(만약 위 이미지 처럼 메뉴가 보이지 않는다면 호스트키+C 를 누르면 된다. 호스트키는 나는 ctrl+alt로 설정한 상태!)

폴더에서 위와 같이 autorun.sh 파일을 우클릭하고 실행시켜준다.

 

공유된 폴더가 나타나도 접근 권한이 없다고 뜬다.

터미널 창에서 아래 명령어를 입력해준다.

sudo gpasswd -a <user-id> vboxsf

입력 후 reboot 진행한 뒤에 폴더에 접근이 가능해진다.

이제 원하는 파일을 생성하면 로컬 PC에도, 가상머신에도 적용된다!

'Computer Science > Operating System' 카테고리의 다른 글

[Linux] CentOS 교육 -3  (0) 2022.10.26
[Linux] CentOS 교육 -2  (0) 2022.10.26
[Linux] CentOS 교육 -1  (0) 2022.10.24
[개념] File System 2(Implementation)  (0) 2021.08.12
[개념] File System 1  (0) 2021.08.12

미리 AWS 환경은 세팅해둔 상태! (external alb - web(ec2) - was(ec2))

직접 apache와 tomcat을 올려보기 위한 작업을 할 것이다...

 

왜 web - was 분리 구성을 하는가?

https://hwanchang.tistory.com/5


WEB 서버 구성(Apache)

  • Apache 설치 및 시작
yum install -y httpd
systemctl start httpd
  • alb 의 target group 상태검사 경로 변경 

  • index.html 생성
cd /var/www/html
vi index.html

# index.html
<html>
<body>WEB-A 서버입니다.</body>
</html>
  • health check: alb dns 주소를 통해 확인

  • health check: curl 명령어 활용

 

WAS 서버 구성(Tomcat)

  • java 다운로드 & tomcat 다운로드

https://www.oracle.com/java/technologies/downloads/

https://tomcat.apache.org/에서 다운로드

tar xvzf <파일명>
cp -R <디렉토리명> /usr/local/src
  • tomcat, jdk 경로 설정
vi /etc/profile

# 경로 확인
source /etc/profile
echo $JAVA_HOME
echo $CATALINA_HOME

  • tomcat 서비스 등록
cd /etc/init.d
vi tomcat

# tomcat file
#!/bin/bash
# Startup script for the Tomcat Server
# chkconfig : 345 50 50
# description: Tomcat is a Web application server.
# processname : java
# directory :
CATALINA_HOME=/usr/local/src/apache-tomcat-10.1.11
export JAVA_HOME=/usr/local/src/jdk-17.0.8
export CATALINA_HOME=/usr/local/src/apache-tomcat-10.1.11
case "$1" in
start)
echo "Starting tomcat: "
$CATALINA_HOME/bin/startup.sh
;;
stop)
echo "Shutting down tomcat: "
$CATALINA_HOME/bin/shutdown.sh
;;
restart)
echo "Restarting tomcat: "
$CATALINA_HOME/bin/shutdown.sh
$CATALINA_HOME/bin/startup.sh
;;
*)
echo "Usage: service tomcat"
start|stop|restart
exit 1
esac
exit 0

chmod 755 tomcat
service tomcat start

  • EC2 SG에 8080 포트 오픈
  • WAS 서버 index.html 생성
cd /usr/local/src/apache-tomcat-10.1.11/webapps/ROOT
vi index.html

# index.html
<html>
<body>WAS-A 서버입니다.</body>
</html>

 

WEB 서버 - WAS 서버 연동

  • WEB 서버 내부에 httpd.conf 파일 수정
vi /etc/httpd/conf/httpd.conf

###New Configuration
<VirtualHost *:80>
    ServerName <alb-dns주소>

    ProxyPass / http://<was-ip>:8080/
    ProxyPassReverse / http://<was-ip>:8080/
</VirtualHost>

systemctl restart httpd.service
  • WAS 서버
cd /usr/local/src/tomcat/bin
./shutdown.sh
./startup.sh
  • alb dns 접속 시 WAS 화면이 뜨면 성공 

 

 

참고: https://sweetysnail1011.tistory.com/57

 

❗java 다운받을 때 프로세서 확인 꼭 하기 uname -i 명령어 활용❗

'Computer Science > DevOps' 카테고리의 다른 글

[Jenkins] 다양한 플러그인 활용  (0) 2023.07.24
[Jenkins] Jenkins Pipeline 구축  (0) 2023.07.03
[Jenkins] Jenkins 다뤄보기  (0) 2023.06.27
[OS] OS 모음집  (0) 2021.08.12
[CI/CD] Tool  (0) 2021.08.11

Slack 연결

  • 목적: ChatOps
  • slack 채널 생성(무료플랜)

  • Jenkins Plugin 설치

slack notification 플러그인 설치

  • slack 앱 추가

Jenkins CI 추가

  • Jenkins에 slack 연결

자격 증명 추가(secret text로)
slack 자격증명 확인

  • 연결 확인

저장 후 빌드 시작
알림 확인

# Jenkinsfile

node {

  // job
  try {
    stage('build') {
      println('so far so good...')
    }
    stage('test') {
      println('A test has failed!')
      sh 'exit 1'
    }
  } catch(e) {
    // mark build as failed
    currentBuild.result = "FAILURE";

    // send slack notification
    slackSend (color: '#FF0000', message: "FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")

    // throw the error
    throw e;
  }
}

Sonarqube 연결

  • docker-compose 활용하여 Sonarqube 설치
mkdir jenkins 
cd jenkins
vi docker-compse.yml
  
# docker compose 설치
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

docker-compse up -d
#docker-compose.yml
version: '2'
services:
  jenkins:
    image: jenkins-docker:latest
    ports:
      - "8080:8080"
      - "50000:50000"
    networks:
      - jenkins
    volumes:
      - /var/jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
  postgres:
    image: postgres:9.6
    networks:
      - jenkins
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonarpasswd
    volumes:
      - /var/postgres-data:/var/lib/postgresql/data
  sonarqube:
    image: sonarqube:lts
    ports:
      - "9000:9000"
      - "9092:9092"
    networks:
      - jenkins
    environment:
      SONARQUBE_JDBC_USERNAME: sonar
      SONARQUBE_JDBC_PASSWORD: sonarpasswd
      SONARQUBE_JDBC_URL: "jdbc:postgresql://postgres:5432/sonar"
    depends_on:
      - postgres

networks:
  jenkins:
  • 인스턴스 9000번 포트 열어주고 확인해보자 (소나큐브 설치 완료되었는지 확인)

  • Jenkins pipeline을 통해 Sonarqube 통합
  • Sonarqube Scanner for Jenkins 플러그인 설치
    • 이후 Jenkinsfile에 코드 넣어두면 된다! (sonar-scanner 부분)
node {
    def myGradleContainer = docker.image('gradle:jdk8-alpine')
    myGradleContainer.pull()

    stage('prep') {
        git url: 'https://github.com/wardviaene/gs-gradle.git'
    }

    stage('build') {
      myGradleContainer.inside("-v ${env.HOME}/.gradle:/home/gradle/.gradle") {
        sh 'cd complete && /opt/gradle/bin/gradle build'
      }
    }

    stage('sonar-scanner') {
      def sonarqubeScannerHome = tool name: 'sonar', type: 'hudson.plugins.sonar.SonarRunnerInstallation'
      withCredentials([string(credentialsId: 'sonar', variable: 'sonarLogin')]) {
        sh "${sonarqubeScannerHome}/bin/sonar-scanner -e -Dsonar.host.url=http://sonarqube:9000 -Dsonar.login=${sonarLogin} -Dsonar.projectName=gs-gradle -Dsonar.projectVersion=${env.BUILD_NUMBER} -Dsonar.projectKey=GS -Dsonar.sources=complete/src/main/ -Dsonar.tests=complete/src/test/ -Dsonar.language=java -Dsonar.java.binaries=."
      }
    }
}

 

'Computer Science > DevOps' 카테고리의 다른 글

[AWS] WEB - WAS 구성 (Apache - Tomcat)  (0) 2023.07.27
[Jenkins] Jenkins Pipeline 구축  (0) 2023.07.03
[Jenkins] Jenkins 다뤄보기  (0) 2023.06.27
[OS] OS 모음집  (0) 2021.08.12
[CI/CD] Tool  (0) 2021.08.11

Jenkins 구축 관련해서 아래의 블로그를 참고!

https://realyun99.tistory.com/199


Jekins Pipeline

  • Jenkins를 사용하여 CD Pipeline 을 구현하고 통합하는 것을 지원하는 플러그인의 집합
  • Pipeline DSL 구문을 통해 코드로 전송 파이프라인을 모델링하기 위한 확장 가능한 자동화 서버를 갖추고 있음
  • Jenkinsfile 소스에 해당 내용을 넣고 경로를 보여주면 됨
  • Pipeline에 대한 자세한 내용은 해당 블로그를 참고하면 좋을 듯 싶다!

Jenkins Pipeline 프로젝트 생성

  • project configure

https://github.com/wardviaene/docker-demo 를 내 github으로 fork
해당 docker.build안 docker 주소 본인 환경에 맞게 변경

  • 지금 빌드 클릭

dockerhub 레포지토리에도 이미지 올라간 것을 볼 수 있음!


Docker Pipeline 프로젝트 생성

  • docker pipeline plugin 설치 후 프로젝트 생성

  • project configure

물론 해당 젠킨스 파일 또 잘 수정해야함...

  • 지금 빌드 클릭

dockerhub 에 올라옴!


위의 단계들을 진행하면서 제일 중요한건 Jenkinsfile안의 코드다! 두 프로젝트의 차이점도 Jenkinsfile 밖에 없다.

해당 파일들의 내용을 파헤쳐보자.

 

Jenkinsfile: Jenkins Pipeline ver

node {
   def commit_id
   stage('Preparation') {
     checkout scm
     sh "git rev-parse --short HEAD > .git/commit-id"                        
     commit_id = readFile('.git/commit-id').trim()
   }
   stage('test') {
     nodejs(nodeJSInstallationName: 'nodejs') {
       sh 'npm install --only=dev'
       sh 'npm test'
     }
   }
   stage('docker build/push') {
     docker.withRegistry('https://index.docker.io/v2/', 'dockerhub') {
       def app = docker.build("realyun99/docker-nodejs-demo:${commit_id}", '.').push()
     }
   }
}

Jenkinsfile.v2: Docker Pipeline ver

node {
   def commit_id
   stage('Preparation') {
     checkout scm
     sh "git rev-parse --short HEAD > .git/commit-id"
     commit_id = readFile('.git/commit-id').trim()
   }
   stage('test') {
     def myTestContainer = docker.image('node:16')
     myTestContainer.pull()
     myTestContainer.inside {
       sh 'npm install --only=dev'
       sh 'npm test'
     }
   }
   stage('test with a DB') {
     def mysql = docker.image('mysql').run("-e MYSQL_ALLOW_EMPTY_PASSWORD=yes") 
     def myTestContainer = docker.image('node:16')
     myTestContainer.pull()
     myTestContainer.inside("--link ${mysql.id}:mysql") { // using linking, mysql will be available at host: mysql, port: 3306
          sh 'npm install --only=dev' 
          sh 'npm test'                     
     }                                   
     mysql.stop()
   }                                     
   stage('docker build/push') {            
     docker.withRegistry('https://index.docker.io/v2/', 'dockerhub') {
       def app = docker.build("realyun99/docker-nodejs-demo:${commit_id}", '.').push()
     }                                     
   }                                       
}

 

  • test 단계에서 docker 이미지를 당겨와서 사용할 수 있다 → jenkins configure에서 따로 설정해줄 필요가 없다!
    • 즉 nodejs를 jenkins 컨테이너가 아닌 옆에 새 컨테이너를 생성하고 해당 커멘드들을 실행하게 된다.
    • 커멘드 실행이 끝나면 컨테이너는 폐기되고 다음 단계로 넘어간다.

 

 

❗ 원하는대로 컨테이너 생성해서 이미지 올리는 등의 코드를 작성하고 싶으면 Docker Pipeline이 유용할 듯 싶다? ❗

'Computer Science > DevOps' 카테고리의 다른 글

[AWS] WEB - WAS 구성 (Apache - Tomcat)  (0) 2023.07.27
[Jenkins] 다양한 플러그인 활용  (0) 2023.07.24
[Jenkins] Jenkins 다뤄보기  (0) 2023.06.27
[OS] OS 모음집  (0) 2021.08.12
[CI/CD] Tool  (0) 2021.08.11

Jenkins란

  • 모든 언어의 조합과 소스 코드 레포지토리에 대한 CI/CD 환경을 구축하기 위한 도구
    • 빌드: 서버에 올릴 수 있는 상태로 만드는 것
    • 배포: 서버에 올려 사용자가 사용할 수 있게 하는 것
  • 기능: 컴파일 오류 검출, 자동화 테스트 수행, 정적 코드 분석으로 인한 코딩 규약 준수 여부 체크, 성능 변화 감시 등..

 EC2에 Jenkins 설치

#!/bin/bash

# this script is only tested on ubuntu focal 20.04 (LTS)

# install docker
sudo apt-get update
sudo apt-get install -y \
    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-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
systemctl enable docker
systemctl start docker
usermod -aG docker ubuntu

# run jenkins
mkdir -p /var/jenkins_home
chown -R 1000:1000 /var/jenkins_home/
docker run -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -d --name jenkins jenkins/jenkins:lts

# show endpoint
echo 'Jenkins installed'
echo 'You should now be able to access jenkins at: http://'$(curl -4 -s ifconfig.co)':8080'
  • http://<EC2-ip>:8080 접속해서 Jenkins 들어가면 됨...

Jenkins 프로젝트(nodejs) 빌드 테스트

  • 원하는 프로젝트 이름 설정

  • 소스코드 추가 - git 주소 적으면 됨

  • 빌드 스텝 추가

  • NodeJS 설정을 위한 Jenkins 관리 - Tools 설정

  • 빌드 환경 설정

  • 지금 빌드 클릭

[확인]


Docker로 애플리케이션 배포 

  • Jenkins Plugin: CloudBees Docker Build and Publish 설치
  • Jenkins Docker: Jenkins 컨테이너가 Docker API와 통신할 수 있는 Docker socket에 접근할 수 있게..
# Dockerfile
FROM jenkins/jenkins:lts
USER root

RUN mkdir -p /tmp/download && \
 curl -L https://download.docker.com/linux/static/stable/x86_64/docker-18.03.1-ce.tgz | tar -xz -C /tmp/download && \
 rm -rf /tmp/download/docker/dockerd && \
 mv /tmp/download/docker/docker* /usr/local/bin/ && \
 rm -rf /tmp/download && \
 groupadd -g <998> docker && \
 usermod -aG staff,docker jenkins

USER jenkins
# groupadd 의 숫자는 cat /etc/group | grep docker 로 확인
# git clone 
cd jenkins-docker
docker build -t jenkins-docker .

docker stop jenkins # 기존의 jenkins 종료
docker rm jenkins

docker run -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock --name jenkins -d jenkins-docker
docker exec -it jenkins bash
  • docker repository 생성

  • build step 추가

  • 지금 빌드 클릭

[해당 환경 테스트]

docker pull realyun99/docker-nodejs-demo
docker run -p 3000:3000 -d --name my-nodejs-app realyun99/docker-nodejs-demo
# EC2 보안그룹 포트도 열어주기!(3000)

 

'Computer Science > DevOps' 카테고리의 다른 글

[Jenkins] 다양한 플러그인 활용  (0) 2023.07.24
[Jenkins] Jenkins Pipeline 구축  (0) 2023.07.03
[OS] OS 모음집  (0) 2021.08.12
[CI/CD] Tool  (0) 2021.08.11
[CI/CD] 정의  (0) 2021.08.11

+ Recent posts