Information Security Study

240723 젠킨스 파이프라인에서 .sh 실행하기, 크론탭으로 로깅 스크립트 실행하기, 로그로테이트 구현하기 본문

네트워크 캠퍼스/NHN클라우드-Jenkins

240723 젠킨스 파이프라인에서 .sh 실행하기, 크론탭으로 로깅 스크립트 실행하기, 로그로테이트 구현하기

gayeon_ 2024. 7. 23. 17:11

젠킨스 파이프라인에서 .sh 실행하기

 

젠킨스 파이프라인에서 shell 스크립트를 작성해서 실행하면 구문이 복잡해지기 때문에

github에 shell 스크립트를 작성해 받아와서 실행하는 방식을 사용했다.

 

 

 

 

먼저 파이프라인 타입으로 아이템을 생성했다.

 

 

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo 'Building...'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing...'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying...'
            }
        }
    }
}

 

스크립트에는 위와 같은 형식으로 작성할 것이다.

 

 

 

이제 인스턴스 자원을 주기적으로 확인하고 로깅하는 셸 스크립트를 작성할 것이다.

 

 

 

cpu, 메모리, 디스크 사용량을 로깅하는 셸 스크립트이다.

이 스크립트는 /var/log/resource_usage.log 파일에 주기적으로 자원 사용량을 기록한다.

 

 

 

저장한 뒤 실행 권한을 부여했다.

 

 

 

젠킨스는 보통 jenkins 이름으로 스크립트 명령을 내리기 때문에 ubuntu 계정이 갖는 요소에는 쓰기 작업이 불가능한 경우가 있다.

그래서 jenkins로 sudo 명령을 편하게 쓸 수 있도록 visudo에서 권한을 부여했다.

 

 

 

jenkins 사용자에게 비밀번호 없이 sudo 명령을 부여하는 구문

 

 

pipeline {
    agent any

    stages {
        stage('Clone github'){
            steps {
                git 'https://github.com/계정명/레포지토리명'
                sh 'ls'
                sh 'chmod +x resource_usage.sh'
                sh 'chmod +x build.sh'
                sh 'chmod +x test.sh'
                sh 'chmod +x deploy.sh'
            }
        }
        stage('Build') {
            steps {
                echo 'Building...'
                sh './build.sh'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing...'
                sh './test.sh'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying...'
                sh './deploy.sh'
            }
        }
        stage('Logging'){
            steps {
                echo 'Logging...'
                // jenkins 계정으로는 /home/ubuntu 하위 경로에 저장 불가이므로 sudo 필요
                sh 'sudo ./resource_usage.sh'
                echo '------------- process --------------'
                // 조회시에도 jenkins 계정으로는 /home/ubuntu 하위 경로에 호출 불가이므로 sudo 필요
                sh 'sudo cat /home/ubuntu/log_test/resource_usage.log'
            }
        }
    }
}

 

깃허브 레포지토리에서 sh 파일을 받아서 실행한 뒤

로그 내역을 출력하는 파이프라인 스크립트이다.

 

빌드를 누르면 인스턴스의 /home/ubuntu/log_test/resource_usage.log 파일에 로깅이 되고

기록된 내역이 출력된다.

 

 

 

직접 powershell에서 cat으로 출력해도 동일한 결과가 출력된다.

 

 

 

젠킨스에서 console output으로 확인한 결과

 


 

크론탭으로 로깅 스크립트 실행하기

 

크론탭으로 셸 스크립트를 주기적으로 실행하도록 설정해봤다.

 

 

  1. 셸 스크립트를 작성하여 자원 사용량을 로그 파일에 기록한다.
  2. 스크립트를 실행 가능한 위치에 저장하고 실행 권한을 부여한다.
  3. 크론탭에 등록하여 스크립트를 주기적으로 실행한다.

 

 

 

 

크론탭 편집기를 연다.

 

 

 

크론탭 파일에 위와 같이 추가했다.

매 5분마다 위 경로에 있는 log_resource_usage.sh를 실행하는 구문이다.

 

 

 

저장 후 위 명령어로 변경된 크론탭을 확실히 실행시킨다.

이렇게 하면 매 5분마다 자원 사용량을 로깅할 수 있다.

 

 

크론탭 작업을 제거하는 셸 스크립트

 

작성한 뒤 실행권한을 부여한다.

 

 

 

위와 같이 실행하면 크론탭에서 특정 구문을 제거할 수 있다.

 


 

로그로테이트하기

 

로그 파일이 너무 커지면 디스크를 가득 채울 수도 있고 오래되어 불필요한 로그가 남을 수도 있다.

 

 

로그로테이트의 장점

  • 최대 크기 지정으로 파일 비대화 방지
  • 보존 기간 설정으로 오랜 로그 삭제
  • 주기적 백업을 통한 유실 방지
  • 오래된 로그 파일 압축을 통한 저장 효율화

 

 

 

먼저 해당 경로로 로그파일로 사용할 log.txt를 생성하고

권한도 부여한다.

 

 

 

셸 스크립트 작성 후 실행 권한을 부여한다.

 

 

 

그리고 로그로테이트 설정 파일을 작성해야 한다.

설정 파일은 /etc/logrotate.d/ 디렉토리에 있어야 한다.

 

 

 

  • /var/log/myapp/log.txt: 관리할 로그 파일 경로이다.
  • size 1M: 로그 파일이 1MB에 도달하면 회전한다.
  • copytruncate: 원본 파일을 비운 후 내용을 복사하여 새로운 파일을 생성한다.
  • rotate 7: 최대 7개의 로그 파일을 유지한다.
  • compress: 로그 파일을 압축한다.
  • missingok: 로그 파일이 없으면 오류를 무시한다.
  • notifempty: 로그 파일이 비어 있으면 회전하지 않는다.
  • daily: 로그 파일을 매일 회전한다.
  • create 0644 root root: 새로운 로그 파일을 생성할 때의 권한과 소유자를 설정한다.
  • olddir /var/log/myapp/old: 이전 로그 파일을 이동할 디렉토리다.

compress 옵션을 사용하면 로그 파일이 압축되어 저장된다.

 

 

 

로그로테이트 설정 테스트 명령어

테스트 모드로 설정을 검사하며 실제로 로그를 회전하지 않는다.

 

 

 

테스트모드에서 문제가 발견되지 않았다면 위 명령어로 

로그로테이트를 수동으로 실행한다.

 

 

 

위 명령어로 스크립트가 정상적으로 설정되었는지 확인할 수 있다.

 

 

 

이제 셸 스크립트를 실행한다.

실행하면 초당 100번씩 로깅되며 1MB를 초과하는 로그 파일을 자동으로 회전하고, 압축하고, 일주일 이상된 로그 파일을 삭제한다.

 

 

 

cat /var/log/myapp/log.txt

 

 

 

파일 용량을 확인하는 명령어

 

 

 

1M가 넘어가면

 

 

 

old 디렉토리에 압축파일로 로그로테이트된 로그파일이 저장된다.

그리고 다시 log.txt의 용량을 확인하면 다시 낮아진 것을 확인할 수 있다.

 

 

 

압축 옵션을 지우면 어떻게 저장되는지 확인해봤다.

 

 

 

수동으로 실행

 

 

 

압축 없이 바로 저장된 것을 확인했다.