[Onboarding] 2주차 - Monitoring, Git

이준석·2023년 12월 11일
0

Onboarding

목록 보기
2/4

Monitoring

Dockerfile 수정

systemctl과 cron을 사용하기 위한 Dockerfile 수정

 vi Dockerfile
FROM ubuntu:20.04

ENV TZ Asia/Seoul
ENV PYTHONIOENCODING UTF-8
ENV LC_CTYPE C.UTF-8

RUN touch /etc/default/locale

RUN echo 'export TEST=LJS' >> ~/.bashrc

RUN apt-get update && \
    apt-get install -y curl wget cron unzip vim software-properties-common

RUN add-apt-repository ppa:deadsnakes/ppa && \
    apt-get update && \
    apt-get install -y python3.7

RUN apt-get install -qq -y init systemd

RUN curl "https://d1vvhvl2y92vvt.cloudfront.net/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
    unzip awscliv2.zip && \
    ./aws/install && \
    rm awscliv2.zip && \
    rm -rf aws

RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1

RUN apt-get install -y fontconfig openjdk-17-jre

RUN wget -O /usr/share/keyrings/jenkins-keyring.asc \
    https://pkg.jenkins.io/debian/jenkins.io-2023.key

RUN echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
    https://pkg.jenkins.io/debian binary/ | tee \
    /etc/apt/sources.list.d/jenkins.list > /dev/null

RUN echo "Acquire::Check-Valid-Until \"false\";\nAcquire::Check-Date \"false\";" | cat > /etc/apt/apt.conf.d/10no--check-valid-until

RUN apt-get update && \
    apt-get install -y jenkins

COPY run_check_jenkins.sh /run_check_jenkins.sh

RUN chmod +x /run_check_jenkins.sh

RUN echo "*/5 * * * * /run_check_jenkins.sh >> /var/log/cron.log 2>&1" | crontab -

RUN apt-get clean && \
    rm -rf /var/lib/apt/lists/*

RUN systemctl mask systemd

CMD ["/usr/sbin/init"]

jenkins_start.sh 수정

vi jenkins_start.sh
#!/bin/bash
docker build -t jenkins .

docker run -d -p 80:8080 --privileged --name js-jenkins jenkins

sleep 20

docker exec -it js-jenkins cat /var/lib/jenkins/secrets/initialAdminPassword



Jenkins Run Check

run_check_jenkins.sh 생성

vi run_check_jenkins.sh
#!/bin/bash

jenkins_war="/usr/share/java/jenkins.war"

count=$(ps -ef | grep "$jenkins_war" | grep -v grep | wc -l)

if [ "$count" -eq 0 ]; then
    systemctl restart jenkins
	echo "jenkins is restart."
else
    echo "jenkins is already running."
fi



Webhook URL 추가

페이지 접속

https://api.slack.com/

Webhook App 생성

run_check_jenkins.sh에 Webhook 추가

vi run_check_jenkins.sh
#!/bin/bash

export LANG=ko_KR.UTF-8
export LC_ALL=ko_KR.UTF-8

jenkins_war="/usr/share/java/jenkins.war"

count=$(ps -ef | grep "$jenkins_war" | grep -v grep | wc -l)

webhook_url="https://hooks.slack.com/services/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"

get_jenkins_status() {
    if [ "$count" -eq 0 ]; then
        echo "중지"
    else
        echo "실행 중"
    fi
}

timestamp=$(TZ='Asia/Seoul' date +'%Y년 %m월 %d일 %H시 %M분 %S초')

if [ "$count" -eq 0 ]; then
    systemctl restart jenkins
    action_message="젠킨스를 재시작합니다."
else
    action_message="젠킨스가 실행 중입니다."
fi

curl -X POST -H "Content-Type: application/json" -d "{
    \"text\": \"\",
    \"attachments\": [
        {
            \"color\": \"#36a64f\",
            \"pretext\": \"*제목: 젠킨스 상태 확인*\",
            \"fields\": [
                {
                    \"title\": \"상태\",
                    \"value\": \"$(get_jenkins_status)\",
                    \"short\": true
                },
                {
                    \"title\": \"시간\",
                    \"value\": \"$timestamp\",
                    \"short\": true
                },
                {
                    \"title\": \"메시지\",
                    \"value\": \"$action_message\",
                    \"short\": true
                }
            ]
        }
    ]
}" "$webhook_url"

Slack 확인




Git

컨테이너 내 Docker 설치

Dockerfile에서 도커 설치 명령어 추가

vi Dockerfile
FROM ubuntu:20.04

ENV TZ Asia/Seoul
ENV PYTHONIOENCODING UTF-8
ENV LC_CTYPE C.UTF-8

RUN touch /etc/default/locale

RUN echo 'export TEST=LJS' >> ~/.bashrc

RUN apt-get update && \
    apt-get install -y curl wget cron unzip vim software-properties-common

RUN add-apt-repository ppa:deadsnakes/ppa && \
    apt-get update && \
    apt-get install -y python3.7

RUN apt-get install -qq -y init systemd

RUN curl "https://d1vvhvl2y92vvt.cloudfront.net/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
    unzip awscliv2.zip && \
    ./aws/install && \
    rm awscliv2.zip && \
    rm -rf aws

RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1

RUN apt-get install -y fontconfig openjdk-17-jre

RUN wget -O /usr/share/keyrings/jenkins-keyring.asc \
    https://pkg.jenkins.io/debian/jenkins.io-2023.key

RUN echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
    https://pkg.jenkins.io/debian binary/ | tee \
    /etc/apt/sources.list.d/jenkins.list > /dev/null

RUN echo "Acquire::Check-Valid-Until \"false\";\nAcquire::Check-Date \"false\";" | cat > /etc/apt/apt.conf.d/10no--check-valid-until

RUN apt-get update && \
    apt-get install -y jenkins

COPY run_check_jenkins.sh /run_check_jenkins.sh

RUN chmod +x /run_check_jenkins.sh

RUN echo "*/5 * * * * /run_check_jenkins.sh >> /var/log/cron.log 2>&1" | crontab -

RUN curl -s https://get.docker.com | sh

RUN usermod -aG docker jenkins

RUN apt-get clean && \
    rm -rf /var/lib/apt/lists/*

RUN systemctl mask systemd

CMD ["/usr/sbin/init"]



Git-Jenkins 연동

GitHub Token 발급

Jenkins에 GitHub Token 추가

Jenkins Pipeline 생성

  • 트리거를 GitHub hook으로 설정

  • GitHub Repository에 Webhook 추가

  • SCM을 GitHub Repository와 위에서 생성한 Credentials로 설정




Jenkinsfile 작성

  • Jenkins의 빌드 넘버와 latest 태그로 빌드

  • Docker Hub에 정상적으로 저장되면 모든 이미지 삭제

    pipeline {
       agent any
    
       environment {
           DOCKER_USERNAME = credentials('username')
           DOCKER_PASSWORD = credentials('password')
       }
    
       stages {
           stage('Build Docker Image') {
               steps {
                   script {
                       withCredentials([string(credentialsId: 'username', variable: 'DOCKER_USERNAME'),
                                        string(credentialsId: 'password', variable: 'DOCKER_PASSWORD')]) {
                           sh "docker build -t $DOCKER_USERNAME/jenkins:${currentBuild.number} ."
                           sh "docker build -t $DOCKER_USERNAME/jenkins:latest ."
                       }
                   }
               }
           }
    
           stage('Docker Login') {
               steps {
                   script {
                       withCredentials([string(credentialsId: 'username', variable: 'DOCKER_USERNAME'),
                                        string(credentialsId: 'password', variable: 'DOCKER_PASSWORD')]) {
                           sh 'docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD'
                       }
                   }
               }
           }
    
           stage('Docker Push') {
               steps {
                   script {
                       withCredentials([string(credentialsId: 'username', variable: 'DOCKER_USERNAME'),
                                        string(credentialsId: 'password', variable: 'DOCKER_PASSWORD')]) {
                           sh "docker push $DOCKER_USERNAME/jenkins:${currentBuild.number}"
                           sh 'docker push $DOCKER_USERNAME/jenkins:latest'
                       }
                   }
               }
           }
       }
    
       post {
           success {
               script {
                   sh 'docker rmi $(docker images -q)'
               }
               echo 'Docker image build, login, push, and local image cleanup successful!'
           }
    
           failure {
               echo 'One or more stages failed. Check the logs for details.'
           }
       }
    }



Credential 추가

  • Jenkinsfile에서 변수로 사용할 Credential 추가



Jenkins 빌드 결과 확인

  • 빌드 상황 확인
  • Docker Hub 확인

0개의 댓글